LibWeb: Make HTML fragment parsing return ExceptionOr

Update Element::parse_fragment and Node::unsafely_set_html to
propagate exceptions.

This refactor is needed as a prerequisite for implementing the XML
fragment parser, which requires consistent error handling in fragment
parsing.
This commit is contained in:
mikiubo 2025-09-10 23:06:59 +02:00 committed by Sam Atkins
parent 8417d74328
commit 0b715b20a2
Notes: github-actions[bot] 2025-10-23 10:08:11 +00:00
4 changed files with 5 additions and 4 deletions

View file

@ -2060,7 +2060,7 @@ WebIDL::ExceptionOr<GC::Ref<DOM::DocumentFragment>> Element::parse_fragment(Stri
} }
// 3. Let newChildren be the result of invoking algorithm given context and markup. // 3. Let newChildren be the result of invoking algorithm given context and markup.
auto new_children = algorithm(*this, markup, HTML::HTMLParser::AllowDeclarativeShadowRoots::No); auto new_children = TRY(algorithm(*this, markup, HTML::HTMLParser::AllowDeclarativeShadowRoots::No));
// 4. Let fragment be a new DocumentFragment whose node document is context's node document. // 4. Let fragment be a new DocumentFragment whose node document is context's node document.
auto fragment = realm().create<DOM::DocumentFragment>(document()); auto fragment = realm().create<DOM::DocumentFragment>(document());

View file

@ -2116,7 +2116,7 @@ WebIDL::ExceptionOr<String> Node::serialize_fragment(HTML::RequireWellFormed req
WebIDL::ExceptionOr<void> Node::unsafely_set_html(Element& context_element, StringView html) WebIDL::ExceptionOr<void> Node::unsafely_set_html(Element& context_element, StringView html)
{ {
// 1. Let newChildren be the result of the HTML fragment parsing algorithm given contextElement, html, and true. // 1. Let newChildren be the result of the HTML fragment parsing algorithm given contextElement, html, and true.
auto new_children = HTML::HTMLParser::parse_html_fragment(context_element, html, HTML::HTMLParser::AllowDeclarativeShadowRoots::Yes); auto new_children = TRY(HTML::HTMLParser::parse_html_fragment(context_element, html, HTML::HTMLParser::AllowDeclarativeShadowRoots::Yes));
// 2. Let fragment be a new DocumentFragment whose node document is contextElements node document. // 2. Let fragment be a new DocumentFragment whose node document is contextElements node document.
auto fragment = realm().create<DocumentFragment>(context_element.document()); auto fragment = realm().create<DocumentFragment>(context_element.document());

View file

@ -5009,7 +5009,7 @@ DOM::Document& HTMLParser::document()
} }
// https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments // https://html.spec.whatwg.org/multipage/parsing.html#parsing-html-fragments
Vector<GC::Root<DOM::Node>> HTMLParser::parse_html_fragment(DOM::Element& context_element, StringView markup, AllowDeclarativeShadowRoots allow_declarative_shadow_roots) WebIDL::ExceptionOr<Vector<GC::Root<DOM::Node>>> HTMLParser::parse_html_fragment(DOM::Element& context_element, StringView markup, AllowDeclarativeShadowRoots allow_declarative_shadow_roots)
{ {
// 1. Let document be a Document node whose type is "html". // 1. Let document be a Document node whose type is "html".
auto temp_document = DOM::Document::create_for_fragment_parsing(context_element.realm()); auto temp_document = DOM::Document::create_for_fragment_parsing(context_element.realm());

View file

@ -75,7 +75,8 @@ public:
No, No,
Yes, Yes,
}; };
static Vector<GC::Root<DOM::Node>> parse_html_fragment(DOM::Element& context_element, StringView, AllowDeclarativeShadowRoots = AllowDeclarativeShadowRoots::No); static WebIDL::ExceptionOr<Vector<GC::Root<DOM::Node>>> parse_html_fragment(DOM::Element& context_element, StringView, AllowDeclarativeShadowRoots = AllowDeclarativeShadowRoots::No);
enum class SerializableShadowRoots { enum class SerializableShadowRoots {
No, No,
Yes, Yes,