From e5d62e9915dfe62708e4996768dba989255e1b46 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 24 Apr 2025 12:36:54 +0200 Subject: [PATCH] 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. --- Libraries/LibWeb/HTML/HTMLLinkElement.cpp | 4 +-- Libraries/LibWeb/HTML/HTMLLinkElement.h | 3 ++ Libraries/LibWeb/HTML/Parser/HTMLParser.cpp | 4 ++- .../cssom/HTMLLinkElement-disabled-003.txt | 6 ++++ .../cssom/HTMLLinkElement-disabled-003.html | 31 +++++++++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/css/cssom/HTMLLinkElement-disabled-003.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/cssom/HTMLLinkElement-disabled-003.html diff --git a/Libraries/LibWeb/HTML/HTMLLinkElement.cpp b/Libraries/LibWeb/HTML/HTMLLinkElement.cpp index 2901f885ce1..9e36d6a3c47 100644 --- a/Libraries/LibWeb/HTML/HTMLLinkElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLLinkElement.cpp @@ -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. diff --git a/Libraries/LibWeb/HTML/HTMLLinkElement.h b/Libraries/LibWeb/HTML/HTMLLinkElement.h index dd0678a06c6..8c12a30d3ab 100644 --- a/Libraries/LibWeb/HTML/HTMLLinkElement.h +++ b/Libraries/LibWeb/HTML/HTMLLinkElement.h @@ -44,6 +44,7 @@ public: static WebIDL::ExceptionOr load_fallback_favicon_if_needed(GC::Ref); void set_parser_document(Badge, GC::Ref); + void set_was_enabled_when_created_by_parser(Badge, 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 m_mime_type; WeakPtr m_parser_document; diff --git a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index 73524c7b35c..cca09a2a3e2 100644 --- a/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -810,7 +810,9 @@ GC::Ref HTMLParser::create_element_for(HTMLToken const& token, Opt // AD-HOC: Let 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(*element).set_parser_document({}, document); + auto& link_element = as(*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. diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/cssom/HTMLLinkElement-disabled-003.txt b/Tests/LibWeb/Text/expected/wpt-import/css/cssom/HTMLLinkElement-disabled-003.txt new file mode 100644 index 00000000000..83b29dec2aa --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/cssom/HTMLLinkElement-disabled-003.txt @@ -0,0 +1,6 @@ +Harness status: OK + +Found 1 tests + +1 Pass +Pass HTMLLinkElement.disabled's explicitly enabled state persists when disconnected and connected again \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/cssom/HTMLLinkElement-disabled-003.html b/Tests/LibWeb/Text/input/wpt-import/css/cssom/HTMLLinkElement-disabled-003.html new file mode 100644 index 00000000000..eea9203a0e1 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/cssom/HTMLLinkElement-disabled-003.html @@ -0,0 +1,31 @@ + +<link disabled>'s "explicitly enabled" state persists after getting disconnected from the tree + + + + + + +