/* * Copyright (c) 2025, Aliaksandr Kalenik * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace Web::CSS { enum class ExcludePropertiesNestedInNotPseudoClass : bool { No, Yes, }; enum class InsideNthChildPseudoClass { No, Yes, }; enum class HasArgumentScope : u8 { ChildrenOnly, AllDescendants, NextSiblingOnly, AllFollowingSiblings, Complex, }; struct InvalidationPlan; struct DescendantInvalidationRule { InvalidationSet match_set; bool match_any { false }; NonnullRefPtr payload; bool operator==(DescendantInvalidationRule const&) const; }; enum class SiblingInvalidationReach { Adjacent, Subsequent, }; struct SiblingInvalidationRule { SiblingInvalidationReach reach; InvalidationSet match_set; bool match_any { false }; NonnullRefPtr payload; bool operator==(SiblingInvalidationRule const&) const; }; struct InvalidationPlan final : RefCounted { static NonnullRefPtr create() { return adopt_ref(*new InvalidationPlan); } bool is_empty() const; void include_all_from(InvalidationPlan const&); bool operator==(InvalidationPlan const&) const; bool invalidate_self { false }; bool invalidate_whole_subtree { false }; Vector descendant_rules; Vector sibling_rules; }; struct HasInvalidationMetadata { Selector const* relative_selector { nullptr }; HasArgumentScope scope { HasArgumentScope::Complex }; bool operator==(HasInvalidationMetadata const&) const = default; }; struct StyleInvalidationData; void build_invalidation_sets_for_simple_selector(Selector::SimpleSelector const&, InvalidationSet&, ExcludePropertiesNestedInNotPseudoClass, StyleInvalidationData&, InsideNthChildPseudoClass); struct StyleInvalidationData { HashMap> invalidation_plans; HashMap> ids_used_in_has_selectors; HashMap> class_names_used_in_has_selectors; HashMap> attribute_names_used_in_has_selectors; HashMap> tag_names_used_in_has_selectors; HashMap> pseudo_classes_used_in_has_selectors; void build_invalidation_sets_for_selector(Selector const& selector); }; }