diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-02 23:50:20 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-08 10:28:23 +0200 |
commit | a5cefe41d0c853ca6bbaf966d17d107f6987cda2 (patch) | |
tree | a8540b7bc6925c8fae411234279f0e34208ff89d /components/script/dom | |
parent | 663f1d65e393869258fa599ff16b066d9d7cc32e (diff) | |
download | servo-a5cefe41d0c853ca6bbaf966d17d107f6987cda2.tar.gz servo-a5cefe41d0c853ca6bbaf966d17d107f6987cda2.zip |
Implement adopting and cloning steps for HTMLTemplateElement
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/htmltemplateelement.rs | 41 | ||||
-rw-r--r-- | components/script/dom/virtualmethods.rs | 4 |
2 files changed, 43 insertions, 2 deletions
diff --git a/components/script/dom/htmltemplateelement.rs b/components/script/dom/htmltemplateelement.rs index e18166c8074..0a4aa7b8786 100644 --- a/components/script/dom/htmltemplateelement.rs +++ b/components/script/dom/htmltemplateelement.rs @@ -5,14 +5,17 @@ use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding; use dom::bindings::codegen::Bindings::HTMLTemplateElementBinding::HTMLTemplateElementMethods; -use dom::bindings::codegen::InheritTypes::HTMLTemplateElementDerived; +use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; +use dom::bindings::codegen::InheritTypes::{HTMLElementCast, HTMLTemplateElementCast}; +use dom::bindings::codegen::InheritTypes::{HTMLTemplateElementDerived, NodeCast}; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::document::Document; use dom::documentfragment::DocumentFragment; use dom::element::ElementTypeId; use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; -use dom::node::{Node, NodeTypeId, document_from_node}; +use dom::node::{CloneChildrenFlag, Node, NodeTypeId, document_from_node}; +use dom::virtualmethods::VirtualMethods; use util::str::DOMString; #[dom_struct] @@ -60,3 +63,37 @@ impl HTMLTemplateElementMethods for HTMLTemplateElement { }) } } + +impl VirtualMethods for HTMLTemplateElement { + fn super_type(&self) -> Option<&VirtualMethods> { + Some(HTMLElementCast::from_ref(self) as &VirtualMethods) + } + + /// https://html.spec.whatwg.org/multipage/#template-adopting-steps + fn adopting_steps(&self, old_doc: &Document) { + self.super_type().unwrap().adopting_steps(old_doc); + // Step 1. + let doc = document_from_node(self).appropriate_template_contents_owner_document(); + // Step 2. + Node::adopt(NodeCast::from_ref(&*self.Content()), &doc); + } + + /// https://html.spec.whatwg.org/multipage/#the-template-element:concept-node-clone-ext + fn cloning_steps(&self, copy: &Node, maybe_doc: Option<&Document>, + clone_children: CloneChildrenFlag) { + self.super_type().unwrap().cloning_steps(copy, maybe_doc, clone_children); + if clone_children == CloneChildrenFlag::DoNotCloneChildren { + // Step 1. + return; + } + let copy = HTMLTemplateElementCast::to_ref(copy).unwrap(); + // Steps 2-3. + let copy_contents = NodeCast::from_root(copy.Content()); + let copy_contents_doc = copy_contents.owner_doc(); + for child in NodeCast::from_root(self.Content()).children() { + let copy_child = Node::clone( + &child, Some(©_contents_doc), CloneChildrenFlag::CloneChildren); + copy_contents.AppendChild(©_child).unwrap(); + } + } +} diff --git a/components/script/dom/virtualmethods.rs b/components/script/dom/virtualmethods.rs index 7afb3be4624..135670cbbc3 100644 --- a/components/script/dom/virtualmethods.rs +++ b/components/script/dom/virtualmethods.rs @@ -30,6 +30,7 @@ use dom::bindings::codegen::InheritTypes::HTMLTableCellElementCast; use dom::bindings::codegen::InheritTypes::HTMLTableElementCast; use dom::bindings::codegen::InheritTypes::HTMLTableRowElementCast; use dom::bindings::codegen::InheritTypes::HTMLTableSectionElementCast; +use dom::bindings::codegen::InheritTypes::HTMLTemplateElementCast; use dom::bindings::codegen::InheritTypes::HTMLTextAreaElementCast; use dom::bindings::codegen::InheritTypes::HTMLTitleElementCast; use dom::document::Document; @@ -223,6 +224,9 @@ pub fn vtable_for<'a>(node: &'a Node) -> &'a (VirtualMethods + 'a) { HTMLTableSectionElementCast::to_ref(node).unwrap(); element as &'a (VirtualMethods + 'a) } + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTemplateElement)) => { + HTMLTemplateElementCast::to_ref(node).unwrap() as &'a (VirtualMethods + 'a) + } NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => { let element = HTMLTextAreaElementCast::to_ref(node).unwrap(); element as &'a (VirtualMethods + 'a) |