diff options
author | Rupinder Singh Khokhar <rsk1coder99@gmail.com> | 2014-07-21 09:48:20 +0530 |
---|---|---|
committer | Rupinder Singh Khokhar <rsk1coder99@gmail.com> | 2014-08-01 21:44:34 +0530 |
commit | 32c36a8042713a3a25fe829f4839f06431d77295 (patch) | |
tree | a7db67146164757a40875ad07d508a7d15e8d31a /src | |
parent | cf6875b854a8698e1bbc7d2783828d3c0994046b (diff) | |
download | libhubbub-32c36a8042713a3a25fe829f4839f06431d77295.tar.gz libhubbub-32c36a8042713a3a25fe829f4839f06431d77295.tar.bz2 |
The foreign breakout method doesn't neccessarily break out of foreign state. Hence, it is only a candidate to do so. It will be decided during reprocessing whether to breakout or not.
Diffstat (limited to 'src')
-rw-r--r-- | src/treebuilder/in_body.c | 2 | ||||
-rw-r--r-- | src/treebuilder/in_foreign_content.c | 33 |
2 files changed, 15 insertions, 20 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index edfc73b..5359364 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -1853,7 +1853,7 @@ hubbub_error process_0presentational_in_body(hubbub_treebuilder *treebuilder, uint32_t common_ancestor; uint32_t furthest_block; bookmark bookmark; - uint32_t last_node; + uint32_t last_node = 0; void *reparented; void *fe_clone = NULL; void *clone_appended = NULL; diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c index ddade53..681faeb 100644 --- a/src/treebuilder/in_foreign_content.c +++ b/src/treebuilder/in_foreign_content.c @@ -313,16 +313,6 @@ static bool element_in_scope_in_non_html_ns(hubbub_treebuilder *treebuilder) assert((signed) treebuilder->context.current_node >= 0); for (node = treebuilder->context.current_node; node > 0; node--) { - element_type node_type = stack[node].type; - - /* The list of element types given in the spec here are the - * scoping elements excluding TABLE and HTML. TABLE is handled - * in the previous conditional and HTML should only occur - * as the first node in the stack, which is never processed - * in this loop. */ - if (node_type == TABLE || is_scoping_element(node_type)) - break; - if (stack[node].ns != HUBBUB_NS_HTML) return true; } @@ -363,9 +353,10 @@ static hubbub_error process_as_in_secondary(hubbub_treebuilder *treebuilder, } /** - * Break out of foreign content as a result of certain start tags or EOF. + * Handle certain start tags. Reprocessing is a must + * after calling this function. */ -static void foreign_break_out(hubbub_treebuilder *treebuilder) +static void candidate_foreign_breakout(hubbub_treebuilder *treebuilder) { element_context *stack = treebuilder->context.element_stack; hubbub_ns ns; @@ -375,6 +366,11 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder) /** \todo parse error */ /** todo fragment case */ + element_stack_pop(treebuilder, &ns, &type, &node); + treebuilder->tree_handler->unref_node( + treebuilder->tree_handler->ctx, + node); + ns = stack[treebuilder->context.current_node].ns; type = current_node(treebuilder); size_t n_attrs = stack[ @@ -400,7 +396,6 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder) attrs = stack[treebuilder->context.current_node]. attributes; } - treebuilder->context.mode = treebuilder->context.second_mode; } @@ -490,7 +485,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, type == SUB || type == SUP || type == TABLE || type == TT || type == U || type == UL || type == VAR) { - foreign_break_out(treebuilder); + candidate_foreign_breakout(treebuilder); err = HUBBUB_REPROCESS; handled = true; } else if (type == FONT) { @@ -518,7 +513,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, } if (found) { - foreign_break_out(treebuilder); + candidate_foreign_breakout(treebuilder); err = HUBBUB_REPROCESS; handled = true; } @@ -554,7 +549,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, uint32_t node; element_context *stack = treebuilder->context.element_stack; - for (node = treebuilder->context.current_node; node > 1; node--) { + for (node = treebuilder->context.current_node; node > 0;) { if(stack[node].type == type) { hubbub_ns ns; element_type type; @@ -568,17 +563,17 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, } while(node_iterator != vnode); return HUBBUB_OK; } - if(stack[node].ns == HUBBUB_NS_HTML) { + if(stack[--node].ns == HUBBUB_NS_HTML) { break; } } - if(node > 1) { + if(node > 0) { err = process_as_in_secondary(treebuilder, token); } } break; case HUBBUB_TOKEN_EOF: - foreign_break_out(treebuilder); + candidate_foreign_breakout(treebuilder); err = HUBBUB_REPROCESS; break; } |