Skip to content

Commit

Permalink
Wrong specificity of :has() pseudo-classes
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=242328

Reviewed by Simon Fraser.

* LayoutTests/imported/w3c/web-platform-tests/css/selectors/has-specificity-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/selectors/has-specificity.html:
* Source/WebCore/css/CSSSelector.cpp:
(WebCore::simpleSelectorSpecificityInternal):

We insert a fake scope pseudo-class to the relative :has() argument and that ends up incrementing the specificity
as if it was a real pseudo-class. Fix by making its specificity 0.

Canonical link: https://commits.webkit.org/252140@main
  • Loading branch information
anttijk committed Jul 5, 2022
1 parent 031decc commit 7af18ef
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 3 deletions.
Expand Up @@ -5,4 +5,6 @@ PASS :has(.bar, #foo) has same specificity as :has(#foo, .bar)
PASS :has(.bar, #foo) wins over :has(.foo, .bar)
PASS :has(span + span) wins over :has(span)
PASS :has(span, li, p) wins over :has(span, lo, p)
PASS latter .baz wins over :has(.foo)
PASS latter :has(.foo) wins over .baz

Expand Up @@ -21,9 +21,15 @@

main :has(span, li, #foo) { --t5:PASS; }
main :has(span, li, p) { --t5:FAIL; }

main div:has(.foo) { --t6:FAIL; }
main div.baz { --t6:PASS; }

main div.baz { --t7:FAIL; }
main div:has(.foo) { --t7:PASS; }
</style>
<main id=main>
<div id=div><p><span id=foo class=foo></span><span class=bar></span><li></li></p></div>
<div id=div class=baz><p><span id=foo class=foo></span><span class=bar></span><li></li></p></div>
</main>
<script>
function test_value(name, description) {
Expand All @@ -39,4 +45,6 @@
test_value('--t3', ':has(.bar, #foo) wins over :has(.foo, .bar)');
test_value('--t4', ':has(span + span) wins over :has(span)');
test_value('--t5', ':has(span, li, p) wins over :has(span, lo, p)');
test_value('--t6', 'latter .baz wins over :has(.foo)');
test_value('--t7', 'latter :has(.foo) wins over .baz');
</script>
5 changes: 3 additions & 2 deletions Source/WebCore/css/CSSSelector.cpp
Expand Up @@ -133,10 +133,11 @@ static unsigned simpleSelectorSpecificityInternal(const CSSSelector& simpleSelec
case CSSSelector::PseudoClassNthLastChild:
case CSSSelector::PseudoClassHost:
return CSSSelector::addSpecificities(static_cast<unsigned>(SelectorSpecificityIncrement::ClassB), simpleSelector.selectorList() ? maxSpecificity(*simpleSelector.selectorList()) : 0);
case CSSSelector::PseudoClassRelativeScope:
return 0;
default:
break;
return static_cast<unsigned>(SelectorSpecificityIncrement::ClassB);
}
return static_cast<unsigned>(SelectorSpecificityIncrement::ClassB);
case CSSSelector::Exact:
case CSSSelector::Class:
case CSSSelector::Set:
Expand Down

0 comments on commit 7af18ef

Please sign in to comment.