mirror of
https://github.com/HeyPuter/firefox.git
synced 2026-11-13 20:14:57 -10:00
Automatic update from web-platform-tests [@scope] Pass TreeScope separately to SelectorChecker 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} -- wpt-commits: 420f1a49e1c70dd99bf8223249c8d4b6679bb87e wpt-pr: 49312
234 lines
5.4 KiB
HTML
234 lines
5.4 KiB
HTML
<!DOCTYPE html>
|
|
<title>@scope - ShadowDOM</title>
|
|
<link rel="help" href="https://drafts.csswg.org/css-cascade-6/#scope-atrule">
|
|
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/9025">
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
|
|
<div id=host_plain>
|
|
<template shadowrootmode=open>
|
|
<style>
|
|
@scope (:host) {
|
|
.a {
|
|
z-index: 1;
|
|
}
|
|
}
|
|
</style>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
let a = host_plain.shadowRoot.querySelector('.a');
|
|
assert_equals(getComputedStyle(a).zIndex, '1');
|
|
}, '@scope can match :host');
|
|
</script>
|
|
|
|
<div id=host_functional>
|
|
<template shadowrootmode=open>
|
|
<style>
|
|
@scope (:host(div)) {
|
|
.a {
|
|
z-index: 1;
|
|
}
|
|
}
|
|
/* Should not match: */
|
|
@scope (:host(span)) {
|
|
.a {
|
|
z-index: 42;
|
|
}
|
|
}
|
|
</style>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
let a = host_functional.shadowRoot.querySelector('.a');
|
|
assert_equals(getComputedStyle(a).zIndex, '1');
|
|
}, '@scope can match :host(...)');
|
|
</script>
|
|
|
|
<div id=host_scope_subject>
|
|
<template shadowrootmode=open>
|
|
<style>
|
|
@scope (:host) {
|
|
:scope {
|
|
z-index: 1;
|
|
}
|
|
}
|
|
</style>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
assert_equals(getComputedStyle(host_scope_subject).zIndex, '1');
|
|
}, ':scope matches host via the scoping root');
|
|
</script>
|
|
|
|
<div id=host_scope_subject_is>
|
|
<div class=host>
|
|
<template shadowrootmode=open>
|
|
<style>
|
|
/* Should not match host, nor outside shadow. */
|
|
:is(:scope, .a, .host) {
|
|
z-index: 2;
|
|
}
|
|
|
|
@scope (:host) {
|
|
:is(:scope, .a) {
|
|
z-index: 1;
|
|
}
|
|
}
|
|
</style>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
<div class=a>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
let host = host_scope_subject_is.querySelector('.host');
|
|
assert_equals(getComputedStyle(host).zIndex, '1');
|
|
let a = host.shadowRoot.querySelector('.a');
|
|
assert_equals(getComputedStyle(a).zIndex, '1');
|
|
|
|
let a_outside = host_scope_subject_is.querySelector('.a');
|
|
assert_equals(getComputedStyle(a_outside).zIndex, 'auto');
|
|
}, ':scope within :is() matches host via the scoping root');
|
|
</script>
|
|
|
|
<div id=implicit_scope_shadow_parent>
|
|
<div class=host>
|
|
<template shadowrootmode=open>
|
|
<style>
|
|
@scope {
|
|
/* Matches host */
|
|
:scope {
|
|
z-index: 1;
|
|
}
|
|
:scope > .a {
|
|
z-index: 2;
|
|
}
|
|
}
|
|
</style>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
let host = implicit_scope_shadow_parent.querySelector('.host');
|
|
let a = host.shadowRoot.querySelector('.a');
|
|
assert_equals(getComputedStyle(host).zIndex, '1');
|
|
assert_equals(getComputedStyle(a).zIndex, '2');
|
|
}, 'Implicit @scope as direct child of shadow root');
|
|
</script>
|
|
|
|
<div id=implicit_scope_constructed>
|
|
<div class=host>
|
|
<template shadowrootmode=open>
|
|
<div class=a>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
test(() => {
|
|
let host = implicit_scope_constructed.querySelector('.host');
|
|
let sheet = new CSSStyleSheet();
|
|
sheet.replaceSync(`
|
|
@scope {
|
|
:scope {
|
|
z-index: 1;
|
|
}
|
|
:scope .a {
|
|
z-index: 2;
|
|
}
|
|
`);
|
|
host.shadowRoot.adoptedStyleSheets = [sheet];
|
|
let a = host.shadowRoot.querySelector('.a');
|
|
assert_equals(getComputedStyle(host).zIndex, '1');
|
|
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>
|