LibWeb/CSS: Make :has() take a <relative-selector-list>

The spec changed this at some point.
This commit is contained in:
Sam Atkins 2024-11-14 11:22:46 +00:00 committed by Andreas Kling
parent a94282e0e8
commit ad1f93504e
Notes: github-actions[bot] 2024-11-14 19:08:42 +00:00
7 changed files with 40 additions and 14 deletions

View file

@ -641,9 +641,13 @@ Parser::ParseErrorOr<Selector::SimpleSelector> 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,

View file

@ -45,7 +45,7 @@
"argument": ""
},
"has": {
"argument": "<forgiving-relative-selector-list>"
"argument": "<relative-selector-list>"
},
"host": {
"argument": "<compound-selector>?"

View file

@ -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)

View file

@ -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 == "<language-ranges>"sv) {
parameter_type = "LanguageRanges"_string;
} else if (argument_string == "<relative-selector-list>"sv) {
parameter_type = "RelativeSelectorList"_string;
} else if (argument_string == "<selector-list>"sv) {
parameter_type = "SelectorList"_string;
} else {

View file

@ -0,0 +1 @@
:has(:yakthonk) should be invalid: PASS

View file

@ -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
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

View file

@ -0,0 +1,17 @@
<!DOCTYPE html>
<style id="style"></style>
<script src="../include.js"></script>
<script>
test(() => {
let selectors = [
":has(:yakthonk)",
];
let style = document.getElementById("style");
for (let selector of selectors) {
style.innerText = `${selector} { color: red; }`;
println(`${selector} should be invalid: ${style.sheet.cssRules.length === 0 ? "PASS" : "FAIL"}`);
}
});
</script>