Skip to content

Commit

Permalink
LibXML: Set XMLNS namespace for xmlns attribute
Browse files Browse the repository at this point in the history
This is what Blink and Gecko do, and is required for serialization
(innerHTML etc.) of XML elements to work.
  • Loading branch information
sppmacd authored and alimpfard committed Jul 14, 2024
1 parent f0a306f commit cad3b08
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Tests/LibWeb/Text/expected/DOM/DOMParser-xmlns.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
namespaceURI=http://www.w3.org/2000/xmlns/ prefix=null localName=xmlns value=http://www.w3.org/2000/svg
namespaceURI=http://www.w3.org/2000/xmlns/ prefix=xmlns localName=test value=foo
11 changes: 11 additions & 0 deletions Tests/LibWeb/Text/input/DOM/DOMParser-xmlns.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
const svgstr = `<svg xmlns="http://www.w3.org/2000/svg" xmlns:test="foo"></svg>`;
const svg = new DOMParser().parseFromString(svgstr, "image/svg+xml").documentElement;
for (const attr of svg.attributes) {
println(`namespaceURI=${attr.namespaceURI} prefix=${attr.prefix} localName=${attr.localName} value=${attr.value}`);
}
});
</script>
9 changes: 8 additions & 1 deletion Userland/Libraries/LibWeb/XML/XMLDocumentBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,15 @@ void XMLDocumentBuilder::element_start(const XML::Name& name, HashMap<XML::Name,
MUST(m_current_node->append_child(node));
}

for (auto const& attribute : attributes)
for (auto const& attribute : attributes) {
// https://www.w3.org/TR/2006/REC-xml-names11-20060816/#ns-decl
if (attribute.key == "xmlns" || attribute.key.starts_with("xmlns:"sv)) {
auto name = attribute.key;
// The prefix xmlns is used only to declare namespace bindings and is by definition bound to the namespace name http://www.w3.org/2000/xmlns/.
MUST(node->set_attribute_ns(Namespace::XMLNS, MUST(FlyString::from_deprecated_fly_string(name)), MUST(String::from_byte_string(attribute.value))));
}
MUST(node->set_attribute(MUST(FlyString::from_deprecated_fly_string(attribute.key)), MUST(String::from_byte_string(attribute.value))));
}

m_current_node = node.ptr();
}
Expand Down

0 comments on commit cad3b08

Please sign in to comment.