diff options
author | Andrew Sidwell <andy@entai.co.uk> | 2008-07-11 16:26:43 +0000 |
---|---|---|
committer | Andrew Sidwell <andy@entai.co.uk> | 2008-07-11 16:26:43 +0000 |
commit | 243656db3c7d0b00de8024a9bcb8050651b74dd7 (patch) | |
tree | a4479ac6dbdfded03dc502c25458a67190347bc2 /src | |
parent | 633b3acab1a0640cf3c452f213c37f068283ce51 (diff) | |
download | libhubbub-243656db3c7d0b00de8024a9bcb8050651b74dd7.tar.gz libhubbub-243656db3c7d0b00de8024a9bcb8050651b74dd7.tar.bz2 |
Tune up the foreign element support a bit.
svn path=/trunk/hubbub/; revision=4607
Diffstat (limited to 'src')
-rw-r--r-- | src/treebuilder/in_body.c | 2 | ||||
-rw-r--r-- | src/treebuilder/in_foreign_content.c | 19 |
2 files changed, 17 insertions, 4 deletions
diff --git a/src/treebuilder/in_body.c b/src/treebuilder/in_body.c index 2ef2cde..c6c907d 100644 --- a/src/treebuilder/in_body.c +++ b/src/treebuilder/in_body.c @@ -328,6 +328,8 @@ bool process_start_tag(hubbub_treebuilder *treebuilder, /** \todo ack sc flag */ } else { insert_element(treebuilder, &tag); + treebuilder->context.second_mode = + treebuilder->context.mode; treebuilder->context.mode = IN_FOREIGN_CONTENT; } } else if (type == CAPTION || type == COL || type == COLGROUP || diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c index 7c83b29..eea7d49 100644 --- a/src/treebuilder/in_foreign_content.c +++ b/src/treebuilder/in_foreign_content.c @@ -47,9 +47,6 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, { bool reprocess = false; - element_type type = element_type_from_name(treebuilder, - &token->data.tag.name); - element_type cur_node = current_node(treebuilder); hubbub_ns cur_node_ns = current_node_ns(treebuilder); @@ -68,6 +65,9 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, break; case HUBBUB_TOKEN_START_TAG: { + element_type type = element_type_from_name(treebuilder, + &token->data.tag.name); + if (cur_node_ns == HUBBUB_NS_HTML || (cur_node_ns == HUBBUB_NS_MATHML && (type != MGLYPH && type != MALIGNMARK) && @@ -131,9 +131,19 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, } break; case HUBBUB_TOKEN_END_TAG: - /** \parse error */ + treebuilder->context.mode = + treebuilder->context.second_mode; + hubbub_treebuilder_token_handler(token, treebuilder); + + if (treebuilder->context.mode == IN_FOREIGN_CONTENT && + !element_in_scope_in_non_html_ns(treebuilder)) { + treebuilder->context.mode = + treebuilder->context.second_mode; + } + break; case HUBBUB_TOKEN_EOF: + { while (cur_node_ns != HUBBUB_NS_HTML) { void *node; element_stack_pop(treebuilder, &cur_node_ns, @@ -148,6 +158,7 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder, treebuilder->context.second_mode; reprocess = true; + } break; } |