LibXML: Set XMLNS namespace for xmlns attribute
This is what Blink and Gecko do, and is required for serialization (innerHTML etc.) of XML elements to work.
This commit is contained in:
parent
f0a306fe50
commit
cad3b085a8
Notes:
sideshowbarker
2024-07-17 08:35:21 +09:00
Author: https://github.com/sppmacd Commit: https://github.com/LadybirdBrowser/ladybird/commit/cad3b085a8 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/616 Issue: https://github.com/LadybirdBrowser/ladybird/issues/612 Reviewed-by: https://github.com/ADKaster Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/sideshowbarker
3 changed files with 21 additions and 1 deletions
2
Tests/LibWeb/Text/expected/DOM/DOMParser-xmlns.txt
Normal file
2
Tests/LibWeb/Text/expected/DOM/DOMParser-xmlns.txt
Normal file
|
@ -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
Tests/LibWeb/Text/input/DOM/DOMParser-xmlns.html
Normal file
11
Tests/LibWeb/Text/input/DOM/DOMParser-xmlns.html
Normal file
|
@ -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>
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue