Skip to content

Commit

Permalink
[@scope] Pass TreeScope separately to SelectorChecker
Browse files Browse the repository at this point in the history
The `scope` member of SelectorCheckingContext is currently used
for several closely related (but different) things, causing subtle
bugs and a hard-to-understand model.

To address this, pass the TreeScope to SelectorChecker separately,
and use context.tree_scope for ShadowRoot-dependent decisions
in selector matching.

The `context.scope` field is now only used for two things:

 1. For matching the :scope pseudo-class.
 2. For creating the default activation for @scope.

This fixes Issue 377647716, because since we no longer "clobber"
context.scope during scope activation, making ParentElement
traverse to the shadow host.

Fixed: 377647716
Change-Id: I833f1dfb03c092927712bc6fd649a414a45ac7a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6035173
Reviewed-by: Rune Lillesveen <[email protected]>
Commit-Queue: Anders Hartvoll Ruud <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1386249}
  • Loading branch information
andruud authored and chromium-wpt-export-bot committed Nov 21, 2024
1 parent 398d2d7 commit 420f1a4
Showing 1 changed file with 72 additions and 0 deletions.
72 changes: 72 additions & 0 deletions css/css-cascade/scope-shadow.html
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,75 @@
assert_equals(getComputedStyle(a).zIndex, '2');
}, 'Implicit @scope in construted stylesheet');
</script>

<div id=scope_via_parent_pseudo_subject>
<div class=host>
<template shadowrootmode=open>
<style>
@scope (:host) {
:scope {
& {
z-index: 1;
}
}
}
</style>
</template>
</div>
</div>
<script>
test(() => {
let host = scope_via_parent_pseudo_subject.querySelector('.host');
assert_equals(getComputedStyle(host).zIndex, '1');
}, 'Matching :host via &, :scope (subject)');
</script>

<div id=scope_via_parent_pseudo_non_subject>
<div class=host>
<template shadowrootmode=open>
<style>
@scope (:host) {
:scope .a {
& {
z-index: 1;
}
}
}
</style>
<div class=a>
</div>
</template>
</div>
</div>
<script>
test(() => {
let host = scope_via_parent_pseudo_non_subject.querySelector('.host');
let a = host.shadowRoot.querySelector('.a');
assert_equals(getComputedStyle(a).zIndex, '1');
}, 'Matching :host via &, :scope (non-subject)');
</script>

<div id=scope_via_parent_pseudo_non_subject_child>
<div class=host>
<template shadowrootmode=open>
<style>
@scope (:host) {
:scope > .a {
& {
z-index: 1;
}
}
}
</style>
<div class=a>
</div>
</template>
</div>
</div>
<script>
test(() => {
let host = scope_via_parent_pseudo_non_subject_child.querySelector('.host');
let a = host.shadowRoot.querySelector('.a');
assert_equals(getComputedStyle(a).zIndex, '1');
}, 'Matching :host via &, :scope (non-subject, >)');
</script>

0 comments on commit 420f1a4

Please sign in to comment.