diff --git a/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.cpp b/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.cpp index f57eae9d6888..6d9d3b3da937 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.cpp +++ b/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.cpp @@ -7,6 +7,7 @@ #include "CSSNestedDeclarations.h" #include #include +#include namespace Web::CSS { @@ -34,6 +35,7 @@ void CSSNestedDeclarations::visit_edges(Cell::Visitor& visitor) { Base::visit_edges(visitor); visitor.visit(m_declaration); + visitor.visit(m_parent_style_rule); } CSSStyleDeclaration* CSSNestedDeclarations::style() @@ -41,6 +43,22 @@ CSSStyleDeclaration* CSSNestedDeclarations::style() return m_declaration; } +CSSStyleRule const& CSSNestedDeclarations::parent_style_rule() const +{ + if (m_parent_style_rule) + return *m_parent_style_rule; + + for (auto* parent = parent_rule(); parent; parent = parent->parent_rule()) { + if (is(parent)) { + m_parent_style_rule = static_cast(parent); + return *m_parent_style_rule; + } + } + + dbgln("CSSNestedDeclarations has no parent style rule!"); + VERIFY_NOT_REACHED(); +} + String CSSNestedDeclarations::serialized() const { // NOTE: There's no proper spec for this yet, only this note: @@ -50,4 +68,10 @@ String CSSNestedDeclarations::serialized() const return m_declaration->serialized(); } +void CSSNestedDeclarations::clear_caches() +{ + Base::clear_caches(); + m_parent_style_rule = nullptr; +} + } diff --git a/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.h b/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.h index 134c55e80040..581cde36c9d0 100644 --- a/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.h +++ b/Userland/Libraries/LibWeb/CSS/CSSNestedDeclarations.h @@ -23,14 +23,18 @@ class CSSNestedDeclarations final : public CSSRule { CSSStyleDeclaration* style(); + CSSStyleRule const& parent_style_rule() const; + private: CSSNestedDeclarations(JS::Realm&, PropertyOwningCSSStyleDeclaration&); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; virtual String serialized() const override; + virtual void clear_caches() override; JS::NonnullGCPtr m_declaration; + JS::GCPtr mutable m_parent_style_rule; }; template<> diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index f96349ac8277..61c03d1ac17c 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -111,7 +111,7 @@ SelectorList const& MatchingRule::absolutized_selectors() const if (rule->type() == CSSRule::Type::Style) return static_cast(*rule).absolutized_selectors(); if (rule->type() == CSSRule::Type::NestedDeclarations) - return static_cast(*rule->parent_rule()).absolutized_selectors(); + return static_cast(*rule).parent_style_rule().absolutized_selectors(); VERIFY_NOT_REACHED(); } @@ -120,7 +120,7 @@ FlyString const& MatchingRule::qualified_layer_name() const if (rule->type() == CSSRule::Type::Style) return static_cast(*rule).qualified_layer_name(); if (rule->type() == CSSRule::Type::NestedDeclarations) - return static_cast(*rule->parent_rule()).qualified_layer_name(); + return static_cast(*rule).parent_style_rule().qualified_layer_name(); VERIFY_NOT_REACHED(); } @@ -2462,7 +2462,7 @@ NonnullOwnPtr StyleComputer::make_rule_cache_for_casca if (rule.type() == CSSRule::Type::Style) return static_cast(rule).absolutized_selectors(); if (rule.type() == CSSRule::Type::NestedDeclarations) - return static_cast(*rule.parent_rule()).absolutized_selectors(); + return static_cast(rule).parent_style_rule().absolutized_selectors(); VERIFY_NOT_REACHED(); }(); for (CSS::Selector const& selector : absolutized_selectors) {