From aa09e2b88f3666e89551766c94f0efb431361718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BClker?= Date: Tue, 4 Feb 2025 21:47:33 +0100 Subject: [PATCH] Make traverse_preorder follow children of shadow hosts (#35276) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make traverse_preorder follow children of shadow hosts Children of shadow hosts are not displayed, but they still exist in the DOM and must be traversed. Signed-off-by: Simon Wülker * Fix traverse_preorder over shadow roots Signed-off-by: Simon Wülker * Update WPT expectations Signed-off-by: Simon Wülker --------- Signed-off-by: Simon Wülker --- components/script/dom/node.rs | 10 +++- .../CustomElementRegistry.html.ini | 3 - .../legend-in-slot.html.ini | 2 - ...ndants-focusability-004.tentative.html.ini | 15 ++++- ...owRoot-prototype-elementFromPoint.html.ini | 3 + .../declarative-after-attachshadow.html.ini | 3 - .../innerhtml-on-ordinary-template.html.ini | 3 - .../event-inside-slotted-node.html.ini | 60 ------------------- ...etParent-across-shadow-boundaries.html.ini | 12 ---- .../slot-fallback-content-008.html.ini | 2 - tests/wpt/meta/shadow-dom/slotchange.html.ini | 4 -- .../meta/shadow-dom/slots-fallback.html.ini | 15 ----- tests/wpt/meta/shadow-dom/slots.html.ini | 33 ---------- .../dom-tree-accessors-001.html.ini | 3 - .../selectors-api-001.html.ini | 6 -- .../test-009.html.ini | 33 ---------- .../untriaged/styles/test-008.html.ini | 3 - 17 files changed, 25 insertions(+), 185 deletions(-) delete mode 100644 tests/wpt/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-in-slot.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/declarative/declarative-after-attachshadow.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/declarative/innerhtml-on-ordinary-template.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/event-inside-slotted-node.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/slot-fallback-content-008.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/slotchange.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/selectors-api-001.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/test-009.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/untriaged/styles/test-008.html.ini diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index c23eaa6f680..3491a8ed20e 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1778,6 +1778,14 @@ impl TreeIterator { self.current = Some(next_sibling); return Some(current); } + if let Some(shadow_root) = ancestor.downcast::() { + // Shadow roots don't have sibling, so after we're done traversing + // one we jump to the first child of the host + if let Some(child) = shadow_root.Host().upcast::().GetFirstChild() { + self.current = Some(child); + return Some(current); + } + } self.depth -= 1; } debug_assert_eq!(self.depth, 0); @@ -1801,8 +1809,6 @@ impl Iterator for TreeIterator { self.current = Some(DomRoot::from_ref(shadow_root.upcast::())); self.depth += 1; return Some(current); - } else { - return self.next_skipping_children_impl(current); } } } diff --git a/tests/wpt/meta/custom-elements/CustomElementRegistry.html.ini b/tests/wpt/meta/custom-elements/CustomElementRegistry.html.ini index 7b862b2d71c..bc33a16c596 100644 --- a/tests/wpt/meta/custom-elements/CustomElementRegistry.html.ini +++ b/tests/wpt/meta/custom-elements/CustomElementRegistry.html.ini @@ -1,6 +1,3 @@ [CustomElementRegistry.html] - [customElements.define must upgrade elements in the shadow-including tree order] - expected: FAIL - [customElements.define must get "observedAttributes" property on the constructor prototype when "attributeChangedCallback" is present] expected: FAIL diff --git a/tests/wpt/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-in-slot.html.ini b/tests/wpt/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-in-slot.html.ini deleted file mode 100644 index 4ed1ce5159e..00000000000 --- a/tests/wpt/meta/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-in-slot.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[legend-in-slot.html] - expected: FAIL diff --git a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-004.tentative.html.ini b/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-004.tentative.html.ini index 5316effdce5..1900b9aedd1 100644 --- a/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-004.tentative.html.ini +++ b/tests/wpt/meta/html/semantics/embedded-content/the-canvas-element/canvas-descendants-focusability-004.tentative.html.ini @@ -1,2 +1,15 @@ [canvas-descendants-focusability-004.tentative.html] - expected: TIMEOUT + [