diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 30b15daab05..e6db3eaa9d0 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -60,6 +60,7 @@ use crate::dom::bindings::codegen::Bindings::NodeBinding::{ use crate::dom::bindings::codegen::Bindings::NodeListBinding::NodeListMethods; use crate::dom::bindings::codegen::Bindings::ProcessingInstructionBinding::ProcessingInstructionMethods; use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::ShadowRoot_Binding::ShadowRootMethods; +use crate::dom::bindings::codegen::Bindings::ShadowRootBinding::SlotAssignmentMode; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::InheritTypes::DocumentFragmentTypeId; use crate::dom::bindings::codegen::UnionTypes::NodeOrString; @@ -91,7 +92,7 @@ use crate::dom::htmliframeelement::{HTMLIFrameElement, HTMLIFrameElementLayoutMe use crate::dom::htmlimageelement::{HTMLImageElement, LayoutHTMLImageElementHelpers}; use crate::dom::htmlinputelement::{HTMLInputElement, LayoutHTMLInputElementHelpers}; use crate::dom::htmllinkelement::HTMLLinkElement; -use crate::dom::htmlslotelement::HTMLSlotElement; +use crate::dom::htmlslotelement::{HTMLSlotElement, Slottable}; use crate::dom::htmlstyleelement::HTMLStyleElement; use crate::dom::htmltextareaelement::{HTMLTextAreaElement, LayoutHTMLTextAreaElementHelpers}; use crate::dom::htmlvideoelement::{HTMLVideoElement, LayoutHTMLVideoElementHelpers}; @@ -2149,6 +2150,32 @@ impl Node { // Step 7.1. parent.add_child(kid, child); + // Step 7.4 If parent is a shadow host whose shadow root’s slot assignment is "named" + // and node is a slottable, then assign a slot for node. + if let Some(shadow_root) = parent.downcast::().and_then(Element::shadow_root) { + if shadow_root.SlotAssignment() == SlotAssignmentMode::Named { + let cx = GlobalScope::get_cx(); + if let Some(element) = node.downcast::() { + rooted!(in(*cx) let slottable = Slottable::Element(Dom::from_ref(element))); + slottable.assign_a_slot(); + } + if let Some(text) = node.downcast::() { + rooted!(in(*cx) let slottable = Slottable::Text(Dom::from_ref(text))); + slottable.assign_a_slot(); + } + } + } + + // Step 7.5 If parent’s root is a shadow root, and parent is a slot whose assigned nodes + // is the empty list, then run signal a slot change for parent. + if parent.is_in_a_shadow_tree() { + if let Some(slot_element) = parent.downcast::() { + if !slot_element.has_assigned_nodes() { + ScriptThread::signal_a_slot_change(slot_element); + } + } + } + // Step 7.6 Run assign slottables for a tree with node’s root. kid.GetRootNode(&GetRootNodeOptions::empty()) .assign_slottables_for_a_tree(); diff --git a/tests/wpt/meta/shadow-dom/HTMLSlotElement-interface.html.ini b/tests/wpt/meta/shadow-dom/HTMLSlotElement-interface.html.ini index 23a181aca59..d6409197582 100644 --- a/tests/wpt/meta/shadow-dom/HTMLSlotElement-interface.html.ini +++ b/tests/wpt/meta/shadow-dom/HTMLSlotElement-interface.html.ini @@ -1,13 +1,4 @@ [HTMLSlotElement-interface.html] - [assignedNodes() must return the list of assigned nodes when none of the assigned nodes themselves are slots] - expected: FAIL - - [assignedNodes({"flattened":false}) must return the list of assigned nodes when none of the assigned nodes themselves are slots] - expected: FAIL - - [assignedNodes({"flattened":true}) must return the list of assigned nodes when none of the assigned nodes themselves are slots] - expected: FAIL - [assignedNodes() must update when slot elements are inserted or removed] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini b/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini index 71e61882548..e40e5541cca 100644 --- a/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini +++ b/tests/wpt/meta/shadow-dom/event-with-related-target.html.ini @@ -1,10 +1,4 @@ [event-with-related-target.html] - [Firing an event at B1a with relatedNode at B1 with open mode shadow trees] - expected: FAIL - - [Firing an event at B1a with relatedNode at B1 with closed mode shadow trees] - expected: FAIL - [Firing an event at B1a with relatedNode at B1b1 with open mode shadow trees] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/slotchange-customelements.html.ini b/tests/wpt/meta/shadow-dom/slotchange-customelements.html.ini deleted file mode 100644 index 830cdaa2cac..00000000000 --- a/tests/wpt/meta/shadow-dom/slotchange-customelements.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[slotchange-customelements.html] - [slotchange must fire on initialization of custom elements with slotted children] - expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/slotchange-event.html.ini b/tests/wpt/meta/shadow-dom/slotchange-event.html.ini index f56066a9e71..b3e09651a5e 100644 --- a/tests/wpt/meta/shadow-dom/slotchange-event.html.ini +++ b/tests/wpt/meta/shadow-dom/slotchange-event.html.ini @@ -23,18 +23,6 @@ [slotchange event must fire on a named slot element insidea closed shadow root not in a document] expected: FAIL - [slotchange event must not fire on a slot element inside an open shadow root in a document when another slot's assigned nodes change] - expected: FAIL - - [slotchange event must not fire on a slot element inside a closed shadow root in a document when another slot's assigned nodes change] - expected: FAIL - - [slotchange event must not fire on a slot element inside an open shadow root not in a document when another slot's assigned nodes change] - expected: FAIL - - [slotchange event must not fire on a slot element inside a closed shadow root not in a document when another slot's assigned nodes change] - expected: FAIL - [slotchange event must fire on a slot element inside an open shadow root in a document even if the slot was removed immediately after the assigned nodes were mutated] expected: FAIL diff --git a/tests/wpt/meta/shadow-dom/slotchange.html.ini b/tests/wpt/meta/shadow-dom/slotchange.html.ini index 6ebeaa0a8b2..9d7b8d03151 100644 --- a/tests/wpt/meta/shadow-dom/slotchange.html.ini +++ b/tests/wpt/meta/shadow-dom/slotchange.html.ini @@ -1,7 +1,4 @@ [slotchange.html] expected: TIMEOUT - [slotchange event: Append a child to a host.] - expected: TIMEOUT - [slotchange event: Child content is added to nested slots.] expected: TIMEOUT