diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-04-15 11:02:53 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-04-15 11:02:53 +0000 |
commit | b50dc50a2b25c7cc77843b25adc41575cfce7fd6 (patch) | |
tree | 68d81123fda9d7df3aa15375e12ea034896a1c87 /src/treebuilder/in_foreign_content.c | |
parent | 051158ffe97eb9b4a1a4b9b5ea719c7e38509200 (diff) | |
download | libhubbub-b50dc50a2b25c7cc77843b25adc41575cfce7fd6.tar.gz libhubbub-b50dc50a2b25c7cc77843b25adc41575cfce7fd6.tar.bz2 |
Manually merge r7070 into trunk
svn path=/trunk/hubbub/; revision=7082
Diffstat (limited to 'src/treebuilder/in_foreign_content.c')
-rw-r--r-- | src/treebuilder/in_foreign_content.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c index 1626e5b..a78e59f 100644 --- a/src/treebuilder/in_foreign_content.c +++ b/src/treebuilder/in_foreign_content.c @@ -325,9 +325,11 @@ static bool element_in_scope_in_non_html_ns(hubbub_treebuilder *treebuilder) /** * Process a token as if in the secondary insertion mode. */ -static void process_as_in_secondary(hubbub_treebuilder *treebuilder, +static hubbub_error process_as_in_secondary(hubbub_treebuilder *treebuilder, const hubbub_token *token) { + hubbub_error err; + /* Because we don't support calling insertion modes directly, * instead we set the current mode to the secondary mode, * call the token handler, and then reset the mode afterward @@ -335,7 +337,11 @@ static void process_as_in_secondary(hubbub_treebuilder *treebuilder, treebuilder->context.mode = treebuilder->context.second_mode; - hubbub_treebuilder_token_handler(token, treebuilder); + err = hubbub_treebuilder_token_handler(token, treebuilder); + if (err != HUBBUB_OK) { + treebuilder->context.mode = IN_FOREIGN_CONTENT; + return err; + } if (treebuilder->context.mode == treebuilder->context.second_mode) treebuilder->context.mode = IN_FOREIGN_CONTENT; @@ -344,6 +350,8 @@ static void process_as_in_secondary(hubbub_treebuilder *treebuilder, !element_in_scope_in_non_html_ns(treebuilder)) { treebuilder->context.mode = treebuilder->context.second_mode; } + + return HUBBUB_OK; } /** @@ -357,11 +365,13 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder) while (stack[treebuilder->context.current_node].ns != HUBBUB_NS_HTML) { + hubbub_error e; hubbub_ns ns; element_type type; void *node; - element_stack_pop(treebuilder, &ns, &type, &node); + e = element_stack_pop(treebuilder, &ns, &type, &node); + assert(e == HUBBUB_OK); treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, @@ -385,10 +395,10 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, switch (token->type) { case HUBBUB_TOKEN_CHARACTER: - append_text(treebuilder, &token->data.character); + err = append_text(treebuilder, &token->data.character); break; case HUBBUB_TOKEN_COMMENT: - process_comment_append(treebuilder, token, + err = process_comment_append(treebuilder, token, treebuilder->context.element_stack[ treebuilder->context.current_node].node); break; @@ -416,7 +426,7 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, (cur_node == FOREIGNOBJECT || cur_node == DESC || cur_node == TITLE))) { - process_as_in_secondary(treebuilder, token); + err = process_as_in_secondary(treebuilder, token); } else if (type == B || type == BIG || type == BLOCKQUOTE || type == BODY || type == BR || type == CENTER || type == CODE || type == DD || type == DIV || @@ -474,16 +484,16 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, tag.ns = cur_node_ns; if (token->data.tag.self_closing) { - insert_element(treebuilder, &tag, false); + err = insert_element(treebuilder, &tag, false); /** \todo ack sc flag */ } else { - insert_element(treebuilder, &tag, true); + err = insert_element(treebuilder, &tag, true); } } } break; case HUBBUB_TOKEN_END_TAG: - process_as_in_secondary(treebuilder, token); + err = process_as_in_secondary(treebuilder, token); break; case HUBBUB_TOKEN_EOF: foreign_break_out(treebuilder); |