summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWeb/HTML
diff options
context:
space:
mode:
authorBaitinq <manuelpalenzuelamerino@gmail.com>2022-11-20 01:46:25 +0100
committerAndreas Kling <kling@serenityos.org>2022-11-25 22:52:05 +0100
commitd6bb110d89e7bc678bac57327186496f5f1a815b (patch)
treeee6fb5936bf2ea64500913e55485bab6f702fa97 /Userland/Libraries/LibWeb/HTML
parentc884aa3f25e6492b8931e2eb5d45b25a55b49e12 (diff)
downloadserenity-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.cpp34
-rw-r--r--Userland/Libraries/LibWeb/HTML/HTMLLinkElement.h5
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 };