LibWeb: Make innerHTML for XML nodes actually return inner HTML

The spec says to just call the XML serialization algorithm, but it
returns the "outer serialization", and we need the "inner" one. Let's
just concatenate serializations of children; then the result produced is
similar to one from Blink or Gecko.
This commit is contained in:
Maciej 2024-07-13 20:59:16 +02:00 committed by Ali Mohammad Pur
parent cad3b085a8
commit 9eb568eacb
Notes: sideshowbarker 2024-07-17 00:23:42 +09:00
3 changed files with 22 additions and 0 deletions

View file

@ -0,0 +1 @@
PASS

View file

@ -0,0 +1,10 @@
<!DOCTYPE html>
<script src="../include.js"></script>
<script>
test(() => {
// We need an actual XML document to test this.
const svgstr = `<svg xmlns="http://www.w3.org/2000/svg">PASS</svg>`;
const svg = new DOMParser().parseFromString(svgstr, "image/svg+xml").documentElement;
println(svg.innerHTML);
});
</script>

View file

@ -1490,6 +1490,17 @@ WebIDL::ExceptionOr<String> Node::serialize_fragment(DOMParsing::RequireWellForm
return HTML::HTMLParser::serialize_html_fragment(*this, HTML::HTMLParser::SerializableShadowRoots::No, {}, fragment_serialization_mode);
// 3. Return the XML serialization of node given require well-formed.
// AD-HOC: XML serialization algorithm returns the "outer" XML serialization of the node.
// For inner, concatenate the serialization of all children.
if (fragment_serialization_mode == FragmentSerializationMode::Inner) {
StringBuilder markup;
for_each_child([&markup, require_well_formed](auto& child) {
auto child_markup = DOMParsing::serialize_node_to_xml_string(child, require_well_formed).release_value_but_fixme_should_propagate_errors();
markup.append(child_markup.bytes_as_string_view());
return IterationDecision::Continue;
});
return MUST(markup.to_string());
}
return DOMParsing::serialize_node_to_xml_string(*this, require_well_formed);
}