diff options
Diffstat (limited to 'src/treebuilder')
-rw-r--r-- | src/treebuilder/in_body.c | 6 | ||||
-rw-r--r-- | src/treebuilder/in_foreign_content.c | 5 | ||||
-rw-r--r-- | src/treebuilder/in_head.c | 8 | ||||
-rw-r--r-- | src/treebuilder/internal.h | 2 | ||||
-rw-r--r-- | src/treebuilder/treebuilder.c | 18 |
5 files changed, 24 insertions, 15 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index d684702..dcccdd0 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -325,7 +325,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder, treebuilder->context.frameset_ok = false; - err = parse_generic_rcdata(treebuilder, token, false); + err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT); } else if (type == TABLE) { if(treebuilder->quirks_mode != HUBBUB_QUIRKS_MODE_FULL && element_in_scope(treebuilder, P, @@ -384,7 +384,7 @@ hubbub_error process_start_tag(hubbub_treebuilder *treebuilder, type == NOSCRIPT)) { if (type == IFRAME) treebuilder->context.frameset_ok = false; - err = parse_generic_rcdata(treebuilder, token, false); + err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT); } else if (type == SELECT) { err = process_select_in_body(treebuilder, token); if (err != HUBBUB_OK) @@ -1403,7 +1403,7 @@ hubbub_error process_textarea_in_body(hubbub_treebuilder *treebuilder, { treebuilder->context.strip_leading_lr = true; treebuilder->context.frameset_ok = false; - return parse_generic_rcdata(treebuilder, token, true); + return parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RCDATA); } /** diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c index 73a061d..97fb1d0 100644 --- a/src/treebuilder/in_foreign_content.c +++ b/src/treebuilder/in_foreign_content.c @@ -551,12 +551,13 @@ hubbub_error handle_in_foreign_content(hubbub_treebuilder *treebuilder, hubbub_ns ns; element_type type; void *node_iterator; - while(node_iterator !=stack[node].node) { + void *vnode = stack[node].node; + do{ element_stack_pop(treebuilder, &ns, &type, &node_iterator); treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, node_iterator); - } + } while(node_iterator != vnode); return HUBBUB_OK; } if(stack[node].ns == HUBBUB_NS_HTML) { diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c index 9568789..52a2e3f 100644 --- a/src/treebuilder/in_head.c +++ b/src/treebuilder/in_head.c @@ -142,13 +142,13 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder, } else if (type == META) { err = process_meta_in_head(treebuilder, token); } else if (type == TITLE) { - err = parse_generic_rcdata(treebuilder, token, true); + err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RCDATA); } else if (type == NOFRAMES || type == STYLE) { - err = parse_generic_rcdata(treebuilder, token, false); + err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_RAWTEXT); } else if (type == NOSCRIPT) { if (treebuilder->context.enable_scripting) { err = parse_generic_rcdata(treebuilder, token, - false); + HUBBUB_CONTENT_MODEL_RAWTEXT); } else { err = insert_element(treebuilder, &token->data.tag, true); @@ -161,7 +161,7 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder, /** \todo need to ensure that the client callback * sets the parser-inserted/already-executed script * flags. */ - err = parse_generic_rcdata(treebuilder, token, false); + err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_SCRIPTDATA); } else if (type == HEAD) { /** \todo parse error */ } else { diff --git a/src/treebuilder/internal.h b/src/treebuilder/internal.h index a5f0b22..5d3c75f 100644 --- a/src/treebuilder/internal.h +++ b/src/treebuilder/internal.h @@ -146,7 +146,7 @@ hubbub_error process_in_table_text( hubbub_error process_comment_append(hubbub_treebuilder *treebuilder, const hubbub_token *token, void *parent); hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder, - const hubbub_token *token, bool rcdata); + const hubbub_token *token, hubbub_content_model content_model); uint32_t element_in_scope(hubbub_treebuilder *treebuilder, element_type type, element_scope scope); diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index 568a589..eb6bb51 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -379,6 +379,14 @@ hubbub_error hubbub_treebuilder_token_handler(const hubbub_token *token, } } + hubbub_tokeniser_optparams params; + hubbub_error e; + params.process_cdata = (treebuilder->context.element_stack[ + treebuilder->context.current_node].ns != HUBBUB_NS_HTML); + e = hubbub_tokeniser_setopt(treebuilder->tokeniser, HUBBUB_TOKENISER_PROCESS_CDATA, ¶ms); + UNUSED(e); + assert(e == HUBBUB_OK); + return err; } @@ -523,11 +531,11 @@ hubbub_error process_comment_append(hubbub_treebuilder *treebuilder, * * \param treebuilder The treebuilder instance * \param token The current token - * \param rcdata True for RCDATA, false for CDATA + * \param content_model The content-model in which the algorithm is being evoked * \return HUBBUB_OK on success, appropriate error otherwise */ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder, - const hubbub_token *token, bool rcdata) + const hubbub_token *token, hubbub_content_model content_model) { hubbub_error error; element_type type; @@ -539,10 +547,10 @@ hubbub_error parse_generic_rcdata(hubbub_treebuilder *treebuilder, if (error != HUBBUB_OK) return error; - params.content_model.model = rcdata ? HUBBUB_CONTENT_MODEL_RCDATA - : HUBBUB_CONTENT_MODEL_RAWTEXT; + params.content_model.model = content_model; error = hubbub_tokeniser_setopt(treebuilder->tokeniser, - HUBBUB_TOKENISER_CONTENT_MODEL, ¶ms); + HUBBUB_TOKENISER_CONTENT_MODEL, ¶ms); + /* There is no way that setopt can fail. Ensure this. */ assert(error == HUBBUB_OK); |