/* * Copyright (c) 2026, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::CSS { // https://drafts.csswg.org/css-cascade-6/#the-cssscoperule-interface class CSSScopeRule final : public CSSGroupingRule { WEB_PLATFORM_OBJECT(CSSScopeRule, CSSGroupingRule); GC_DECLARE_ALLOCATOR(CSSScopeRule); public: [[nodiscard]] static GC::Ref create(JS::Realm&, Optional&& start_selectors, Optional&& end_selectors, CSSRuleList&); virtual ~CSSScopeRule() override; Optional const& start_selectors() const { return m_start_selectors; } Optional const& end_selectors() const { return m_end_selectors; } Optional const& start_selectors_for_matching() const; Optional const& end_selectors_for_matching() const; GC::Ptr nearest_ancestor_scope_rule() const; Optional start() const; Optional end() const; private: CSSScopeRule(JS::Realm&, Optional&& start_selectors, Optional&& end_selectors, CSSRuleList&); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; virtual void clear_caches() override; virtual String serialized() const override; virtual void dump(StringBuilder&, int indent_levels) const override; Optional m_start_selectors; Optional m_end_selectors; mutable Optional m_cached_start_selectors_for_matching; mutable Optional m_cached_end_selectors_for_matching; mutable Optional> m_cached_nearest_ancestor_scope_rule; }; template<> inline bool CSSRule::fast_is() const { return type() == CSSRule::Type::Scope; } }