diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp index f414c00b4cf..43cbc719580 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp @@ -53,6 +53,7 @@ ErrorOr>> resolve_xml_resourc XMLDocumentBuilder::XMLDocumentBuilder(DOM::Document& document, XMLScriptingSupport scripting_support) : m_document(document) + , m_template_node_stack(document.realm().heap()) , m_current_node(m_document) , m_scripting_support(scripting_support) { @@ -148,6 +149,7 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMapis_html_template_element()) { // When an XML parser would append a node to a template element, it must instead append it to the template element's template contents (a DocumentFragment node). + m_template_node_stack.append(*m_current_node); MUST(static_cast(*m_current_node).content()->append_child(node)); } else { MUST(m_current_node->append_child(node)); @@ -229,7 +231,12 @@ void XMLDocumentBuilder::element_end(const XML::Name& name) script_element.process_the_script_element(); }; - m_current_node = m_current_node->parent_node(); + auto* parent = m_current_node->parent_node(); + if (parent->is_document_fragment()) { + auto template_parent_node = m_template_node_stack.take_last(); + parent = template_parent_node.ptr(); + } + m_current_node = parent; } void XMLDocumentBuilder::text(StringView data) @@ -267,6 +274,7 @@ void XMLDocumentBuilder::document_end() // NOTE: Noop. // Set the insertion point to undefined. + m_template_node_stack.clear(); m_current_node = nullptr; // Update the current document readiness to "interactive". diff --git a/Libraries/LibWeb/XML/XMLDocumentBuilder.h b/Libraries/LibWeb/XML/XMLDocumentBuilder.h index c9d1eca8ef4..edc3d779786 100644 --- a/Libraries/LibWeb/XML/XMLDocumentBuilder.h +++ b/Libraries/LibWeb/XML/XMLDocumentBuilder.h @@ -41,6 +41,7 @@ private: Optional namespace_for_name(XML::Name const&); GC::Ref m_document; + GC::RootVector> m_template_node_stack; GC::Ptr m_current_node; XMLScriptingSupport m_scripting_support { XMLScriptingSupport::Enabled }; bool m_has_error { false }; diff --git a/Tests/LibWeb/Text/expected/wpt-import/xhr/template-element.txt b/Tests/LibWeb/Text/expected/wpt-import/xhr/template-element.txt new file mode 100644 index 00000000000..2506702bc3b --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/xhr/template-element.txt @@ -0,0 +1,8 @@ +Harness status: OK + +Found 3 tests + +3 Pass +Pass XMLHttpRequest: template element parsing +Pass XMLHttpRequest: template element parsing 1 +Pass XMLHttpRequest: template element parsing 2 \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/xhr/template-element.html b/Tests/LibWeb/Text/input/wpt-import/xhr/template-element.html new file mode 100644 index 00000000000..f01cb167528 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/xhr/template-element.html @@ -0,0 +1,36 @@ + +XMLHttpRequest: template element parsing + + +
+