mirror of
https://github.com/rkd77/elinks.git
synced 2025-02-02 15:09:23 -05:00
Rename the DOM tree renderer to DOM stack tracer
Use add_dom_stack_tracer(stack) to have stack activity traced. It is only active when DOM_STACK_TRACE is defined.
This commit is contained in:
parent
cb64068712
commit
9c720c2cc8
@ -355,179 +355,6 @@ add_dom_link(struct dom_renderer *renderer, unsigned char *string, int length)
|
||||
}
|
||||
|
||||
|
||||
/* DOM Tree Debug Renderer */
|
||||
|
||||
#ifdef DOM_TREE_RENDERER
|
||||
static inline unsigned char *
|
||||
compress_string(unsigned char *string, unsigned int length)
|
||||
{
|
||||
struct string buffer;
|
||||
unsigned char escape[2] = "\\";
|
||||
|
||||
if (!init_string(&buffer)) return NULL;
|
||||
|
||||
for (; length > 0; string++, length--) {
|
||||
unsigned char *bytes = string;
|
||||
|
||||
if (*string == '\n' || *string == '\r' || *string == '\t') {
|
||||
bytes = escape;
|
||||
escape[1] = *string == '\n' ? 'n'
|
||||
: (*string == '\r' ? 'r' : 't');
|
||||
}
|
||||
|
||||
add_bytes_to_string(&buffer, bytes, bytes == escape ? 2 : 1);
|
||||
}
|
||||
|
||||
return buffer.source;
|
||||
}
|
||||
|
||||
/* @codepage denotes how entity strings should be decoded. */
|
||||
static void
|
||||
set_enhanced_dom_node_value(struct dom_string *string, struct dom_node *node)
|
||||
{
|
||||
struct dom_string *value;
|
||||
|
||||
assert(node);
|
||||
|
||||
memset(string, 0, sizeof(*string));
|
||||
|
||||
switch (node->type) {
|
||||
case DOM_NODE_ENTITY_REFERENCE:
|
||||
/* XXX: The ASCII codepage is hardcoded here since we do not
|
||||
* want to depend on anything and this is really just for
|
||||
* debugging. */
|
||||
string->string = get_entity_string(node->string.string,
|
||||
node->string.length, 0);
|
||||
string->string = null_or_stracpy(string->string);
|
||||
break;
|
||||
|
||||
default:
|
||||
value = get_dom_node_value(node);
|
||||
if (!value) {
|
||||
set_dom_string(string, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
string->string = compress_string(value->string, value->length);
|
||||
}
|
||||
|
||||
string->length = string->string ? strlen(string->string) : 0;
|
||||
}
|
||||
|
||||
static unsigned char indent_string[] =
|
||||
" ";
|
||||
|
||||
#define get_indent_offset(stack) \
|
||||
((stack)->depth < sizeof(indent_string)/2 ? (stack)->depth * 2 : sizeof(indent_string))
|
||||
|
||||
static void
|
||||
render_dom_tree(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *value = &node->string;
|
||||
struct dom_string *name = get_dom_node_name(node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
name->length, name->string,
|
||||
value->length, value->string);
|
||||
}
|
||||
|
||||
static void
|
||||
render_dom_tree_id_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string value;
|
||||
struct dom_string *name;
|
||||
struct dom_string *id;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
id = get_dom_node_type_name(node->type);
|
||||
set_enhanced_dom_node_value(&value, node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s -> %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
id->length, id->string, name->length, name->string,
|
||||
value.length, value.string);
|
||||
|
||||
if (is_dom_string_set(&value))
|
||||
done_dom_string(&value);
|
||||
}
|
||||
|
||||
static void
|
||||
render_dom_tree_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *name;
|
||||
struct dom_string value;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
set_enhanced_dom_node_value(&value, node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
name->length, name->string,
|
||||
value.length, value.string);
|
||||
|
||||
if (is_dom_string_set(&value))
|
||||
done_dom_string(&value);
|
||||
}
|
||||
|
||||
static void
|
||||
render_dom_tree_branch(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *name;
|
||||
struct dom_string *id;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
id = get_dom_node_type_name(node->type);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
id->length, id->string, name->length, name->string);
|
||||
}
|
||||
|
||||
struct dom_stack_context_info dom_tree_renderer_context_info = {
|
||||
/* Object size: */ 0,
|
||||
/* Push: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ render_dom_tree_branch,
|
||||
/* DOM_NODE_ATTRIBUTE */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_TEXT */ render_dom_tree_leaf,
|
||||
/* DOM_NODE_CDATA_SECTION */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_ENTITY_REFERENCE */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_ENTITY */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_PROC_INSTRUCTION */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_COMMENT */ render_dom_tree_leaf,
|
||||
/* DOM_NODE_DOCUMENT */ render_dom_tree,
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ render_dom_tree_id_leaf,
|
||||
/* DOM_NODE_NOTATION */ render_dom_tree_id_leaf,
|
||||
},
|
||||
/* Pop: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ NULL,
|
||||
/* DOM_NODE_ATTRIBUTE */ NULL,
|
||||
/* DOM_NODE_TEXT */ NULL,
|
||||
/* DOM_NODE_CDATA_SECTION */ NULL,
|
||||
/* DOM_NODE_ENTITY_REFERENCE */ NULL,
|
||||
/* DOM_NODE_ENTITY */ NULL,
|
||||
/* DOM_NODE_PROC_INSTRUCTION */ NULL,
|
||||
/* DOM_NODE_COMMENT */ NULL,
|
||||
/* DOM_NODE_DOCUMENT */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ NULL,
|
||||
/* DOM_NODE_NOTATION */ NULL,
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* DOM_TREE_RENDERER */
|
||||
|
||||
/* DOM Source Renderer */
|
||||
|
||||
#define check_dom_node_source(renderer, str, len) \
|
||||
@ -782,11 +609,7 @@ render_dom_document(struct cache_entry *cached, struct document *document,
|
||||
|
||||
add_dom_stack_context(&parser->stack, &renderer,
|
||||
&dom_source_renderer_context_info);
|
||||
|
||||
#ifdef DOM_TREE_RENDERER
|
||||
add_dom_stack_context(&parser->stack, &renderer,
|
||||
&dom_tree_renderer_context_info);
|
||||
#endif
|
||||
add_dom_stack_tracer(&parser->stack);
|
||||
|
||||
root = parse_sgml(parser, buffer);
|
||||
done_sgml_parser(parser);
|
||||
|
@ -8,13 +8,4 @@ struct string;
|
||||
|
||||
void render_dom_document(struct cache_entry *cached, struct document *document, struct string *buffer);
|
||||
|
||||
/* Define to have debug info about the nodes added printed to the log.
|
||||
* Run as: ELINKS_LOG=/tmp/dom-dump.txt ./elinks -no-connect <url>
|
||||
* to have the debug dumped into a file. */
|
||||
/*#define DOM_TREE_RENDERER*/
|
||||
|
||||
#ifdef DOM_TREE_RENDERER
|
||||
extern struct dom_stack_context_info dom_tree_renderer_context_info;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -336,3 +336,177 @@ walk_dom_nodes(struct dom_stack *stack, struct dom_node *root)
|
||||
pop_dom_node(stack);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* DOM Stack Tracing: */
|
||||
|
||||
#ifdef DOM_STACK_TRACE
|
||||
static inline unsigned char *
|
||||
compress_string(unsigned char *string, unsigned int length)
|
||||
{
|
||||
struct string buffer;
|
||||
unsigned char escape[2] = "\\";
|
||||
|
||||
if (!init_string(&buffer)) return NULL;
|
||||
|
||||
for (; length > 0; string++, length--) {
|
||||
unsigned char *bytes = string;
|
||||
|
||||
if (*string == '\n' || *string == '\r' || *string == '\t') {
|
||||
bytes = escape;
|
||||
escape[1] = *string == '\n' ? 'n'
|
||||
: (*string == '\r' ? 'r' : 't');
|
||||
}
|
||||
|
||||
add_bytes_to_string(&buffer, bytes, bytes == escape ? 2 : 1);
|
||||
}
|
||||
|
||||
return buffer.source;
|
||||
}
|
||||
|
||||
/* @codepage denotes how entity strings should be decoded. */
|
||||
static void
|
||||
set_enhanced_dom_node_value(struct dom_string *string, struct dom_node *node)
|
||||
{
|
||||
struct dom_string *value;
|
||||
|
||||
assert(node);
|
||||
|
||||
memset(string, 0, sizeof(*string));
|
||||
|
||||
switch (node->type) {
|
||||
case DOM_NODE_ENTITY_REFERENCE:
|
||||
/* XXX: The ASCII codepage is hardcoded here since we do not
|
||||
* want to depend on anything and this is really just for
|
||||
* debugging. */
|
||||
string->string = get_entity_string(node->string.string,
|
||||
node->string.length, 0);
|
||||
string->string = null_or_stracpy(string->string);
|
||||
break;
|
||||
|
||||
default:
|
||||
value = get_dom_node_value(node);
|
||||
if (!value) {
|
||||
set_dom_string(string, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
string->string = compress_string(value->string, value->length);
|
||||
}
|
||||
|
||||
string->length = string->string ? strlen(string->string) : 0;
|
||||
}
|
||||
|
||||
static unsigned char indent_string[] =
|
||||
" ";
|
||||
|
||||
#define get_indent_offset(stack) \
|
||||
((stack)->depth < sizeof(indent_string)/2 ? (stack)->depth * 2 : sizeof(indent_string))
|
||||
|
||||
static void
|
||||
dom_stack_trace_tree(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *value = &node->string;
|
||||
struct dom_string *name = get_dom_node_name(node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
name->length, name->string,
|
||||
value->length, value->string);
|
||||
}
|
||||
|
||||
static void
|
||||
dom_stack_trace_id_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string value;
|
||||
struct dom_string *name;
|
||||
struct dom_string *id;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
id = get_dom_node_type_name(node->type);
|
||||
set_enhanced_dom_node_value(&value, node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s -> %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
id->length, id->string, name->length, name->string,
|
||||
value.length, value.string);
|
||||
|
||||
if (is_dom_string_set(&value))
|
||||
done_dom_string(&value);
|
||||
}
|
||||
|
||||
static void
|
||||
dom_stack_trace_leaf(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *name;
|
||||
struct dom_string value;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
set_enhanced_dom_node_value(&value, node);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
name->length, name->string,
|
||||
value.length, value.string);
|
||||
|
||||
if (is_dom_string_set(&value))
|
||||
done_dom_string(&value);
|
||||
}
|
||||
|
||||
static void
|
||||
dom_stack_trace_branch(struct dom_stack *stack, struct dom_node *node, void *data)
|
||||
{
|
||||
struct dom_string *name;
|
||||
struct dom_string *id;
|
||||
|
||||
assert(node);
|
||||
|
||||
name = get_dom_node_name(node);
|
||||
id = get_dom_node_type_name(node->type);
|
||||
|
||||
LOG_INFO("%.*s %.*s: %.*s",
|
||||
get_indent_offset(stack), indent_string,
|
||||
id->length, id->string, name->length, name->string);
|
||||
}
|
||||
|
||||
struct dom_stack_context_info dom_stack_trace_context_info = {
|
||||
/* Object size: */ 0,
|
||||
/* Push: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ dom_stack_trace_branch,
|
||||
/* DOM_NODE_ATTRIBUTE */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_TEXT */ dom_stack_trace_leaf,
|
||||
/* DOM_NODE_CDATA_SECTION */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_ENTITY_REFERENCE */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_ENTITY */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_PROC_INSTRUCTION */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_COMMENT */ dom_stack_trace_leaf,
|
||||
/* DOM_NODE_DOCUMENT */ dom_stack_trace,
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ dom_stack_trace_id_leaf,
|
||||
/* DOM_NODE_NOTATION */ dom_stack_trace_id_leaf,
|
||||
},
|
||||
/* Pop: */
|
||||
{
|
||||
/* */ NULL,
|
||||
/* DOM_NODE_ELEMENT */ NULL,
|
||||
/* DOM_NODE_ATTRIBUTE */ NULL,
|
||||
/* DOM_NODE_TEXT */ NULL,
|
||||
/* DOM_NODE_CDATA_SECTION */ NULL,
|
||||
/* DOM_NODE_ENTITY_REFERENCE */ NULL,
|
||||
/* DOM_NODE_ENTITY */ NULL,
|
||||
/* DOM_NODE_PROC_INSTRUCTION */ NULL,
|
||||
/* DOM_NODE_COMMENT */ NULL,
|
||||
/* DOM_NODE_DOCUMENT */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_TYPE */ NULL,
|
||||
/* DOM_NODE_DOCUMENT_FRAGMENT */ NULL,
|
||||
/* DOM_NODE_NOTATION */ NULL,
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* DOM_STACK_TRACE */
|
||||
|
@ -106,6 +106,19 @@ get_dom_stack_state_data(struct dom_stack_context *context,
|
||||
return (void *) &context->state_objects[state->depth * object_size];
|
||||
}
|
||||
|
||||
/* Define to have debug info about the nodes added printed to the log.
|
||||
* Run as: ELINKS_LOG=/tmp/dom-dump.txt ./elinks -no-connect <url>
|
||||
* to have the debug dumped into a file. */
|
||||
/*#define DOM_STACK_TRACE*/
|
||||
|
||||
#ifdef DOM_STACK_TRACE
|
||||
extern struct dom_stack_context_info dom_stack_trace_context_info;
|
||||
#define add_dom_stack_tracer(stack) \
|
||||
add_dom_stack_context(stack, NULL, &dom_stack_trace_context_info)
|
||||
#else
|
||||
#define add_dom_stack_tracer(stack) /* Nada */
|
||||
#endif
|
||||
|
||||
/* The state iterators do not include the bottom state */
|
||||
|
||||
#define foreach_dom_stack_state(stack, state, pos) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user