From 1a3f10bba43f0bc051de1baac1ee17ab26db6143 Mon Sep 17 00:00:00 2001 From: Kelechi Ebiri <56020538+TG199@users.noreply.github.com> Date: Thu, 1 May 2025 16:19:41 +0100 Subject: [PATCH] feat: implement ShadowRoot::setHTMLUnsafe (#36240) Implements #36166 --------- Signed-off-by: TG --- components/script/dom/element.rs | 24 +- components/script/dom/node.rs | 30 +- components/script/dom/shadowroot.rs | 9 + .../script_bindings/codegen/Bindings.conf | 2 +- .../script_bindings/webidls/ShadowRoot.webidl | 2 +- .../meta/html/dom/idlharness.https.html.ini | 3 - .../setHTMLUnsafe-CEReactions.html.ini | 3 - .../setHTMLUnsafe.html.ini | 6 - .../shadow-dom/declarative/gethtml.html.ini | 4896 ----------------- ...nment-to-ShadowRoot-setHTMLUnsafe.html.ini | 8 +- ...ting-for-ShadowRoot-setHTMLUnsafe.html.ini | 3 - 11 files changed, 46 insertions(+), 4940 deletions(-) delete mode 100644 tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini delete mode 100644 tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini delete mode 100644 tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2831fc3d8f0..c040078f707 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -3025,28 +3025,8 @@ impl ElementMethods for Element { DomRoot::from_ref(self.upcast()) }; - // Step 3. Unsafely set HTML given target, this, and compliantHTML. - // Let newChildren be the result of the HTML fragment parsing algorithm. - let new_children = ServoParser::parse_html_fragment(self, html, true, can_gc); - - let context_document = { - if let Some(template) = self.downcast::() { - template.Content(can_gc).upcast::().owner_doc() - } else { - self.owner_document() - } - }; - - // Let fragment be a new DocumentFragment whose node document is contextElement's node document. - let frag = DocumentFragment::new(&context_document, can_gc); - - // For each node in newChildren, append node to fragment. - for child in new_children { - frag.upcast::().AppendChild(&child, can_gc).unwrap(); - } - - // Replace all with fragment within target. - Node::replace_all(Some(frag.upcast()), &target, can_gc); + // Step 3. Unsafely set HTML given target, this, and compliantHTML + Node::unsafely_set_html(&target, self, html, can_gc); } /// diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 2caec47de25..e9d36a01426 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -110,7 +110,7 @@ use crate::dom::pointerevent::{PointerEvent, PointerId}; use crate::dom::processinginstruction::ProcessingInstruction; use crate::dom::range::WeakRangeVec; use crate::dom::raredata::NodeRareData; -use crate::dom::servoparser::serialize_html_fragment; +use crate::dom::servoparser::{ServoParser, serialize_html_fragment}; use crate::dom::shadowroot::{IsUserAgentWidget, LayoutShadowRootHelpers, ShadowRoot}; use crate::dom::stylesheetlist::StyleSheetListOwner; use crate::dom::svgsvgelement::{LayoutSVGSVGElementHelpers, SVGSVGElement}; @@ -316,6 +316,34 @@ impl Node { } } + /// Implements the "unsafely set HTML" algorithm as specified in: + /// + pub fn unsafely_set_html( + target: &Node, + context_element: &Element, + html: DOMString, + can_gc: CanGc, + ) { + // Step 1. Let newChildren be the result of the HTML fragment parsing algorithm. + let new_children = ServoParser::parse_html_fragment(context_element, html, true, can_gc); + + // Step 2. Let fragment be a new DocumentFragment whose node document is contextElement's node document. + + let context_document = context_element.owner_document(); + let fragment = DocumentFragment::new(&context_document, can_gc); + + // Step 3. For each node in newChildren, append node to fragment. + for child in new_children { + fragment + .upcast::() + .AppendChild(&child, can_gc) + .unwrap(); + } + + // Step 4. Replace all with fragment within target. + Node::replace_all(Some(fragment.upcast()), target, can_gc); + } + pub(crate) fn clean_up_style_and_layout_data(&self) { self.owner_doc().cancel_animations_for_node(self); self.style_data.borrow_mut().take(); diff --git a/components/script/dom/shadowroot.rs b/components/script/dom/shadowroot.rs index 72b074ed6f4..14d9c24b10e 100644 --- a/components/script/dom/shadowroot.rs +++ b/components/script/dom/shadowroot.rs @@ -453,6 +453,15 @@ impl ShadowRootMethods for ShadowRoot { self.slot_assignment_mode } + /// + fn SetHTMLUnsafe(&self, html: DOMString, can_gc: CanGc) { + // Step 2. Unsafely set HTMl given this, this's shadow host, and complaintHTML + let target = self.upcast::(); + let context_element = self.Host(); + + Node::unsafely_set_html(target, &context_element, html, can_gc); + } + // https://dom.spec.whatwg.org/#dom-shadowroot-onslotchange event_handler!(onslotchange, GetOnslotchange, SetOnslotchange); } diff --git a/components/script_bindings/codegen/Bindings.conf b/components/script_bindings/codegen/Bindings.conf index 4ab0b21cabe..6396e3ced0c 100644 --- a/components/script_bindings/codegen/Bindings.conf +++ b/components/script_bindings/codegen/Bindings.conf @@ -579,7 +579,7 @@ DOMInterfaces = { }, 'ShadowRoot': { - 'canGc': ['ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'], + 'canGc': ['SetHTMLUnsafe', 'ElementFromPoint', 'ElementsFromPoint', 'SetInnerHTML', 'GetHTML', 'InnerHTML'], }, 'StaticRange': { diff --git a/components/script_bindings/webidls/ShadowRoot.webidl b/components/script_bindings/webidls/ShadowRoot.webidl index 6e3f2032294..cb0926afc10 100644 --- a/components/script_bindings/webidls/ShadowRoot.webidl +++ b/components/script_bindings/webidls/ShadowRoot.webidl @@ -25,7 +25,7 @@ ShadowRoot includes DocumentOrShadowRoot; // https://html.spec.whatwg.org/multipage/#dom-parsing-and-serialization partial interface ShadowRoot { - // [CEReactions] undefined setHTMLUnsafe((TrustedHTML or DOMString) html); + [CEReactions] undefined setHTMLUnsafe(DOMString html); DOMString getHTML(optional GetHTMLOptions options = {}); // [CEReactions] attribute (TrustedHTML or [LegacyNullToEmptyString] DOMString) innerHTML; diff --git a/tests/wpt/meta/html/dom/idlharness.https.html.ini b/tests/wpt/meta/html/dom/idlharness.https.html.ini index ac7504347d7..25375c6ea47 100644 --- a/tests/wpt/meta/html/dom/idlharness.https.html.ini +++ b/tests/wpt/meta/html/dom/idlharness.https.html.ini @@ -5732,9 +5732,6 @@ [SVGSVGElement interface: attribute onunload] expected: FAIL - [ShadowRoot interface: operation setHTMLUnsafe((TrustedHTML or DOMString))] - expected: FAIL - [OffscreenCanvasRenderingContext2D interface: operation getContextAttributes()] expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini deleted file mode 100644 index d0b3986d561..00000000000 --- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe-CEReactions.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[setHTMLUnsafe-CEReactions.html] - [ShadowRoot.setHTMLUnsafe should trigger custom element reactions.] - expected: FAIL diff --git a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini b/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini deleted file mode 100644 index 850b529ff76..00000000000 --- a/tests/wpt/meta/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/setHTMLUnsafe.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[setHTMLUnsafe.html] - [ShadowRoot: setHTMLUnsafe with no shadowdom.] - expected: FAIL - - [ShadowRoot: setHTMLUnsafe with shadowdom.] - expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini b/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini deleted file mode 100644 index 3a96cb5998d..00000000000 --- a/tests/wpt/meta/shadow-dom/declarative/gethtml.html.ini +++ /dev/null @@ -1,4896 +0,0 @@ -[gethtml.html] - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=false, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=false, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=open, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=undefined, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=false, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, with shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on
light, with declarative shadow, mode=closed, delegatesFocus=true, serializable=true, clonable=true, without shadow tree contents.] - expected: FAIL - - [ShadowRoot.getHTML() on