LibWeb: Track whether HTMLLinkElement was enabled when created by parser

This information is needed by the script-blocking style sheet logic, and
its absence was causing a WPT test to crash.
This commit is contained in:
Andreas Kling 2025-04-24 12:36:54 +02:00 committed by Andreas Kling
commit e5d62e9915
Notes: github-actions[bot] 2025-04-24 16:28:25 +00:00
5 changed files with 45 additions and 3 deletions

View file

@ -696,8 +696,8 @@ bool HTMLLinkElement::contributes_a_script_blocking_style_sheet() const
// FIXME: el's media attribute's value matches the environment.
// FIXME: el's style sheet was enabled when the element was created by the parser.
if (has_attribute(AttributeNames::disabled))
// el's style sheet was enabled when the element was created by the parser.
if (!m_was_enabled_when_created_by_parser)
return false;
// FIXME: The last time the event loop reached step 1, el's root was that Document.

View file

@ -44,6 +44,7 @@ public:
static WebIDL::ExceptionOr<void> load_fallback_favicon_if_needed(GC::Ref<DOM::Document>);
void set_parser_document(Badge<HTMLParser>, GC::Ref<DOM::Document>);
void set_was_enabled_when_created_by_parser(Badge<HTMLParser>, bool was_enabled_when_created_by_parser) { m_was_enabled_when_created_by_parser = was_enabled_when_created_by_parser; }
void set_media(String);
String media() const;
@ -161,6 +162,8 @@ private:
// https://html.spec.whatwg.org/multipage/semantics.html#explicitly-enabled
bool m_explicitly_enabled { false };
bool m_was_enabled_when_created_by_parser { false };
Optional<String> m_mime_type;
WeakPtr<DOM::Document> m_parser_document;

View file

@ -810,7 +810,9 @@ GC::Ref<DOM::Element> HTMLParser::create_element_for(HTMLToken const& token, Opt
// AD-HOC: Let <link> elements know which document they were originally parsed for.
// This is used for the render-blocking logic.
if (local_name == HTML::TagNames::link && namespace_ == Namespace::HTML) {
as<HTMLLinkElement>(*element).set_parser_document({}, document);
auto& link_element = as<HTMLLinkElement>(*element);
link_element.set_parser_document({}, document);
link_element.set_was_enabled_when_created_by_parser({}, !token.has_attribute(HTML::AttributeNames::disabled));
}
// 10. Append each attribute in the given token to element.