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 media attribute's value matches the environment.
// FIXME: el's style sheet was enabled when the element was created by the parser. // el's style sheet was enabled when the element was created by the parser.
if (has_attribute(AttributeNames::disabled)) if (!m_was_enabled_when_created_by_parser)
return false; return false;
// FIXME: The last time the event loop reached step 1, el's root was that Document. // 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>); 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_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); void set_media(String);
String media() const; String media() const;
@ -161,6 +162,8 @@ private:
// https://html.spec.whatwg.org/multipage/semantics.html#explicitly-enabled // https://html.spec.whatwg.org/multipage/semantics.html#explicitly-enabled
bool m_explicitly_enabled { false }; bool m_explicitly_enabled { false };
bool m_was_enabled_when_created_by_parser { false };
Optional<String> m_mime_type; Optional<String> m_mime_type;
WeakPtr<DOM::Document> m_parser_document; 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. // AD-HOC: Let <link> elements know which document they were originally parsed for.
// This is used for the render-blocking logic. // This is used for the render-blocking logic.
if (local_name == HTML::TagNames::link && namespace_ == Namespace::HTML) { 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. // 10. Append each attribute in the given token to element.

View file

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

View file

@ -0,0 +1,31 @@
<!doctype html>
<title>&lt;link disabled&gt;'s "explicitly enabled" state persists after getting disconnected from the tree</title>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<link rel="help" href="https://html.spec.whatwg.org/#attr-link-disabled">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<link title="alt" rel="alternate stylesheet" disabled href="data:text/css,html { background: green }">
<script>
function assert_applies(applies) {
(applies ? assert_equals : assert_not_equals)(getComputedStyle(document.documentElement).backgroundColor, "rgb(0, 128, 0)");
}
const link = document.querySelector("link[disabled]");
async_test(function(t) {
assert_true(link.disabled);
link.disabled = false;
assert_false(link.disabled);
assert_true(!link.hasAttribute("disabled"));
link.remove();
link.onload = t.step_func_done(function() {
assert_equals(document.styleSheets.length, 1);
let sheet = document.styleSheets[0];
assert_equals(sheet.ownerNode, link);
assert_applies(true);
});
document.head.appendChild(link);
}, "HTMLLinkElement.disabled's explicitly enabled state persists when disconnected and connected again");
</script>