summaryrefslogtreecommitdiff
path: root/src/treebuilder/in_head.c
diff options
context:
space:
mode:
authorRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-07-20 12:35:25 +0530
committerRupinder Singh Khokhar <rsk1coder99@gmail.com>2014-08-01 21:44:34 +0530
commit18e41840989de4f4705b4d56df7daa6ce7073491 (patch)
tree936c688ecc2d7c5b069e7f28e45f736a6c0f83cd /src/treebuilder/in_head.c
parent128ff208119c9ee95727a7df00607f024d573e91 (diff)
downloadlibhubbub-18e41840989de4f4705b4d56df7daa6ce7073491.tar.gz
libhubbub-18e41840989de4f4705b4d56df7daa6ce7073491.tar.bz2
Added support for template tag. However, the client currently doesn't support it. Hence, the only thing left to be done is to callback the client during insert_element, taking proper care of the template tags
Diffstat (limited to 'src/treebuilder/in_head.c')
-rw-r--r--src/treebuilder/in_head.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/treebuilder/in_head.c b/src/treebuilder/in_head.c
index 52a2e3f..a10ba23 100644
--- a/src/treebuilder/in_head.c
+++ b/src/treebuilder/in_head.c
@@ -19,7 +19,6 @@
#include "utils/utils.h"
#include "utils/string.h"
-
/**
* Process a meta tag as if "in head".
*
@@ -164,6 +163,47 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
err = parse_generic_rcdata(treebuilder, token, HUBBUB_CONTENT_MODEL_SCRIPTDATA);
} else if (type == HEAD) {
/** \todo parse error */
+ } else if (type == TEMPLATE) {
+ err = insert_element(treebuilder, &token->data.tag,
+ true);
+ if (err != HUBBUB_OK)
+ return err;
+
+ /* Insert a Marker */
+ treebuilder->tree_handler->ref_node(
+ treebuilder->tree_handler->ctx,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node);
+
+ err = formatting_list_append(treebuilder, token->data.tag.ns, type,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node,
+ token->data.tag.attributes, token->data.tag.n_attributes,
+ treebuilder->context.current_node);
+ if (err != HUBBUB_OK) {
+ hubbub_ns ns;
+ element_type type;
+ void *node;
+ remove_node_from_dom(treebuilder,
+ treebuilder->context.element_stack[
+ treebuilder->context.current_node].node);
+
+ element_stack_pop(treebuilder, &ns, &type, &node);
+
+ /* Unref twice (once for stack, once for formatting list) */
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, node);
+
+ treebuilder->tree_handler->unref_node(
+ treebuilder->tree_handler->ctx, node);
+
+ return err;
+ }
+
+ treebuilder->context.frameset_ok = false;
+ treebuilder->context.mode = IN_TEMPLATE;
+
+ err = template_stack_push(treebuilder, IN_TEMPLATE);
} else {
err = HUBBUB_REPROCESS;
}
@@ -176,9 +216,29 @@ hubbub_error handle_in_head(hubbub_treebuilder *treebuilder,
if (type == HEAD) {
handled = true;
+ } else if(type == TEMPLATE) {
+ /**todo parse error */
+ if(!template_in_stack(treebuilder)) {
+ /** \todo parse error */
+ break;
+ }
+ insertion_mode mode;
+ close_implied_end_tags_thorough(treebuilder);
+
+ err = element_stack_pop_until(treebuilder,
+ TEMPLATE);
+ if (err != HUBBUB_OK)
+ return err;
+
+ clear_active_formatting_list_to_marker(
+ treebuilder);
+ err = template_stack_pop (treebuilder, &mode);
+ reset_insertion_mode (treebuilder);
} else if (type == HTML || type == BODY || type == BR) {
err = HUBBUB_REPROCESS;
- } /** \todo parse error */
+ } else {
+ /** \todo parse error */
+ }
}
break;
case HUBBUB_TOKEN_EOF: