/* * 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, }; struct InvalidationPlan; struct DescendantInvalidationRule { InvalidationSet match_set; bool match_any { false }; NonnullRefPtr payload; }; enum class SiblingInvalidationReach { Adjacent, Subsequent, }; struct SiblingInvalidationRule { SiblingInvalidationReach reach; InvalidationSet match_set; bool match_any { false }; NonnullRefPtr payload; }; struct InvalidationPlan final : RefCounted { static NonnullRefPtr create() { return adopt_ref(*new InvalidationPlan); } bool is_empty() const; void include_all_from(InvalidationPlan const&); bool invalidate_self { false }; bool invalidate_whole_subtree { false }; Vector descendant_rules; Vector sibling_rules; }; struct StyleInvalidationData; void build_invalidation_sets_for_simple_selector(Selector::SimpleSelector const&, InvalidationSet&, ExcludePropertiesNestedInNotPseudoClass, StyleInvalidationData&, InsideNthChildPseudoClass); struct StyleInvalidationData { HashMap> invalidation_plans; HashTable ids_used_in_has_selectors; HashTable class_names_used_in_has_selectors; HashTable attribute_names_used_in_has_selectors; HashTable tag_names_used_in_has_selectors; HashTable pseudo_classes_used_in_has_selectors; void build_invalidation_sets_for_selector(Selector const& selector); }; }