From 6388dec9966679202904f2f59d8efe8df7edb9c8 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 13 Feb 2014 08:50:28 +0530 Subject: [PATCH] Add overridable tree binding/unbinding behaviour. --- src/components/script/dom/element.rs | 18 ++++++++++++++++++ src/components/script/dom/node.rs | 15 +++++---------- 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 { 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 { if self.is_in_doc() { for node in self.traverse_preorder() { - if node.is_element() { - let element: JS = ElementCast::to(&node).unwrap(); - element.bind_to_tree_impl(); - } + vtable_for(&node).bind_to_tree(); } } @@ -420,10 +417,8 @@ impl NodeHelpers for JS { let document = document_from_node(self); for node in self.traverse_preorder() { - if node.is_element() { - let element: JS = 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