LibWeb: Propagate exception if serializing inner node fails

Fixing a crash for the given test.
This commit is contained in:
Shannon Booth 2024-11-02 02:57:46 +13:00 committed by Tim Flynn
parent fd32f17c56
commit 472b56b47c
Notes: github-actions[bot] 2024-11-01 18:03:09 +00:00
3 changed files with 44 additions and 4 deletions

View file

@ -0,0 +1,13 @@
Summary
Harness status: OK
Rerun
Found 2 tests
1 Pass
1 Fail
Details
Result Test Name MessagePass innerHTML in XHTML: getting while the document is in an invalid state
Fail innerHTML in XHTML: getting while the document is in an invalid state 1

View file

@ -0,0 +1,28 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>innerHTML in XHTML: getting while the document is in an invalid state</title>
<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com"/>
<link rel="help" href="https://w3c.github.io/DOM-Parsing/#widl-Element-innerHTML"/>
<link rel="help" href="http://www.whatwg.org/html5/#xml-fragment-serialization-algorithm"/>
<link rel="help" href="http://www.whatwg.org/html5/#document.title"/>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>
<script>
test(function() {
document.documentElement.appendChild(document.createElement("test:test"));
assert_throws_dom("INVALID_STATE_ERR", function() {
document.documentElement.innerHTML;
}, "getting element with \":\" in its local name");
});
test(function() {
document.title = "\f";
assert_throws_dom("INVALID_STATE_ERR", function() {
document.getElementsByTagName("title")[0].innerHTML;
}, "Getting a Text node whose data contains characters that are not matched by the XML Char production");
});
</script>
</body>
</html>

View file

@ -1568,11 +1568,10 @@ WebIDL::ExceptionOr<String> Node::serialize_fragment(DOMParsing::RequireWellForm
// 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();
for (auto* child = first_child(); child; child = child->next_sibling()) {
auto child_markup = TRY(DOMParsing::serialize_node_to_xml_string(*child, require_well_formed));
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);