From 17447f074c102bdac9fdf3e1e0308c1b2e9718b6 Mon Sep 17 00:00:00 2001 From: Andrew Sidwell Date: Thu, 26 Jun 2008 18:19:49 +0000 Subject: Add namespace awareness right through the code, in preparation for handling foreign content properly. svn path=/trunk/hubbub/; revision=4457 --- src/treebuilder/after_head.c | 13 +++++++------ src/treebuilder/in_body.c | 35 ++++++++++++++++++++++++----------- src/treebuilder/in_caption.c | 4 +++- src/treebuilder/in_cell.c | 9 ++++++--- src/treebuilder/in_column_group.c | 3 ++- src/treebuilder/in_head.c | 3 ++- src/treebuilder/in_head_noscript.c | 3 ++- src/treebuilder/in_row.c | 6 ++++-- src/treebuilder/in_select.c | 13 +++++++------ src/treebuilder/in_table_body.c | 11 +++++++---- src/treebuilder/internal.h | 6 ++++-- src/treebuilder/treebuilder.c | 29 ++++++++++++++++++----------- 12 files changed, 86 insertions(+), 49 deletions(-) diff --git a/src/treebuilder/after_head.c b/src/treebuilder/after_head.c index e8d3e79..ac68dfb 100644 --- a/src/treebuilder/after_head.c +++ b/src/treebuilder/after_head.c @@ -55,27 +55,28 @@ bool handle_after_head(hubbub_treebuilder *treebuilder, } else if (type == BASE || type == LINK || type == META || type == NOFRAMES || type == SCRIPT || type == STYLE || type == TITLE) { + hubbub_ns ns; element_type otype; void *node; /** \todo parse error */ - if (!element_stack_push(treebuilder, - HEAD, + if (!element_stack_push(treebuilder, + HUBBUB_NS_HTML, + HEAD, treebuilder->context.head_element)) { /** \todo errors */ } - - /* Process as "in head" */ reprocess = process_in_head(treebuilder, token); - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, + &node)) { /** \todo errors */ } - /* No need to unref node as we never increased + /* No need to unref node as we never increased * its reference count when pushing it on the stack */ } else if (type == HEAD) { /** \todo parse error */ diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index 5196a7b..739e0c2 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -571,10 +571,12 @@ void process_dd_dt_li_in_body(hubbub_treebuilder *treebuilder, } do { + hubbub_ns ns; element_type otype; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, + &otype, &node)) { /** \todo errors */ } @@ -846,6 +848,7 @@ void process_image_in_body(hubbub_treebuilder *treebuilder, void process_input_in_body(hubbub_treebuilder *treebuilder, const hubbub_token *token) { + hubbub_ns ns; element_type otype; void *node; @@ -861,7 +864,7 @@ void process_input_in_body(hubbub_treebuilder *treebuilder, treebuilder->context.current_node].node); } - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -1111,9 +1114,11 @@ void process_0container_in_body(hubbub_treebuilder *treebuilder, close_implied_end_tags(treebuilder, UNKNOWN); do { + hubbub_ns ns; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, + &node)) { /** \todo errors */ } @@ -1144,11 +1149,12 @@ void process_0p_in_body(hubbub_treebuilder *treebuilder) /** \todo parse error */ } - while(element_in_scope(treebuilder, P, false)) { + while (element_in_scope(treebuilder, P, false)) { + hubbub_ns ns; element_type type; void *node; - if (!element_stack_pop(treebuilder, &type, &node)) { + if (!element_stack_pop(treebuilder, &ns, &type, &node)) { /** \todo errors */ } @@ -1195,9 +1201,10 @@ void process_0dd_dt_li_in_body(hubbub_treebuilder *treebuilder, close_implied_end_tags(treebuilder, type); do { + hubbub_ns ns; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -1239,9 +1246,11 @@ void process_0h_in_body(hubbub_treebuilder *treebuilder, close_implied_end_tags(treebuilder, UNKNOWN); do { + hubbub_ns ns; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, + &node)) { /** \todo errors */ } @@ -1482,14 +1491,15 @@ bool aa_find_furthest_block(hubbub_treebuilder *treebuilder, } if (fb > treebuilder->context.current_node) { + hubbub_ns ns; element_type type; void *node; uint32_t index; - /* Pop all elements off the stack up to, + /* Pop all elements off the stack up to, * and including, the formatting element */ do { - if (!element_stack_pop(treebuilder, &type, &node)) { + if (!element_stack_pop(treebuilder, &ns, &type, &node)) { /** \todo errors */ } @@ -1811,9 +1821,11 @@ void process_0applet_button_marquee_object_in_body( close_implied_end_tags(treebuilder, UNKNOWN); do { + hubbub_ns ns; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, + &node)) { /** \todo errors */ } @@ -1878,10 +1890,11 @@ void process_0generic_in_body(hubbub_treebuilder *treebuilder, close_implied_end_tags(treebuilder, UNKNOWN); do { + hubbub_ns ns; void *node; if (!element_stack_pop(treebuilder, - &otype, &node)) { + &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_caption.c b/src/treebuilder/in_caption.c index 123ba76..c6e0e18 100644 --- a/src/treebuilder/in_caption.c +++ b/src/treebuilder/in_caption.c @@ -74,6 +74,7 @@ bool handle_in_caption(hubbub_treebuilder *treebuilder, } if (handled || reprocess) { + hubbub_ns ns; element_type otype = UNKNOWN; void *node; @@ -85,7 +86,8 @@ bool handle_in_caption(hubbub_treebuilder *treebuilder, while (otype != CAPTION) { /** \todo parse error */ - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, + &node)) { /** \todo errors */ } } diff --git a/src/treebuilder/in_cell.c b/src/treebuilder/in_cell.c index 98913c6..0159edc 100644 --- a/src/treebuilder/in_cell.c +++ b/src/treebuilder/in_cell.c @@ -21,9 +21,11 @@ */ static inline void close_cell(hubbub_treebuilder *treebuilder) { + hubbub_ns ns; + element_type otype = UNKNOWN; void *node; + element_type type; - element_type otype = UNKNOWN; if (element_in_scope(treebuilder, TD, true)) { type = TD; @@ -37,7 +39,7 @@ static inline void close_cell(hubbub_treebuilder *treebuilder) /** \todo parse error */ while (otype != type) { - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } } @@ -87,6 +89,7 @@ bool handle_in_cell(hubbub_treebuilder *treebuilder, const hubbub_token *token) if (type == TH || TD) { if (element_in_scope(treebuilder, type, true)) { + hubbub_ns ns; element_type otype = UNKNOWN; void *node; @@ -95,7 +98,7 @@ bool handle_in_cell(hubbub_treebuilder *treebuilder, const hubbub_token *token) while (otype != type) { if (!element_stack_pop(treebuilder, - &otype, &node)) { + &ns, &otype, &node)) { /** \todo errors */ } } diff --git a/src/treebuilder/in_column_group.c b/src/treebuilder/in_column_group.c index 35043b8..bb762b4 100644 --- a/src/treebuilder/in_column_group.c +++ b/src/treebuilder/in_column_group.c @@ -81,11 +81,12 @@ bool handle_in_column_group(hubbub_treebuilder *treebuilder, } if (handled || reprocess) { + hubbub_ns ns; element_type otype; void *node; /* Pop the current node (which will be a colgroup) */ - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c index f5fb099..925bf57 100644 --- a/src/treebuilder/in_head.c +++ b/src/treebuilder/in_head.c @@ -164,10 +164,11 @@ bool handle_in_head(hubbub_treebuilder *treebuilder, } if (handled || reprocess) { + hubbub_ns ns; element_type otype; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_head_noscript.c b/src/treebuilder/in_head_noscript.c index 97a48f7..4eebf4e 100644 --- a/src/treebuilder/in_head_noscript.c +++ b/src/treebuilder/in_head_noscript.c @@ -81,10 +81,11 @@ bool handle_in_head_noscript(hubbub_treebuilder *treebuilder, } if (handled || reprocess) { + hubbub_ns ns; element_type otype; void *node; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_row.c b/src/treebuilder/in_row.c index ea600aa..9a6e10d 100644 --- a/src/treebuilder/in_row.c +++ b/src/treebuilder/in_row.c @@ -25,10 +25,11 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder) treebuilder->context.current_node].type; while (cur_node != TR && cur_node != HTML) { + hubbub_ns ns; element_type type; void *node; - if (!element_stack_pop(treebuilder, &type, &node)) { + if (!element_stack_pop(treebuilder, &ns, &type, &node)) { /** \todo errors */ } @@ -48,13 +49,14 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder) */ static inline bool act_as_if_end_tag_tr(hubbub_treebuilder *treebuilder) { + hubbub_ns ns; element_type otype; void *node; /** \todo fragment case */ table_clear_stack(treebuilder); - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_select.c b/src/treebuilder/in_select.c index eb35317..5085b32 100644 --- a/src/treebuilder/in_select.c +++ b/src/treebuilder/in_select.c @@ -26,6 +26,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder, { bool reprocess = false; + hubbub_ns ns; element_type otype; void *node; @@ -51,7 +52,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder, process_tag_in_body(treebuilder, token); } else if (type == OPTION) { if (current_node(treebuilder) == OPTION) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -60,14 +61,14 @@ bool handle_in_select(hubbub_treebuilder *treebuilder, insert_element(treebuilder, &token->data.tag); } else if (type == OPTGROUP) { if (current_node(treebuilder) == OPTION) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } } if (current_node(treebuilder) == OPTGROUP) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -99,14 +100,14 @@ bool handle_in_select(hubbub_treebuilder *treebuilder, if (type == OPTGROUP) { if (current_node(treebuilder) == OPTION && prev_node(treebuilder) == OPTGROUP) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } } if (current_node(treebuilder) == OPTGROUP) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -115,7 +116,7 @@ bool handle_in_select(hubbub_treebuilder *treebuilder, } } else if (type == OPTION) { if (current_node(treebuilder) == OPTION) { - if (!element_stack_pop(treebuilder, &otype, + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/in_table_body.c b/src/treebuilder/in_table_body.c index ef91f55..3e0aa25 100644 --- a/src/treebuilder/in_table_body.c +++ b/src/treebuilder/in_table_body.c @@ -26,10 +26,11 @@ static void table_clear_stack(hubbub_treebuilder *treebuilder) while (cur_node != TBODY && cur_node != TFOOT && cur_node != THEAD && cur_node != HTML) { + hubbub_ns ns; element_type type; void *node; - if (!element_stack_pop(treebuilder, &type, &node)) { + if (!element_stack_pop(treebuilder, &ns, &type, &node)) { /** \todo errors */ } @@ -51,6 +52,7 @@ static bool table_sub_start_or_table_end(hubbub_treebuilder *treebuilder) if (element_in_scope(treebuilder, TBODY, true) || element_in_scope(treebuilder, THEAD, true) || element_in_scope(treebuilder, TFOOT, true)) { + hubbub_ns ns; element_type otype; void *node; @@ -59,7 +61,7 @@ static bool table_sub_start_or_table_end(hubbub_treebuilder *treebuilder) /* "Act as if an end tag with the same name as the current * node had been seen" -- this behaviour should be identical * to handling for (tbody/tfoot/thead) end tags in this mode */ - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -134,12 +136,13 @@ bool handle_in_column_group(hubbub_treebuilder *treebuilder, /** \todo parse error */ /* Ignore the token */ } else { + hubbub_ns ns; element_type otype; void *node; table_clear_stack(treebuilder); - if (!element_stack_pop(treebuilder, &otype, - &node)) { + if (!element_stack_pop(treebuilder, &ns, + &otype, &node)) { /** \todo errors */ } diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h index 6a35632..6f7278c 100644 --- a/src/treebuilder/internal.h +++ b/src/treebuilder/internal.h @@ -33,6 +33,7 @@ typedef enum typedef struct element_context { + hubbub_ns ns; element_type type; void *node; } element_context; @@ -50,6 +51,7 @@ typedef struct formatting_list_entry typedef struct hubbub_treebuilder_context { insertion_mode mode; /**< The current insertion mode */ + insertion_mode second_mode; /**< The secondary insertion mode */ #define ELEMENT_STACK_CHUNK 128 element_context *element_stack; /**< Stack of open elements */ @@ -134,9 +136,9 @@ bool is_formatting_element(element_type type); bool is_phrasing_element(element_type type); bool element_stack_push(hubbub_treebuilder *treebuilder, - element_type type, void *node); + hubbub_ns ns, element_type type, void *node); bool element_stack_pop(hubbub_treebuilder *treebuilder, - element_type *type, void **node); + hubbub_ns *ns, element_type *type, void **node); bool element_stack_pop_until(hubbub_treebuilder *treebuilder, element_type type); element_type current_node(hubbub_treebuilder *treebuilder); diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index 28621bd..cef73d3 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -601,8 +601,9 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder) return; } - if (!element_stack_push(treebuilder, - entry->details.type, appended)) { + if (!element_stack_push(treebuilder, + entry->details.ns, entry->details.type, + appended)) { /** \todo handle memory exhaustion */ treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, @@ -612,10 +613,10 @@ void reconstruct_active_formatting_list(hubbub_treebuilder *treebuilder) clone); } - if (!formatting_list_replace(treebuilder, entry, - entry->details.type, clone, + if (!formatting_list_replace(treebuilder, entry, + entry->details.type, clone, treebuilder->context.current_node, - &prev_type, &prev_node, + &prev_type, &prev_node, &prev_stack_index)) { /** \todo handle errors */ treebuilder->tree_handler->unref_node( @@ -692,8 +693,9 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx, appended); - if (!element_stack_push(treebuilder, - element_type_from_name(treebuilder, &tag->name), + if (!element_stack_push(treebuilder, + tag->ns, + element_type_from_name(treebuilder, &tag->name), node)) { /** \todo errors */ } @@ -750,13 +752,14 @@ void close_implied_end_tags(hubbub_treebuilder *treebuilder, while (type == DD || type == DT || type == LI || type == OPTION || type == OPTGROUP || type == P || type == RP || type == RT) { + hubbub_ns ns; element_type otype; void *node; if (except != UNKNOWN && type == except) break; - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo errors */ } @@ -953,12 +956,13 @@ bool is_phrasing_element(element_type type) * Push an element onto the stack of open elements * * \param treebuilder The treebuilder instance containing the stack + * \param ns The namespace of element being pushed * \param type The type of element being pushed * \param node The node to push * \return True on success, false on memory exhaustion */ bool element_stack_push(hubbub_treebuilder *treebuilder, - element_type type, void *node) + hubbub_ns ns, element_type type, void *node) { uint32_t slot = treebuilder->context.current_node + 1; @@ -977,6 +981,7 @@ bool element_stack_push(hubbub_treebuilder *treebuilder, treebuilder->context.stack_alloc += ELEMENT_STACK_CHUNK; } + treebuilder->context.element_stack[slot].ns = ns; treebuilder->context.element_stack[slot].type = type; treebuilder->context.element_stack[slot].node = node; @@ -998,7 +1003,7 @@ bool element_stack_push(hubbub_treebuilder *treebuilder, * \return True on success, false on memory exhaustion. */ bool element_stack_pop(hubbub_treebuilder *treebuilder, - element_type *type, void **node) + hubbub_ns *ns, element_type *type, void **node) { element_context *stack = treebuilder->context.element_stack; uint32_t slot = treebuilder->context.current_node; @@ -1031,6 +1036,7 @@ bool element_stack_pop(hubbub_treebuilder *treebuilder, } } + *ns = stack[slot].ns; *type = stack[slot].type; *node = stack[slot].node; @@ -1051,9 +1057,10 @@ bool element_stack_pop_until(hubbub_treebuilder *treebuilder, { element_type otype = UNKNOWN; void *node; + hubbub_ns ns; while (otype != type) { - if (!element_stack_pop(treebuilder, &otype, &node)) { + if (!element_stack_pop(treebuilder, &ns, &otype, &node)) { /** \todo error -- never happens */ return false; } -- cgit v1.2.3