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
+
+
+
+
+
+
+