tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5007737be262f4862e79c097810a915409e79fe4
parent 07f7f784b0cdf126477f2d05b62c9b95f8d815e8
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Tue, 25 Nov 2025 10:25:04 +0000

Bug 2001879 - Don't allow :has() after pseudo-like things. r=jwatt

If it worked correctly, it would expose the shadow tree
structure of the part.

Add a test for ::slotted() too and clean up shadow part
test expectations while at it.

Differential Revision: https://phabricator.services.mozilla.com/D273741

Diffstat:
Mservo/components/selectors/parser.rs | 2+-
Dtesting/web-platform/meta/css/css-scoping/slotted-parsing.html.ini | 20--------------------
Dtesting/web-platform/meta/css/css-shadow-parts/animation-part.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/different-host.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/double-forward.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/exportparts-multiple.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/host-part-001.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/idlharness.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/inner-host.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-change-exportparts-forward.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-forward.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector-forward.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/invalidation-part-pseudo.html.ini | 7-------
Dtesting/web-platform/meta/css/css-shadow-parts/multiple-parts.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/part-name-idl.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/precedence-part-vs-part.html.ini | 3---
Mtesting/web-platform/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/serialization.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-forward-shorthand.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-forward.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-important-important.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-important-inline.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-important.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple-inline.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/simple.html.ini | 3---
Dtesting/web-platform/meta/css/css-shadow-parts/style-sharing.html.ini | 3---
Mtesting/web-platform/tests/css/css-scoping/slotted-parsing.html | 1+
32 files changed, 2 insertions(+), 112 deletions(-)

diff --git a/servo/components/selectors/parser.rs b/servo/components/selectors/parser.rs @@ -3437,7 +3437,7 @@ where Impl: SelectorImpl, { debug_assert!(parser.parse_has()); - if state.intersects(SelectorParsingState::DISALLOW_RELATIVE_SELECTOR) { + if state.intersects(SelectorParsingState::DISALLOW_RELATIVE_SELECTOR | SelectorParsingState::AFTER_PSEUDO) { return Err(input.new_custom_error(SelectorParseErrorKind::InvalidState)); } // Nested `:has()` is disallowed, mark it as such. diff --git a/testing/web-platform/meta/css/css-scoping/slotted-parsing.html.ini b/testing/web-platform/meta/css/css-scoping/slotted-parsing.html.ini @@ -1,20 +0,0 @@ -[slotted-parsing.html] - ["::slotted(*):is(:hover)" should be a valid selector] - expected: - if (os == "mac") and not debug: [PASS, FAIL] - - ["::slotted(*):is(#id)" should be a valid selector] - expected: - if (os == "mac") and not debug: [PASS, FAIL] - - ["::slotted(*):where(:hover)" should be a valid selector] - expected: - if (os == "mac") and not debug: [PASS, FAIL] - - ["::slotted(*):where(#id)" should be a valid selector] - expected: - if (os == "mac") and not debug: [PASS, FAIL] - - ["::slotted(*):where(::before)" should be a valid selector] - expected: - if (os == "mac") and not debug: [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-shadow-parts/animation-part.html.ini b/testing/web-platform/meta/css/css-shadow-parts/animation-part.html.ini @@ -1,3 +0,0 @@ -[animation-part.html] - expected: - if (os == "win") and not debug: [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-shadow-parts/different-host.html.ini b/testing/web-platform/meta/css/css-shadow-parts/different-host.html.ini @@ -1,3 +0,0 @@ -[different-host.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/double-forward.html.ini b/testing/web-platform/meta/css/css-shadow-parts/double-forward.html.ini @@ -1,3 +0,0 @@ -[double-forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/exportparts-multiple.html.ini b/testing/web-platform/meta/css/css-shadow-parts/exportparts-multiple.html.ini @@ -1,3 +0,0 @@ -[exportparts-multiple.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/host-part-001.html.ini b/testing/web-platform/meta/css/css-shadow-parts/host-part-001.html.ini @@ -1,3 +0,0 @@ -[host-part-001.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/idlharness.html.ini b/testing/web-platform/meta/css/css-shadow-parts/idlharness.html.ini @@ -1,3 +0,0 @@ -[idlharness.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/inner-host.html.ini b/testing/web-platform/meta/css/css-shadow-parts/inner-host.html.ini @@ -1,3 +0,0 @@ -[inner-host.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini b/testing/web-platform/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini @@ -1,3 +0,0 @@ -[interaction-with-pseudo-elements.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-exportparts-forward.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-exportparts-forward.html.ini @@ -1,3 +0,0 @@ -[invalidation-change-exportparts-forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-forward.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-forward.html.ini @@ -1,3 +0,0 @@ -[invalidation-change-part-name-forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-domtokenlist.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-setter.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-change-part-name.html.ini @@ -1,3 +0,0 @@ -[invalidation-change-part-name.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector-forward.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector-forward.html.ini @@ -1,3 +0,0 @@ -[invalidation-complex-selector-forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini @@ -1,3 +0,0 @@ -[invalidation-complex-selector.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/invalidation-part-pseudo.html.ini b/testing/web-platform/meta/css/css-shadow-parts/invalidation-part-pseudo.html.ini @@ -1,7 +0,0 @@ -[invalidation-part-pseudo.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [Invalidation of nested part on hover] - expected: - if (os == "mac") and not debug: [PASS, FAIL] - if (os == "linux") and not debug: [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-shadow-parts/multiple-parts.html.ini b/testing/web-platform/meta/css/css-shadow-parts/multiple-parts.html.ini @@ -1,3 +0,0 @@ -[multiple-parts.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/part-name-idl.html.ini b/testing/web-platform/meta/css/css-shadow-parts/part-name-idl.html.ini @@ -1,3 +0,0 @@ -[part-name-idl.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/precedence-part-vs-part.html.ini b/testing/web-platform/meta/css/css-shadow-parts/precedence-part-vs-part.html.ini @@ -1,3 +0,0 @@ -[precedence-part-vs-part.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini b/testing/web-platform/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini @@ -17,8 +17,5 @@ ["::part(mypart):xr-overlay" should be a valid selector] expected: FAIL - ["::part(mypart):has(:hover)" should be an invalid selector] - expected: FAIL - ["::part(mypart):active-view-transition-type(mytype)" should be a valid selector] expected: FAIL diff --git a/testing/web-platform/meta/css/css-shadow-parts/serialization.html.ini b/testing/web-platform/meta/css/css-shadow-parts/serialization.html.ini @@ -1,3 +0,0 @@ -[serialization.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-forward-shorthand.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-forward-shorthand.html.ini @@ -1,3 +0,0 @@ -[simple-forward-shorthand.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-forward.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-forward.html.ini @@ -1,3 +0,0 @@ -[simple-forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-important-important.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-important-important.html.ini @@ -1,3 +0,0 @@ -[simple-important-important.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-important-inline.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-important-inline.html.ini @@ -1,3 +0,0 @@ -[simple-important-inline.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-important.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-important.html.ini @@ -1,3 +0,0 @@ -[simple-important.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple-inline.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple-inline.html.ini @@ -1,3 +0,0 @@ -[simple-inline.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/simple.html.ini b/testing/web-platform/meta/css/css-shadow-parts/simple.html.ini @@ -1,3 +0,0 @@ -[simple.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-shadow-parts/style-sharing.html.ini b/testing/web-platform/meta/css/css-shadow-parts/style-sharing.html.ini @@ -1,3 +0,0 @@ -[style-sharing.html] - expected: - if (os == "win") and not debug and (processor == "x86_64"): [OK, CRASH] diff --git a/testing/web-platform/tests/css/css-scoping/slotted-parsing.html b/testing/web-platform/tests/css/css-scoping/slotted-parsing.html @@ -16,6 +16,7 @@ test_invalid_selector("::slotted(*)[attr]"); test_invalid_selector("::slotted(*):host"); test_invalid_selector("::slotted(*):host(div)"); + test_invalid_selector("::slotted(*):has(span)"); test_invalid_selector("::slotted(*):hover"); test_invalid_selector("::slotted(*):read-only"); test_invalid_selector("::slotted(*)::slotted(*)");