From 0fa3de3937b96eb6f61a52b6498d6bc772410899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BClker?= Date: Mon, 9 Jun 2025 12:17:28 +0200 Subject: [PATCH] Support `::part` selector (#37307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is pretty much just wiring up the necessary stylo methods. Note that the `exportparts` attribute is not yet supported, I'll do that in a followup change Testing: Covered by existing web platform tests. This is the first half of https://github.com/servo/servo/issues/35349 Fixes https://github.com/servo/servo/issues/37325 --------- Signed-off-by: Simon Wülker --- Cargo.lock | 44 ++++----- components/script/dom/element.rs | 47 +++++++-- components/script/dom/htmlelement.rs | 2 +- components/script/dom/node.rs | 9 +- components/script/dom/raredata.rs | 7 ++ components/script/layout_dom/element.rs | 30 +++++- components/script/layout_dom/node.rs | 8 +- .../script_bindings/webidls/Element.webidl | 5 + .../parsing/highlight-pseudos.html.ini | 3 - .../css/css-shadow-parts/all-hosts.html.ini | 6 -- .../css-shadow-parts/animation-part.html.ini | 2 +- .../complex-matching.html.ini | 3 - .../grouping-with-checked.html.ini | 9 -- .../grouping-with-disabled.html.ini | 12 --- .../css-shadow-parts/host-part-001.html.ini | 3 - .../css-shadow-parts/host-part-002.html.ini | 3 - .../host-part-nesting.html.ini | 3 - .../css/css-shadow-parts/idlharness.html.ini | 12 --- .../css/css-shadow-parts/inner-host.html.ini | 3 - .../interaction-with-pseudo-elements.html.ini | 9 -- ...change-part-name-idl-domtokenlist.html.ini | 3 - ...ation-change-part-name-idl-setter.html.ini | 3 - .../invalidation-complex-selector.html.ini | 3 - .../css-shadow-parts/multiple-parts.html.ini | 3 - .../css-shadow-parts/part-name-idl.html.ini | 12 --- .../part-nested-pseudo.html.ini | 2 - .../pseudo-classes-after-part.html.ini | 99 ------------------- .../pseudo-elements-after-part.html.ini | 27 ----- .../css-shadow-parts/serialization.html.ini | 9 -- .../css-shadow-parts/simple-inline.html.ini | 3 - .../meta/css/css-shadow-parts/simple.html.ini | 3 - .../css-shadow-parts/style-sharing.html.ini | 3 - .../invalidation/part-pseudo.html.ini | 2 - .../selectors/parsing/parse-is-where.html.ini | 12 --- .../css/selectors/parsing/parse-part.html.ini | 57 ----------- ...etParent-across-shadow-boundaries.html.ini | 6 ++ 36 files changed, 119 insertions(+), 348 deletions(-) delete mode 100644 tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/serialization.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/simple.html.ini delete mode 100644 tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini delete mode 100644 tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini delete mode 100644 tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini create mode 100644 tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini diff --git a/Cargo.lock b/Cargo.lock index b628ab3bfe3..8bedbdda50c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1070,7 +1070,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -2025,7 +2025,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2599,7 +2599,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4051,7 +4051,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi 0.5.0", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4313,7 +4313,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -6308,7 +6308,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6653,7 +6653,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.28.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "bitflags 2.9.1", "cssparser", @@ -6948,7 +6948,7 @@ dependencies = [ [[package]] name = "servo_arc" version = "0.4.1" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "serde", "stable_deref_trait", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "stylo" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "arrayvec", @@ -7467,7 +7467,7 @@ dependencies = [ [[package]] name = "stylo_atoms" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "string_cache", "string_cache_codegen", @@ -7476,12 +7476,12 @@ dependencies = [ [[package]] name = "stylo_config" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" [[package]] name = "stylo_derive" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "darling", "proc-macro2", @@ -7493,7 +7493,7 @@ dependencies = [ [[package]] name = "stylo_dom" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "bitflags 2.9.1", "stylo_malloc_size_of", @@ -7502,7 +7502,7 @@ dependencies = [ [[package]] name = "stylo_malloc_size_of" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "cssparser", @@ -7519,12 +7519,12 @@ dependencies = [ [[package]] name = "stylo_static_prefs" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" [[package]] name = "stylo_traits" version = "0.3.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "app_units", "bitflags 2.9.1", @@ -7698,7 +7698,7 @@ dependencies = [ "getrandom 0.2.16", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7933,7 +7933,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "to_shmem" version = "0.2.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "cssparser", "servo_arc", @@ -7946,7 +7946,7 @@ dependencies = [ [[package]] name = "to_shmem_derive" version = "0.1.0" -source = "git+https://github.com/servo/stylo?branch=2025-05-01#945b70e9a1984cd44ee56b7a674c302b19a4f620" +source = "git+https://github.com/servo/stylo?branch=2025-05-01#2954cec3ae951723f9b346d8720010d30072b725" dependencies = [ "darling", "proc-macro2", @@ -8745,9 +8745,9 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9c5f0bc545ea3b20b423e33b9b457764de0b3730cd957f6c6aa6c301785f6e" +checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" dependencies = [ "phf", "phf_codegen", @@ -9132,7 +9132,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 961fb92121d..1fe51407638 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -861,8 +861,14 @@ pub(crate) fn get_attr_for_layout<'dom>( pub(crate) trait LayoutElementHelpers<'dom> { fn attrs(self) -> &'dom [LayoutDom<'dom, Attr>]; - fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool; + fn has_class_or_part_for_layout( + self, + name: &AtomIdent, + attr_name: &LocalName, + case_sensitivity: CaseSensitivity, + ) -> bool; fn get_classes_for_layout(self) -> Option<&'dom [Atom]>; + fn get_parts_for_layout(self) -> Option<&'dom [Atom]>; fn synthesize_presentational_hints_for_legacy_attributes(self, hints: &mut V) where @@ -905,8 +911,13 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { } #[inline] - fn has_class_for_layout(self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool { - get_attr_for_layout(self, &ns!(), &local_name!("class")).is_some_and(|attr| { + fn has_class_or_part_for_layout( + self, + name: &AtomIdent, + attr_name: &LocalName, + case_sensitivity: CaseSensitivity, + ) -> bool { + get_attr_for_layout(self, &ns!(), attr_name).is_some_and(|attr| { attr.to_tokens() .unwrap() .iter() @@ -920,6 +931,11 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { .map(|attr| attr.to_tokens().unwrap()) } + fn get_parts_for_layout(self) -> Option<&'dom [Atom]> { + get_attr_for_layout(self, &ns!(), &local_name!("part")) + .map(|attr| attr.to_tokens().unwrap()) + } + fn synthesize_presentational_hints_for_legacy_attributes(self, hints: &mut V) where V: Push, @@ -1995,6 +2011,16 @@ impl Element { }) } + pub(crate) fn is_part(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool { + self.get_attribute(&ns!(), &LocalName::from("part")) + .is_some_and(|attr| { + attr.value() + .as_tokens() + .iter() + .any(|atom| case_sensitivity.eq_atom(name, atom)) + }) + } + pub(crate) fn set_atomic_attribute( &self, local_name: &LocalName, @@ -4051,6 +4077,13 @@ impl ElementMethods for Element { rooted!(in(*cx) let slottable = Slottable(Dom::from_ref(self.upcast::()))); slottable.find_a_slot(true) } + + /// + fn Part(&self) -> DomRoot { + self.ensure_rare_data() + .part + .or_init(|| DOMTokenList::new(self, &local_name!("part"), None, CanGc::note())) + } } impl VirtualMethods for Element { @@ -4190,7 +4223,9 @@ impl VirtualMethods for Element { match *name { local_name!("id") => AttrValue::from_atomic(value.into()), local_name!("name") => AttrValue::from_atomic(value.into()), - local_name!("class") => AttrValue::from_serialized_tokenlist(value.into()), + local_name!("class") | local_name!("part") => { + AttrValue::from_serialized_tokenlist(value.into()) + }, _ => self .super_type() .unwrap() @@ -4564,8 +4599,8 @@ impl SelectorsElement for SelectorWrapper<'_> { .is_some_and(|atom| case_sensitivity.eq_atom(id, atom)) } - fn is_part(&self, _name: &AtomIdent) -> bool { - false + fn is_part(&self, name: &AtomIdent) -> bool { + Element::is_part(self, name, CaseSensitivity::CaseSensitive) } fn imported_part(&self, _: &AtomIdent) -> Option { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index f41370386e9..f47a40d3cdb 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -437,7 +437,7 @@ impl HTMLElementMethods for HTMLElement { document.request_focus(None, FocusInitiator::Local, can_gc); } - // https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent + /// fn GetOffsetParent(&self, can_gc: CanGc) -> Option> { if self.is::() || self.is::() { return None; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index bf36242572f..6d4a0d2529e 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1583,6 +1583,7 @@ pub(crate) unsafe fn from_untrusted_node_address(candidate: UntrustedNodeAddress pub(crate) trait LayoutNodeHelpers<'dom> { fn type_id_for_layout(self) -> NodeTypeId; + fn parent_node_ref(self) -> Option>; fn composed_parent_node_ref(self) -> Option>; fn first_child_ref(self) -> Option>; fn last_child_ref(self) -> Option>; @@ -1645,7 +1646,7 @@ pub(crate) trait LayoutNodeHelpers<'dom> { impl<'dom> LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] - fn parent_node_ref(self) -> Option> { + pub(crate) fn parent_node_ref(self) -> Option> { unsafe { self.unsafe_get().parent_node.get_inner_as_layout() } } } @@ -1661,6 +1662,12 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { (*self).is::() } + #[inline] + #[allow(unsafe_code)] + fn parent_node_ref(self) -> Option> { + unsafe { self.unsafe_get().parent_node.get_inner_as_layout() } + } + #[inline] fn composed_parent_node_ref(self) -> Option> { let parent = self.parent_node_ref(); diff --git a/components/script/dom/raredata.rs b/components/script/dom/raredata.rs index 0c048956217..2c303d6874f 100644 --- a/components/script/dom/raredata.rs +++ b/components/script/dom/raredata.rs @@ -11,6 +11,7 @@ use crate::dom::bindings::root::{Dom, MutNullableDom}; use crate::dom::customelementregistry::{ CustomElementDefinition, CustomElementReaction, CustomElementState, }; +use crate::dom::domtokenlist::DOMTokenList; use crate::dom::elementinternals::ElementInternals; use crate::dom::htmlslotelement::SlottableData; use crate::dom::intersectionobserver::IntersectionObserverRegistration; @@ -76,4 +77,10 @@ pub(crate) struct ElementRareData { /// > which is initialized to an empty list. This list holds IntersectionObserverRegistration records, which have: pub(crate) registered_intersection_observers: Vec, pub(crate) cryptographic_nonce: String, + + /// + pub(crate) forwarded_part_names: Vec<(String, String)>, + + /// + pub(crate) part: MutNullableDom, } diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs index 9b50c9f3a2b..fd34d591f0c 100644 --- a/components/script/layout_dom/element.rs +++ b/components/script/layout_dom/element.rs @@ -216,11 +216,15 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> { } fn has_part_attr(&self) -> bool { - false + self.element + .get_attr_for_layout(&ns!(), &local_name!("part")) + .is_some() } fn exports_any_part(&self) -> bool { - false + self.element + .get_attr_for_layout(&ns!(), &local_name!("exportparts")) + .is_some() } fn style_attribute(&self) -> Option>> { @@ -292,6 +296,17 @@ impl<'dom> style::dom::TElement for ServoLayoutElement<'dom> { } } + fn each_part(&self, mut callback: F) + where + F: FnMut(&AtomIdent), + { + if let Some(parts) = self.element.get_parts_for_layout() { + for part in parts { + callback(AtomIdent::cast(part)) + } + } + } + fn has_dirty_descendants(&self) -> bool { unsafe { self.as_node() @@ -728,8 +743,12 @@ impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> { } #[inline] - fn is_part(&self, _name: &AtomIdent) -> bool { - false + fn is_part(&self, name: &AtomIdent) -> bool { + self.element.has_class_or_part_for_layout( + name, + &local_name!("part"), + CaseSensitivity::CaseSensitive, + ) } fn imported_part(&self, _: &AtomIdent) -> Option { @@ -738,7 +757,8 @@ impl<'dom> ::selectors::Element for ServoLayoutElement<'dom> { #[inline] fn has_class(&self, name: &AtomIdent, case_sensitivity: CaseSensitivity) -> bool { - self.element.has_class_for_layout(name, case_sensitivity) + self.element + .has_class_or_part_for_layout(name, &local_name!("class"), case_sensitivity) } fn is_html_slot_element(&self) -> bool { diff --git a/components/script/layout_dom/node.rs b/components/script/layout_dom/node.rs index dfb921b1ded..85b75f0b15f 100644 --- a/components/script/layout_dom/node.rs +++ b/components/script/layout_dom/node.rs @@ -119,9 +119,7 @@ impl<'dom> style::dom::TNode for ServoLayoutNode<'dom> { type ConcreteShadowRoot = ServoShadowRoot<'dom>; fn parent_node(&self) -> Option { - self.node - .composed_parent_node_ref() - .map(Self::from_layout_js) + self.node.parent_node_ref().map(Self::from_layout_js) } fn first_child(&self) -> Option { @@ -302,8 +300,8 @@ impl<'dom> ThreadSafeLayoutNode<'dom> for ServoThreadSafeLayoutNode<'dom> { } fn parent_style(&self) -> Arc { - let parent = self.node.parent_node().unwrap().as_element().unwrap(); - let parent_data = parent.borrow_data().unwrap(); + let parent_element = self.node.traversal_parent().unwrap(); + let parent_data = parent_element.borrow_data().unwrap(); parent_data.styles.primary().clone() } diff --git a/components/script_bindings/webidls/Element.webidl b/components/script_bindings/webidls/Element.webidl index 4545b18d058..e0073f856ca 100644 --- a/components/script_bindings/webidls/Element.webidl +++ b/components/script_bindings/webidls/Element.webidl @@ -144,3 +144,8 @@ Element includes NonDocumentTypeChildNode; Element includes ParentNode; Element includes ActivatableElement; Element includes ARIAMixin; + +// https://drafts.csswg.org/css-shadow-parts/#idl +partial interface Element { + [SameObject, PutForwards=value] readonly attribute DOMTokenList part; +}; diff --git a/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini b/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini index 4777bdd940b..df99ba6dd73 100644 --- a/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini +++ b/tests/wpt/meta/css/css-pseudo/parsing/highlight-pseudos.html.ini @@ -1,7 +1,4 @@ [highlight-pseudos.html] - ["::part(my-part)::selection" should be a valid selector] - expected: FAIL - ["::target-text" should be a valid selector] expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini b/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini deleted file mode 100644 index 8fce3b78803..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/all-hosts.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[all-hosts.html] - [::part with host selector styles in first host] - expected: FAIL - - [::part with host selector styles in second host] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini index 5609256d589..7d3d4520485 100644 --- a/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/animation-part.html.ini @@ -1,2 +1,2 @@ [animation-part.html] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini b/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini deleted file mode 100644 index 6c473570671..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/complex-matching.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[complex-matching.html] - [Complex selector for host works] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini b/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini index f39eba9208a..d7f1d73d98d 100644 --- a/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/grouping-with-checked.html.ini @@ -1,12 +1,3 @@ [grouping-with-checked.html] [Styles applied to ::part(...)] expected: FAIL - - [Styles applied to ::part(...):checked] - expected: FAIL - - [Styles applied via grouped selector including matched ::part(...):checked] - expected: FAIL - - [Styles applied via grouped selector including unmatched ::part(...):checked] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini b/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini deleted file mode 100644 index 3d6b92b5b8e..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/grouping-with-disabled.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[grouping-with-disabled.html] - [Styles applied to ::part(...)] - expected: FAIL - - [Styles applied to ::part(...):disabled] - expected: FAIL - - [Styles applied via grouped selector including matched ::part(...):disabled] - expected: FAIL - - [Styles applied via grouped selector including unmatched ::part(...):disabled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini deleted file mode 100644 index d52687ff32f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-001.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-001.html] - [:host::part works] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini deleted file mode 100644 index ad2c732963f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-002.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-002.html] - [:host::part has correct cascading behavior] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini b/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini deleted file mode 100644 index aacd37b4934..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/host-part-nesting.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[host-part-nesting.html] - [:host::part works in nesting] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini b/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini deleted file mode 100644 index cc4dd4679ca..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/idlharness.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[idlharness.html] - [Element interface: attribute part] - expected: FAIL - - [Element interface: element must inherit property "part" with the proper type] - expected: FAIL - - [Element interface: htmlElement must inherit property "part" with the proper type] - expected: FAIL - - [Element interface: svgElement must inherit property "part" with the proper type] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini b/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini deleted file mode 100644 index 5c34edcb01f..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/inner-host.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inner-host.html] - [Part in outer host is styled by document style sheet] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini b/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini index 1a36ec9273d..675aa8dff70 100644 --- a/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/interaction-with-pseudo-elements.html.ini @@ -1,16 +1,7 @@ [interaction-with-pseudo-elements.html] - [::before in selected host is styled] - expected: FAIL - - [::after in selected host is styled] - expected: FAIL - [::placeholder in selected host is styled] expected: FAIL - [::selection in selected host is styled] - expected: FAIL - [::first-line in selected host is styled] expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini deleted file mode 100644 index c086b128d2e..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-domtokenlist.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-domtokenlist.html] - [Part in selected host changed color via part IDL DOMTokenList attribute.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini deleted file mode 100644 index 2269f6e697a..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-change-part-name-idl-setter.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-change-part-name-idl-setter.html] - [Part in selected host changed color via part IDL attribute setter.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini b/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini deleted file mode 100644 index 772668059f2..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/invalidation-complex-selector.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[invalidation-complex-selector.html] - [Part in selected host changed color] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini b/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini deleted file mode 100644 index fc47c2d1237..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/multiple-parts.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[multiple-parts.html] - [Double-part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini b/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini deleted file mode 100644 index 27699f0b592..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/part-name-idl.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[part-name-idl.html] - [Access to .part returns an empty DOMTokenList.] - expected: FAIL - - [Multiple names give a DOMTokenList with multiple entries.] - expected: FAIL - - [DOMTokenList created by access is persisted.] - expected: FAIL - - [Changes in DOMTokenList are refected in attribute.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini b/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini deleted file mode 100644 index 1cc6eac641c..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/part-nested-pseudo.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[part-nested-pseudo.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini index d37678023dd..d8bc08b193e 100644 --- a/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/pseudo-classes-after-part.html.ini @@ -1,82 +1,28 @@ [pseudo-classes-after-part.html] - ["::part(mypart):active" should be a valid selector] - expected: FAIL - ["::part(mypart):active-view-transition" should be a valid selector] expected: FAIL ["::part(mypart):active-view-transition-type(mytype)" should be a valid selector] expected: FAIL - ["::part(mypart):any-link" should be a valid selector] - expected: FAIL - - ["::part(mypart):autofill" should be a valid selector] - expected: FAIL - - ["::part(mypart):checked" should be a valid selector] - expected: FAIL - - ["::part(mypart):default" should be a valid selector] - expected: FAIL - - ["::part(mypart):defined" should be a valid selector] - expected: FAIL - ["::part(mypart):dir(ltr)" should be a valid selector] expected: FAIL - ["::part(mypart):disabled" should be a valid selector] - expected: FAIL - - ["::part(mypart):enabled" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus-visible" should be a valid selector] - expected: FAIL - - ["::part(mypart):focus-within" should be a valid selector] - expected: FAIL - - ["::part(mypart):fullscreen" should be a valid selector] - expected: FAIL - ["::part(mypart):future" should be a valid selector] expected: FAIL - ["::part(mypart):hover" should be a valid selector] - expected: FAIL - - ["::part(mypart):indeterminate" should be a valid selector] - expected: FAIL - ["::part(mypart):in-range" should be a valid selector] expected: FAIL - ["::part(mypart):invalid" should be a valid selector] - expected: FAIL - ["::part(mypart):lang(en)" should be a valid selector] expected: FAIL - ["::part(mypart):link" should be a valid selector] - expected: FAIL - ["::part(mypart):modal" should be a valid selector] expected: FAIL ["::part(mypart):open" should be a valid selector] expected: FAIL - ["::part(mypart):optional" should be a valid selector] - expected: FAIL - - ["::part(mypart):out-of-range" should be a valid selector] - expected: FAIL - ["::part(mypart):past" should be a valid selector] expected: FAIL @@ -86,56 +32,11 @@ ["::part(mypart):picture-in-picture" should be a valid selector] expected: FAIL - ["::part(mypart):placeholder-shown" should be a valid selector] - expected: FAIL - ["::part(mypart):playing" should be a valid selector] expected: FAIL - ["::part(mypart):popover-open" should be a valid selector] - expected: FAIL - - ["::part(mypart):read-only" should be a valid selector] - expected: FAIL - - ["::part(mypart):read-write" should be a valid selector] - expected: FAIL - - ["::part(mypart):required" should be a valid selector] - expected: FAIL - ["::part(mypart):state(mystate)" should be a valid selector] expected: FAIL - ["::part(mypart):target" should be a valid selector] - expected: FAIL - - ["::part(mypart):user-invalid" should be a valid selector] - expected: FAIL - - ["::part(mypart):user-valid" should be a valid selector] - expected: FAIL - - ["::part(mypart):valid" should be a valid selector] - expected: FAIL - - ["::part(mypart):visited" should be a valid selector] - expected: FAIL - ["::part(mypart):xr-overlay" should be a valid selector] expected: FAIL - - ["::part(mypart):not(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):is(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):where(:hover)" should be a valid selector] - expected: FAIL - - ["::part(mypart):is(:first-child)" should be a valid selector] - expected: FAIL - - ["::part(mypart):where(:first-child)" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini b/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini index 02f53015dc9..62fad3f5e1f 100644 --- a/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini +++ b/tests/wpt/meta/css/css-shadow-parts/pseudo-elements-after-part.html.ini @@ -1,13 +1,4 @@ [pseudo-elements-after-part.html] - ["::part(mypart)::after" should be a valid selector] - expected: FAIL - - ["::part(mypart)::backdrop" should be a valid selector] - expected: FAIL - - ["::part(mypart)::before" should be a valid selector] - expected: FAIL - ["::part(mypart)::cue" should be a valid selector] expected: FAIL @@ -29,18 +20,12 @@ ["::part(mypart)::highlight(myhighlight)" should be a valid selector] expected: FAIL - ["::part(mypart)::marker" should be a valid selector] - expected: FAIL - ["::part(mypart)::placeholder" should be a valid selector] expected: FAIL ["::part(mypart)::search-text" should be a valid selector] expected: FAIL - ["::part(mypart)::selection" should be a valid selector] - expected: FAIL - ["::part(mypart)::spelling-error" should be a valid selector] expected: FAIL @@ -95,21 +80,12 @@ [computed style for ::part()::search-text] expected: FAIL - [computed style for ::part()::selection] - expected: FAIL - [computed style for ::part()::spelling-error] expected: FAIL [computed style for ::part()::target-text] expected: FAIL - [::part styles with ::part(mypart)::after {\n display: block;\n content: "";\n height: 77px;\n } and
] - expected: FAIL - - [::part styles with ::part(mypart)::before {\n display: block;\n content: "";\n height: 46px;\n } and
] - expected: FAIL - [::part styles with ::part(mypart)::details-content {\n height: 371px;\n } and
summarydetails
] expected: FAIL @@ -121,6 +97,3 @@ [::part styles with ::part(mypart) {\n font: 20px/1 Ahem;\n }\n ::part(mypart)::first-line {\n font-size: 86px;\n } and
X
X
] expected: FAIL - - [::part styles with ::part(mypart)::marker {\n font: 63px/1.0 Ahem;\n content: "X";\n } and
  • ] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini b/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini deleted file mode 100644 index bf16109e185..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/serialization.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[serialization.html] - [Escape start parenthesis in ::part name.] - expected: FAIL - - [Escape start space in ::part name.] - expected: FAIL - - [Collapse spaces in ::part names list.] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini b/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini deleted file mode 100644 index 4121d642be0..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/simple-inline.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[simple-inline.html] - [Part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/simple.html.ini b/tests/wpt/meta/css/css-shadow-parts/simple.html.ini deleted file mode 100644 index 9c3278c9e3a..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/simple.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[simple.html] - [Part in selected host is styled] - expected: FAIL diff --git a/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini b/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini deleted file mode 100644 index 1bb66f211bf..00000000000 --- a/tests/wpt/meta/css/css-shadow-parts/style-sharing.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[style-sharing.html] - [Part in selected host does not incorrectly share style with non-part] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini b/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini deleted file mode 100644 index 10f1aa0b918..00000000000 --- a/tests/wpt/meta/css/selectors/invalidation/part-pseudo.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[part-pseudo.html] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini deleted file mode 100644 index c698a273547..00000000000 --- a/tests/wpt/meta/css/selectors/parsing/parse-is-where.html.ini +++ /dev/null @@ -1,12 +0,0 @@ -[parse-is-where.html] - ["::part(foo):is(:hover)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(:hover)" should be a valid selector] - expected: FAIL - - ["::part(foo):is([attr='value'\])" should be a valid selector] - expected: FAIL - - ["::part(foo):where([attr='value'\])" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini index 8a0356d9826..d0caf3e03d8 100644 --- a/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini +++ b/tests/wpt/meta/css/selectors/parsing/parse-part.html.ini @@ -1,37 +1,4 @@ [parse-part.html] - ["::part(--foo)" should be a valid selector] - expected: FAIL - - ["::part(bar)" should be a valid selector] - expected: FAIL - - ["::part(--)" should be a valid selector] - expected: FAIL - - ["::part(--0)" should be a valid selector] - expected: FAIL - - ["::part(foo bar)" should be a valid selector] - expected: FAIL - - ["::part(-foo bar)" should be a valid selector] - expected: FAIL - - ["::part(foo):focus" should be a valid selector] - expected: FAIL - - ["::part(foo):hover" should be a valid selector] - expected: FAIL - - ["::part(foo):focus-within" should be a valid selector] - expected: FAIL - - ["::part(foo)::before" should be a valid selector] - expected: FAIL - - ["::part(foo)::after" should be a valid selector] - expected: FAIL - ["::part(foo)::placeholder" should be a valid selector] expected: FAIL @@ -44,12 +11,6 @@ ["::part(foo)::file-selector-button" should be a valid selector] expected: FAIL - ["::part(foo):is(:focus)" should be a valid selector] - expected: FAIL - - [":lang(en)::part(foo)" should be a valid selector] - expected: FAIL - [":dir(ltr)::part(foo)" should be a valid selector] expected: FAIL @@ -58,21 +19,3 @@ ["::part(foo):dir(ltr)" should be a valid selector] expected: FAIL - - ["::part(foo):is(ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):is(nav ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):where(nav ul)" should be a valid selector] - expected: FAIL - - ["::part(foo):disabled" should be a valid selector] - expected: FAIL - - ["::part(foo):checked" should be a valid selector] - expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini b/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini new file mode 100644 index 00000000000..29a0011fff4 --- /dev/null +++ b/tests/wpt/meta/shadow-dom/offsetParent-across-shadow-boundaries.html.ini @@ -0,0 +1,6 @@ +[offsetParent-across-shadow-boundaries.html] + [offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of open mode did not have any offset parent] + expected: FAIL + + [offsetParent must find the first offset parent which is a shadow-including ancestor of the context object even some shadow tree of closed mode did not have any offset parent] + expected: FAIL