diff options
author | Josh Matthews <josh@joshmatthews.net> | 2014-02-13 08:50:28 +0530 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-04-10 10:27:32 +0200 |
commit | 6388dec9966679202904f2f59d8efe8df7edb9c8 (patch) | |
tree | 24a6f5a242d043bb557d5972b77515cba3c90148 /src/components/script/dom | |
parent | f5d1907195500aa6785b3c6034058e5d2b66dae7 (diff) | |
download | servo-6388dec9966679202904f2f59d8efe8df7edb9c8.tar.gz servo-6388dec9966679202904f2f59d8efe8df7edb9c8.zip |
Add overridable tree binding/unbinding behaviour.
Diffstat (limited to 'src/components/script/dom')
-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 |