diff options
-rw-r--r-- | src/components/script/dom/element.rs | 18 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 15 | ||||
-rw-r--r-- | src/components/script/dom/virtualmethods.rs | 16 |
3 files changed, 39 insertions, 10 deletions
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index a978ea5d525..d1b19f41ebe 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -727,4 +727,22 @@ impl VirtualMethods for JS<Element> { self.notify_attribute_changed(name); } + + fn bind_to_tree(&mut self) { + match self.super_type() { + Some(ref mut s) => s.bind_to_tree(), + _ => (), + } + + self.bind_to_tree_impl(); + } + + fn unbind_from_tree(&mut self) { + match self.super_type() { + Some(ref mut s) => s.unbind_from_tree(), + _ => (), + } + + self.unbind_from_tree_impl(); + } } diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 2f3d1c99b67..733d1ad7f86 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -19,12 +19,12 @@ use dom::comment::Comment; use dom::document::{Document, HTMLDocument, NonHTMLDocument}; use dom::documentfragment::DocumentFragment; use dom::documenttype::DocumentType; -use dom::element::{Element, ElementTypeId, HTMLAnchorElementTypeId, IElement}; +use dom::element::{Element, ElementTypeId, HTMLAnchorElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::nodelist::{NodeList}; use dom::processinginstruction::ProcessingInstruction; use dom::text::Text; -use dom::virtualmethods::VirtualMethods; +use dom::virtualmethods::{VirtualMethods, vtable_for}; use dom::window::Window; use html::hubbub_html_parser::build_element_from_tag; use layout_interface::{LayoutChan, ReapLayoutDataMsg, UntrustedNodeAddress}; @@ -404,10 +404,7 @@ impl NodeHelpers for JS<Node> { if self.is_in_doc() { for node in self.traverse_preorder() { - if node.is_element() { - let element: JS<Element> = ElementCast::to(&node).unwrap(); - element.bind_to_tree_impl(); - } + vtable_for(&node).bind_to_tree(); } } @@ -420,10 +417,8 @@ impl NodeHelpers for JS<Node> { let document = document_from_node(self); for node in self.traverse_preorder() { - if node.is_element() { - let element: JS<Element> = ElementCast::to(&node).unwrap(); - element.unbind_from_tree_impl(); - } + // XXX how about if the node wasn't in the tree in the first place? + vtable_for(&node).unbind_from_tree(); } document.get().content_changed(); diff --git a/src/components/script/dom/virtualmethods.rs b/src/components/script/dom/virtualmethods.rs index f189f0443e8..866ace84e02 100644 --- a/src/components/script/dom/virtualmethods.rs +++ b/src/components/script/dom/virtualmethods.rs @@ -42,6 +42,22 @@ pub trait VirtualMethods { _ => (), } } + + /// Called when a Node is appended to a tree that is part of a Document. + fn bind_to_tree(&mut self) { + match self.super_type() { + Some(ref mut s) => s.bind_to_tree(), + _ => (), + } + } + + /// Called when a Node is removed from a tree that is part of a Document. + fn unbind_from_tree(&mut self) { + match self.super_type() { + Some(ref mut s) => s.unbind_from_tree(), + _ => (), + } + } } /// Obtain a VirtualMethods instance for a given Node-derived object. Any |