1 use webcore::reference_type::ReferenceType; 2 use webapi::html_elements::SlotElement; 3 4 /// The Slotable mixin defines features that allow nodes to become the contents of 5 /// a `<slot>` element — the following features are included in both Element and Text. 6 /// 7 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Slotable) 8 // https://dom.spec.whatwg.org/#slotable 9 pub trait ISlotable: ReferenceType { 10 /// returns a `SlotElement` representing the `<slot>` element the node is inserted in. 11 /// 12 /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/API/Slotable/assignedSlot) 13 // https://dom.spec.whatwg.org/#ref-for-dom-slotable-assignedslot assigned_slot( &self ) -> Option< SlotElement >14 fn assigned_slot( &self ) -> Option< SlotElement > { 15 unsafe { 16 js!( return @{self.as_ref()}.assignedSlot; ).into_reference_unchecked() 17 } 18 } 19 } 20 21 #[cfg(all(test, feature = "web_test"))] 22 mod tests { 23 use super::*; 24 use webapi::node::{Node, INode, CloneKind}; 25 use webapi::parent_node::IParentNode; 26 use webapi::html_elements::{SlotElement, TemplateElement}; 27 use webapi::shadow_root::ShadowRootMode; 28 use webapi::html_element::HtmlElement; 29 use webcore::try_from::TryInto; 30 use webapi::element::IElement; 31 32 #[test] test_assigned_slot()33 fn test_assigned_slot() { 34 let div: HtmlElement = Node::from_html("<div><span></span></div>") 35 .unwrap() 36 .try_into() 37 .unwrap(); 38 let span = div.query_selector("span").unwrap().unwrap(); 39 let tpl: TemplateElement = Node::from_html("<template><slot></slot></template>") 40 .unwrap() 41 .try_into() 42 .unwrap(); 43 44 assert_eq!(span.assigned_slot(), None); 45 46 let shadow_root = div.attach_shadow(ShadowRootMode::Open).unwrap(); 47 let n = tpl.content().clone_node(CloneKind::Deep).unwrap(); 48 shadow_root.append_child(&n); 49 50 let slot: SlotElement = shadow_root 51 .query_selector("slot") 52 .unwrap() 53 .unwrap() 54 .try_into() 55 .unwrap(); 56 57 assert_eq!(span.assigned_slot(), Some(slot)); 58 } 59 } 60