From ad1f93504efc136ba64af92717f454bdf9629220 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Thu, 14 Nov 2024 11:22:46 +0000 Subject: [PATCH] LibWeb/CSS: Make `:has()` take a `` The spec changed this at some point. --- .../LibWeb/CSS/Parser/SelectorParsing.cpp | 6 ++++- Libraries/LibWeb/CSS/PseudoClasses.json | 2 +- Libraries/LibWeb/Dump.cpp | 1 + .../LibWeb/GenerateCSSPseudoClass.cpp | 3 +++ .../expected/css/invalid-selector-in-has.txt | 1 + .../invalidation/has-with-pseudo-class.txt | 24 +++++++++---------- .../input/css/invalid-selector-in-has.html | 17 +++++++++++++ 7 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/css/invalid-selector-in-has.txt create mode 100644 Tests/LibWeb/Text/input/css/invalid-selector-in-has.html diff --git a/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp b/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp index 79734280fe2..37765626c38 100644 --- a/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/SelectorParsing.cpp @@ -641,9 +641,13 @@ Parser::ParseErrorOr Parser::parse_pseudo_simple_selec .languages = move(languages) } }; } + case PseudoClassMetadata::ParameterType::RelativeSelectorList: case PseudoClassMetadata::ParameterType::SelectorList: { auto function_token_stream = TokenStream(pseudo_function.value); - auto not_selector = TRY(parse_a_selector_list(function_token_stream, SelectorType::Standalone)); + auto selector_type = metadata.parameter_type == PseudoClassMetadata::ParameterType::SelectorList + ? SelectorType::Standalone + : SelectorType::Relative; + auto not_selector = TRY(parse_a_selector_list(function_token_stream, selector_type)); return Selector::SimpleSelector { .type = Selector::SimpleSelector::Type::PseudoClass, diff --git a/Libraries/LibWeb/CSS/PseudoClasses.json b/Libraries/LibWeb/CSS/PseudoClasses.json index 6a199cc2b99..122af6a678e 100644 --- a/Libraries/LibWeb/CSS/PseudoClasses.json +++ b/Libraries/LibWeb/CSS/PseudoClasses.json @@ -45,7 +45,7 @@ "argument": "" }, "has": { - "argument": "" + "argument": "" }, "host": { "argument": "?" diff --git a/Libraries/LibWeb/Dump.cpp b/Libraries/LibWeb/Dump.cpp index 7de37a60911..a8e67104934 100644 --- a/Libraries/LibWeb/Dump.cpp +++ b/Libraries/LibWeb/Dump.cpp @@ -545,6 +545,7 @@ void dump_selector(StringBuilder& builder, CSS::Selector const& selector, int in case CSS::PseudoClassMetadata::ParameterType::CompoundSelector: case CSS::PseudoClassMetadata::ParameterType::ForgivingSelectorList: case CSS::PseudoClassMetadata::ParameterType::ForgivingRelativeSelectorList: + case CSS::PseudoClassMetadata::ParameterType::RelativeSelectorList: case CSS::PseudoClassMetadata::ParameterType::SelectorList: { builder.append("([\n"sv); for (auto& child_selector : pseudo_class.argument_selector_list) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp index de23aafc07d..ba064ca9bf4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateCSSPseudoClass.cpp @@ -75,6 +75,7 @@ struct PseudoClassMetadata { ForgivingRelativeSelectorList, Ident, LanguageRanges, + RelativeSelectorList, SelectorList, } parameter_type; bool is_valid_as_function; @@ -174,6 +175,8 @@ PseudoClassMetadata pseudo_class_metadata(PseudoClass pseudo_class) parameter_type = "Ident"_string; } else if (argument_string == ""sv) { parameter_type = "LanguageRanges"_string; + } else if (argument_string == ""sv) { + parameter_type = "RelativeSelectorList"_string; } else if (argument_string == ""sv) { parameter_type = "SelectorList"_string; } else { diff --git a/Tests/LibWeb/Text/expected/css/invalid-selector-in-has.txt b/Tests/LibWeb/Text/expected/css/invalid-selector-in-has.txt new file mode 100644 index 00000000000..f3d66c7fe75 --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/invalid-selector-in-has.txt @@ -0,0 +1 @@ +:has(:yakthonk) should be invalid: PASS diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/selectors/invalidation/has-with-pseudo-class.txt b/Tests/LibWeb/Text/expected/wpt-import/css/selectors/invalidation/has-with-pseudo-class.txt index 4fe542bec83..ed5f79c044d 100644 --- a/Tests/LibWeb/Text/expected/wpt-import/css/selectors/invalidation/has-with-pseudo-class.txt +++ b/Tests/LibWeb/Text/expected/wpt-import/css/selectors/invalidation/has-with-pseudo-class.txt @@ -6,8 +6,8 @@ Rerun Found 41 tests -31 Pass -10 Fail +37 Pass +4 Fail Details Result Test Name MessagePass Before set checked on checkbox, testing subject Pass Set checked on checkbox, testing subject @@ -29,24 +29,24 @@ Pass Unset disabled on option, testing subject3 Pass Before set disabled on optgroup, testing subject Pass Set disabled on optgroup, testing subject Pass Unset disabled on optgroup, testing subject -Fail Before set disabled on optgroup, testing subject2 +Pass Before set disabled on optgroup, testing subject2 Pass Set disabled on optgroup, testing subject2 -Fail Unset disabled on optgroup, testing subject2 +Pass Unset disabled on optgroup, testing subject2 Pass Before set disabled on optgroup, testing subject3 Pass Set disabled on optgroup, testing subject3 Pass Unset disabled on optgroup, testing subject3 -Fail Before set disabled on optgroup, testing subject4 +Pass Before set disabled on optgroup, testing subject4 Pass Set disabled on optgroup, testing subject4 -Fail Unset disabled on optgroup, testing subject4 +Pass Unset disabled on optgroup, testing subject4 Pass Before setting value of text_input, testing subject Fail Set value of text_input, testing subject Pass Clear value of text_input, testing subject -Fail Before setting value of text_input, testing subject2 -Pass Set value of text_input, testing subject2 -Fail Clear value of text_input, testing subject2 +Pass Before setting value of text_input, testing subject2 +Fail Set value of text_input, testing subject2 +Pass Clear value of text_input, testing subject2 Pass Before setting value of text_input, testing subject3 Fail Set value of text_input, testing subject3 Pass Clear value of text_input, testing subject3 -Fail Before setting value of text_input, testing subject4 -Pass Set value of text_input, testing subject4 -Fail Clear value of text_input, testing subject4 \ No newline at end of file +Pass Before setting value of text_input, testing subject4 +Fail Set value of text_input, testing subject4 +Pass Clear value of text_input, testing subject4 \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/css/invalid-selector-in-has.html b/Tests/LibWeb/Text/input/css/invalid-selector-in-has.html new file mode 100644 index 00000000000..9c6be65e13b --- /dev/null +++ b/Tests/LibWeb/Text/input/css/invalid-selector-in-has.html @@ -0,0 +1,17 @@ + + + +