From 0b23dddb4bc5e07c40a15e0e80987671e4807153 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 84299b8c6e1..d18a98339e2 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 2db642ac56a..1a8ad358753 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 5a00014733d..20dcc9987ba 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSGroupingRule.h @@ -35,6 +35,7 @@ protected: 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 15a491037af..caded862ba9 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSRule.h +++ b/Userland/Libraries/LibWeb/CSS/CSSRule.h @@ -58,13 +58,13 @@ public: // 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())