mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-30 20:59:16 +00:00
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:
parent
1772adb600
commit
e5d62e9915
Notes:
github-actions[bot]
2025-04-24 16:28:25 +00:00
Author: https://github.com/awesomekling
Commit: e5d62e9915
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4455
Reviewed-by: https://github.com/AtkinsSJ ✅
5 changed files with 45 additions and 3 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
|
@ -0,0 +1,31 @@
|
||||||
|
<!doctype html>
|
||||||
|
<title><link disabled>'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>
|
Loading…
Add table
Add a link
Reference in a new issue