From 9eb568eacbcb36e6c1ffd6e61ebf8242a4422119 Mon Sep 17 00:00:00 2001 From: Maciej Date: Sat, 13 Jul 2024 20:59:16 +0200 Subject: [PATCH] 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. --- Tests/LibWeb/Text/expected/HTML/get-innerHTML-xml.txt | 1 + Tests/LibWeb/Text/input/HTML/get-innerHTML-xml.html | 10 ++++++++++ Userland/Libraries/LibWeb/DOM/Node.cpp | 11 +++++++++++ 3 files changed, 22 insertions(+) create mode 100644 Tests/LibWeb/Text/expected/HTML/get-innerHTML-xml.txt create mode 100644 Tests/LibWeb/Text/input/HTML/get-innerHTML-xml.html diff --git a/Tests/LibWeb/Text/expected/HTML/get-innerHTML-xml.txt b/Tests/LibWeb/Text/expected/HTML/get-innerHTML-xml.txt new file mode 100644 index 00000000000..7ef22e9a431 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/get-innerHTML-xml.txt @@ -0,0 +1 @@ +PASS diff --git a/Tests/LibWeb/Text/input/HTML/get-innerHTML-xml.html b/Tests/LibWeb/Text/input/HTML/get-innerHTML-xml.html new file mode 100644 index 00000000000..0a81407376c --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/get-innerHTML-xml.html @@ -0,0 +1,10 @@ + + + diff --git a/Userland/Libraries/LibWeb/DOM/Node.cpp b/Userland/Libraries/LibWeb/DOM/Node.cpp index ab966e0a792..25e329e80e2 100644 --- a/Userland/Libraries/LibWeb/DOM/Node.cpp +++ b/Userland/Libraries/LibWeb/DOM/Node.cpp @@ -1490,6 +1490,17 @@ WebIDL::ExceptionOr 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); }