From bfa493eef451adcf185787ffc7ac754adc330d20 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 26 Mar 2025 14:40:23 +0000 Subject: [PATCH] LibWeb/CSS: Give all style values a visit_edges() method Having this hidden away in ImageStyleValue meant that CSSStyleProperties (and anyone else who holds style values) had to know exactly which types need visiting. This is a footgun waiting to happen, so make this a virtual method on CSSStyleValue instead. --- Libraries/LibWeb/CSS/CSSStyleProperties.cpp | 3 +-- Libraries/LibWeb/CSS/CSSStyleValue.h | 3 +++ Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.cpp | 1 + Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.h | 5 ++++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Libraries/LibWeb/CSS/CSSStyleProperties.cpp b/Libraries/LibWeb/CSS/CSSStyleProperties.cpp index 93f6a1dee41..1ac05042e8b 100644 --- a/Libraries/LibWeb/CSS/CSSStyleProperties.cpp +++ b/Libraries/LibWeb/CSS/CSSStyleProperties.cpp @@ -85,8 +85,7 @@ void CSSStyleProperties::visit_edges(Visitor& visitor) { Base::visit_edges(visitor); for (auto& property : m_properties) { - if (property.value->is_image()) - property.value->as_image().visit_edges(visitor); + property.value->visit_edges(visitor); } } diff --git a/Libraries/LibWeb/CSS/CSSStyleValue.h b/Libraries/LibWeb/CSS/CSSStyleValue.h index 14f39ad61ac..73e5e00b84c 100644 --- a/Libraries/LibWeb/CSS/CSSStyleValue.h +++ b/Libraries/LibWeb/CSS/CSSStyleValue.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -369,6 +370,8 @@ public: [[nodiscard]] int to_font_slope() const; [[nodiscard]] int to_font_width() const; + virtual void visit_edges(JS::Cell::Visitor&) const { } + virtual bool equals(CSSStyleValue const& other) const = 0; bool operator==(CSSStyleValue const& other) const diff --git a/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.cpp b/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.cpp index df73bc93737..c35ddf8fcde 100644 --- a/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.cpp +++ b/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.cpp @@ -30,6 +30,7 @@ ImageStyleValue::~ImageStyleValue() = default; void ImageStyleValue::visit_edges(JS::Cell::Visitor& visitor) const { + Base::visit_edges(visitor); // FIXME: visit_edges in non-GC allocated classes is confusing pattern. // Consider making CSSStyleValue to be GC allocated instead. visitor.visit(m_resource_request); diff --git a/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.h index 878c900c402..d643635efe0 100644 --- a/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/ImageStyleValue.h @@ -21,6 +21,9 @@ namespace Web::CSS { class ImageStyleValue final : public AbstractImageStyleValue , public Weakable { + + using Base = AbstractImageStyleValue; + public: static ValueComparingNonnullRefPtr create(URL::URL const& url) { @@ -28,7 +31,7 @@ public: } virtual ~ImageStyleValue() override; - void visit_edges(JS::Cell::Visitor& visitor) const; + virtual void visit_edges(JS::Cell::Visitor& visitor) const override; virtual String to_string(SerializationMode) const override; virtual bool equals(CSSStyleValue const& other) const override;