summaryrefslogtreecommitdiff
path: root/src/treebuilder/in_foreign_content.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/treebuilder/in_foreign_content.c')
-rw-r--r--src/treebuilder/in_foreign_content.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/treebuilder/in_foreign_content.c b/src/treebuilder/in_foreign_content.c
index a8343f1..043844b 100644
--- a/src/treebuilder/in_foreign_content.c
+++ b/src/treebuilder/in_foreign_content.c
@@ -14,7 +14,10 @@
#include "utils/utils.h"
-
+/**
+ * Returns true iff there is an element in scope that has a namespace other
+ * than the HTML namespace.
+ */
static bool element_in_scope_in_non_html_ns(hubbub_treebuilder *treebuilder)
{
element_context *stack = treebuilder->context.element_stack;
@@ -28,14 +31,24 @@ static bool element_in_scope_in_non_html_ns(hubbub_treebuilder *treebuilder)
return false;
}
-
+/**
+ * Process a token as if in the secondary insertion mode.
+ */
static void process_as_in_secondary(hubbub_treebuilder *treebuilder,
const hubbub_token *token)
{
+ /* Because we don't support calling insertion modes directly,
+ * instead we set the current mode to the secondary mode,
+ * call the token handler, and then reset the mode afterward
+ * as long as it's unchanged, as this has the same effect */
+
treebuilder->context.mode = treebuilder->context.second_mode;
hubbub_treebuilder_token_handler(token, treebuilder);
+ if (treebuilder->context.mode == treebuilder->context.second_mode)
+ treebuilder->context.mode = IN_FOREIGN_CONTENT;
+
if (treebuilder->context.mode == IN_FOREIGN_CONTENT &&
!element_in_scope_in_non_html_ns(treebuilder)) {
treebuilder->context.mode =
@@ -68,7 +81,6 @@ static void foreign_break_out(hubbub_treebuilder *treebuilder)
treebuilder->context.mode = treebuilder->context.second_mode;
}
-
/**
* Handle tokens in "in foreign content" insertion mode
*
@@ -153,4 +165,3 @@ bool handle_in_foreign_content(hubbub_treebuilder *treebuilder,
return reprocess;
}
-