From f3139c05d641756a6c74f1eb618e4290a33f3801 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Mon, 4 Nov 2024 17:13:51 +0000 Subject: [PATCH] LibWeb/CSS: Clear child CSS rules' caches too If a rule gets its caches cleared because it's moved in the OM, then its child rules' caches are likely invalid and need clearing too. Assuming that caches only point "upwards", this will correctly clear them all. For the time being that will be true. --- .../Text/expected/wpt-import/css/css-nesting/cssom.txt | 5 +++-- Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp | 7 +++++++ Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h | 1 + Userland/Libraries/LibWeb/CSS/CSSRule.h | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/cssom.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/cssom.txt index 84299b8c6e13..d18a98339e28 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/cssom.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-nesting/cssom.txt @@ -6,7 +6,8 @@ Rerun Found 13 tests -13 Fail +1 Pass +12 Fail Details Result Test Name MessageFail CSSStyleRule is a CSSGroupingRule Fail Simple CSSOM manipulation of subrules @@ -20,4 +21,4 @@ Fail Simple CSSOM manipulation of subrules 7 Fail Simple CSSOM manipulation of subrules 8 Fail Simple CSSOM manipulation of subrules 9 Fail Simple CSSOM manipulation of subrules 10 -Fail Mutating the selectorText of outer rule invalidates inner rules \ No newline at end of file +Pass Mutating the selectorText of outer rule invalidates inner rules \ No newline at end of file diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp index 2db642ac56ad..1a8ad358753b 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.cpp @@ -34,6 +34,13 @@ void CSSGroupingRule::visit_edges(Cell::Visitor& visitor) visitor.visit(m_rules); } +void CSSGroupingRule::clear_caches() +{ + Base::clear_caches(); + for (auto& rule : *m_rules) + rule->clear_caches(); +} + WebIDL::ExceptionOr CSSGroupingRule::insert_rule(StringView rule, u32 index) { TRY(m_rules->insert_a_css_rule(rule, index)); diff --git a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h index 5a00014733df..20dcc9987ba3 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h @@ -35,6 +35,7 @@ class CSSGroupingRule : public CSSRule { virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; + virtual void clear_caches() override; private: JS::NonnullGCPtr m_rules; diff --git a/Userland/Libraries/LibWeb/CSS/CSSRule.h b/Userland/Libraries/LibWeb/CSS/CSSRule.h index 15a491037aff..caded862ba98 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSRule.h @@ -58,13 +58,13 @@ class CSSRule : public Bindings::PlatformObject { // https://drafts.csswg.org/cssom-1/#serialize-a-css-rule virtual String serialized() const = 0; + virtual void clear_caches(); + protected: explicit CSSRule(JS::Realm&, Type); virtual void visit_edges(Cell::Visitor&) override; - virtual void clear_caches(); - [[nodiscard]] FlyString const& parent_layer_internal_qualified_name() const { if (!m_cached_layer_name.has_value())