summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
authorRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-07-13 08:46:10 +0530
committerRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-08-01 21:44:33 +0530
commit5d07e38342f6a65cec3e661447d539b71401b49b (patch)
treeabb4df0110dd8b013a41c479cc46dd4cff076952 /src/treebuilder
parentcc0119cafe9c29bfb42573d65a2012dce8628c76 (diff)
downloadlibhubbub-5d07e38342f6a65cec3e661447d539b71401b49b.tar.gz
libhubbub-5d07e38342f6a65cec3e661447d539b71401b49b.tar.bz2
This is perhaps the best way to treat an incoming script content_model_flag. Black-boxing is mantained, & a switch is allowed only to a script data state. Script content model can't be incorporated in the style of rcdata & rawtext data, wherein it was easy to make a 1to1 matching between handlers and states. Also fixed the tokeniser to properly handle script tags. tokeniser was earlier modified in commit 7b6b8eb6fcbdd175540902ca699e7e704b90f9e0, has now been tested & bugs removed. Additionaly, in every loop of the dispatcher, it will be checked whether it is safe for tokeniser to process CDATA, and corresponding opts on the tokeniser will be set. this may slow the library down because of repeated checking in every loop. The tokeniser code has become unbearably messy due to the script tags, so a little tiding up & optimisation will be done later ;)
Diffstat (limited to 'src/treebuilder')
-rw-r--r--src/treebuilder/in_body.c6
-rw-r--r--src/treebuilder/in_foreign_content.c5
-rw-r--r--src/treebuilder/in_head.c8
-rw-r--r--src/treebuilder/internal.h2
-rw-r--r--src/treebuilder/treebuilder.c18
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, &params);
+ 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, &params);
+ HUBBUB_TOKENISER_CONTENT_MODEL, &params);
+
/* There is no way that setopt can fail. Ensure this. */
assert(error == HUBBUB_OK);