diff options
author | Andrew Sidwell <andy@entai.co.uk> | 2008-07-10 16:46:05 +0000 |
---|---|---|
committer | Andrew Sidwell <andy@entai.co.uk> | 2008-07-10 16:46:05 +0000 |
commit | 6cda0a302e19bcf703bbc78b3278a54b38f08b46 (patch) | |
tree | c57d5f8c0aa7783fa0557b3e045a534192ac4764 /src | |
parent | 79a2f09469be48f55230f63f8829b13c298d5d81 (diff) | |
download | libhubbub-6cda0a302e19bcf703bbc78b3278a54b38f08b46.tar.gz libhubbub-6cda0a302e19bcf703bbc78b3278a54b38f08b46.tar.bz2 |
When handling things as "in body" in the "Anything else" section of the "in table" insertion mode, for the text:
"if the current node is a table, tbody, tfoot, thead, or tr element, then, whenever a node would be inserted into the current node, it must instead be foster parented.
Change to evalute "current node" at insertion-time rather before handling as if "in body".
svn path=/trunk/hubbub/; revision=4574
Diffstat (limited to 'src')
-rw-r--r-- | src/treebuilder/in_table.c | 9 | ||||
-rw-r--r-- | src/treebuilder/treebuilder.c | 19 |
2 files changed, 13 insertions, 15 deletions
diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c index ad4c5b9..e6a81a6 100644 --- a/src/treebuilder/in_table.c +++ b/src/treebuilder/in_table.c @@ -197,14 +197,7 @@ bool handle_in_table(hubbub_treebuilder *treebuilder, } if (!handled) { - element_type cur_node = current_node(treebuilder); - - if (cur_node == TABLE || cur_node == TBODY || - cur_node == TFOOT || cur_node == THEAD || - cur_node == TR) { - /** \todo in_body needs to take account of this flag */ - treebuilder->context.in_table_foster = true; - } + treebuilder->context.in_table_foster = true; /** \todo parse error */ handle_in_body(treebuilder, token); diff --git a/src/treebuilder/treebuilder.c b/src/treebuilder/treebuilder.c index bac7139..39c9b31 100644 --- a/src/treebuilder/treebuilder.c +++ b/src/treebuilder/treebuilder.c @@ -709,6 +709,7 @@ void clear_active_formatting_list_to_marker(hubbub_treebuilder *treebuilder) */ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) { + element_type type = current_node(treebuilder); int success; void *node, *appended; @@ -718,7 +719,11 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) /** \todo errors */ } - if (!treebuilder->context.in_table_foster) { + if (treebuilder->context.in_table_foster && + (type == TABLE || type == TBODY || type == TFOOT || + type == THEAD || type == TR)) { + aa_insert_into_foster_parent(treebuilder, node); + } else { success = treebuilder->tree_handler->append_child( treebuilder->tree_handler->ctx, treebuilder->context.element_stack[ @@ -730,9 +735,6 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, appended); - } else { - printf("should be inserting foster here\n"); - aa_insert_into_foster_parent(treebuilder, node); } if (!element_stack_push(treebuilder, @@ -752,6 +754,7 @@ void insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) void insert_element_no_push(hubbub_treebuilder *treebuilder, const hubbub_tag *tag) { + element_type type = current_node(treebuilder); int success; void *node, *appended; @@ -763,7 +766,11 @@ void insert_element_no_push(hubbub_treebuilder *treebuilder, /** \todo errors */ } - if (!treebuilder->context.in_table_foster) { + if (treebuilder->context.in_table_foster && + (type == TABLE || type == TBODY || type == TFOOT || + type == THEAD || type == TR)) { + aa_insert_into_foster_parent(treebuilder, node); + } else { success = treebuilder->tree_handler->append_child( treebuilder->tree_handler->ctx, treebuilder->context.element_stack[ @@ -777,8 +784,6 @@ void insert_element_no_push(hubbub_treebuilder *treebuilder, treebuilder->tree_handler->ctx, appended); treebuilder->tree_handler->unref_node( treebuilder->tree_handler->ctx, node); - } else { - aa_insert_into_foster_parent(treebuilder, node); } } |