From 021e3f5c7d2ec6aa648451c7aba7c5e14de916cc Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 19 Mar 2025 15:19:00 +0000 Subject: [PATCH] LibWeb/CSS: Generate is_has_allowed_pseudo_element() --- Libraries/LibWeb/CSS/Selector.cpp | 7 ----- Libraries/LibWeb/CSS/Selector.h | 2 -- .../LibWeb/GenerateCSSPseudoElement.cpp | 27 +++++++++++++++++++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Libraries/LibWeb/CSS/Selector.cpp b/Libraries/LibWeb/CSS/Selector.cpp index 563af96677c..2e095ef77da 100644 --- a/Libraries/LibWeb/CSS/Selector.cpp +++ b/Libraries/LibWeb/CSS/Selector.cpp @@ -759,11 +759,4 @@ SelectorList adapt_nested_relative_selector_list(SelectorList const& selectors) return new_list; } -// https://drafts.csswg.org/selectors/#has-allowed-pseudo-element -bool is_has_allowed_pseudo_element(PseudoElement) -{ - // No spec currently defines any pseudo-elements that are allowed in :has() - return false; -} - } diff --git a/Libraries/LibWeb/CSS/Selector.h b/Libraries/LibWeb/CSS/Selector.h index 0effa56ec85..8679aa33331 100644 --- a/Libraries/LibWeb/CSS/Selector.h +++ b/Libraries/LibWeb/CSS/Selector.h @@ -264,8 +264,6 @@ String serialize_a_group_of_selectors(SelectorList const& selectors); SelectorList adapt_nested_relative_selector_list(SelectorList const&); -bool is_has_allowed_pseudo_element(PseudoElement); - } namespace AK { diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoElement.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoElement.cpp index ce630d9b147..cbcb7e1923d 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoElement.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoElement.cpp @@ -72,6 +72,8 @@ enum class PseudoElement : @pseudo_element_underlying_type@ { Optional pseudo_element_from_string(StringView); StringView pseudo_element_name(PseudoElement); +bool is_has_allowed_pseudo_element(PseudoElement); + } )~~~"); @@ -133,6 +135,31 @@ StringView pseudo_element_name(PseudoElement pseudo_element) VERIFY_NOT_REACHED(); } +bool is_has_allowed_pseudo_element(PseudoElement pseudo_element) +{ + switch (pseudo_element) { +)~~~"); + + pseudo_elements_data.for_each_member([&](auto& name, JsonValue const& value) { + auto& pseudo_element = value.as_object(); + if (!pseudo_element.get_bool("is-allowed-in-has"sv).value_or(false)) + return; + + auto member_generator = generator.fork(); + member_generator.set("name:titlecase", title_casify(name)); + + member_generator.append(R"~~~( + case PseudoElement::@name:titlecase@: + return true; +)~~~"); + }); + + generator.append(R"~~~( + default: + return false; + } +} + } )~~~");