summaryrefslogtreecommitdiff
path: root/src/treebuilder
diff options
context:
space:
mode:
authorAndrew Sidwell <andy@entai.co.uk>2008-07-10 16:46:05 +0000
committerAndrew Sidwell <andy@entai.co.uk>2008-07-10 16:46:05 +0000
commit6cda0a302e19bcf703bbc78b3278a54b38f08b46 (patch)
treec57d5f8c0aa7783fa0557b3e045a534192ac4764 /src/treebuilder
parent79a2f09469be48f55230f63f8829b13c298d5d81 (diff)
downloadlibhubbub-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/treebuilder')
-rw-r--r--src/treebuilder/in_table.c9
-rw-r--r--src/treebuilder/treebuilder.c19
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);
}
}