diff options
author | Baitinq <manuelpalenzuelamerino@gmail.com> | 2022-11-20 01:46:25 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-11-25 22:52:05 +0100 |
commit | d6bb110d89e7bc678bac57327186496f5f1a815b (patch) | |
tree | ee6fb5936bf2ea64500913e55485bab6f702fa97 /Userland/Libraries/LibWeb/HTML | |
parent | c884aa3f25e6492b8931e2eb5d45b25a55b49e12 (diff) | |
download | serenity-d6bb110d89e7bc678bac57327186496f5f1a815b.zip |
LibWeb: Handle disabling of StyleSheet HTMLLinkElements
We now can handle dynamic updating of the disabled attribute of a <link>
of the stylesheet type.
We do this by hooking the adding and removing attribute's handlers and
dynamically loading/removing the stylesheet if it has been
enabled/disabled.
Diffstat (limited to 'Userland/Libraries/LibWeb/HTML')
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp | 34 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h | 5 |
2 files changed, 36 insertions, 3 deletions
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp index 699123d66c..b0496bfd4d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.cpp @@ -29,6 +29,9 @@ HTMLLinkElement::~HTMLLinkElement() = default; void HTMLLinkElement::inserted() { + if (has_attribute(AttributeNames::disabled) && (m_relationship & Relationship::Stylesheet)) + return; + HTMLElement::inserted(); if (m_relationship & Relationship::Stylesheet && !(m_relationship & Relationship::Alternate)) { @@ -92,6 +95,9 @@ void HTMLLinkElement::parse_attribute(FlyString const& name, String const& value m_relationship |= Relationship::Icon; } } + + if (name == HTML::AttributeNames::disabled && (m_relationship & Relationship::Stylesheet) && m_loaded_style_sheet) + document().style_sheets().remove_sheet(*m_loaded_style_sheet); } void HTMLLinkElement::resource_did_fail() @@ -112,6 +118,16 @@ void HTMLLinkElement::resource_did_load() resource_did_load_favicon(); } +void HTMLLinkElement::did_remove_attribute(FlyString const& attr) +{ + if (attr == HTML::AttributeNames::disabled && (m_relationship & Relationship::Stylesheet)) { + if (!resource()) + inserted(); + else + resource_did_load_stylesheet(); + } +} + void HTMLLinkElement::resource_did_load_stylesheet() { VERIFY(m_relationship & Relationship::Stylesheet); @@ -128,10 +144,16 @@ void HTMLLinkElement::resource_did_load_stylesheet() } } - auto* sheet = parse_css_stylesheet(CSS::Parser::ParsingContext(document(), resource()->url()), resource()->encoded_data()); + CSS::CSSStyleSheet* sheet = m_loaded_style_sheet; if (!sheet) { - dbgln_if(CSS_LOADER_DEBUG, "HTMLLinkElement: Failed to parse stylesheet: {}", resource()->url()); - return; + sheet = parse_css_stylesheet(CSS::Parser::ParsingContext(document(), resource()->url()), resource()->encoded_data()); + + if (!sheet) { + dbgln_if(CSS_LOADER_DEBUG, "HTMLLinkElement: Failed to parse stylesheet: {}", resource()->url()); + return; + } + + m_loaded_style_sheet = sheet; } sheet->set_owner_node(this); @@ -179,4 +201,10 @@ bool HTMLLinkElement::load_favicon_and_use_if_window_is_active() return false; } +void HTMLLinkElement::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_loaded_style_sheet); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h index b3fb732043..699843b827 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h @@ -39,6 +39,10 @@ private: virtual void resource_did_fail() override; virtual void resource_did_load() override; + // ^ HTMLElement + virtual void did_remove_attribute(FlyString const&) override; + virtual void visit_edges(Cell::Visitor&) override; + void resource_did_load_stylesheet(); void resource_did_load_favicon(); @@ -54,6 +58,7 @@ private: }; RefPtr<Resource> m_preload_resource; + JS::GCPtr<CSS::CSSStyleSheet> m_loaded_style_sheet; Optional<DOM::DocumentLoadEventDelayer> m_document_load_event_delayer; unsigned m_relationship { 0 }; |