diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index a16c36f4708d..95a82e615fb4 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -836,12 +836,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } } - fn bind_to_tree(&self) { + fn bind_to_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.bind_to_tree(), + Some(ref s) => s.bind_to_tree(tree_in_doc), _ => (), } + if !tree_in_doc { return; } + match self.get_attribute(Null, "id").root() { Some(attr) => { let doc = document_from_node(self).root(); @@ -851,12 +853,14 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } } - fn unbind_from_tree(&self) { + fn unbind_from_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.unbind_from_tree(), + Some(ref s) => s.unbind_from_tree(tree_in_doc), _ => (), } + if !tree_in_doc { return; } + match self.get_attribute(Null, "id").root() { Some(attr) => { let doc = document_from_node(self).root(); diff --git a/src/components/script/dom/htmliframeelement.rs b/src/components/script/dom/htmliframeelement.rs index f22ebe718eb6..83638ad44e1e 100644 --- a/src/components/script/dom/htmliframeelement.rs +++ b/src/components/script/dom/htmliframeelement.rs @@ -176,12 +176,14 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLIFrameElement> { } } - fn bind_to_tree(&self) { + fn bind_to_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.bind_to_tree(), + Some(ref s) => s.bind_to_tree(tree_in_doc), _ => (), } + if !tree_in_doc { return; } + match self.get_url() { Some(url) => { let sandboxed = if self.is_sandboxed() { diff --git a/src/components/script/dom/htmlstyleelement.rs b/src/components/script/dom/htmlstyleelement.rs index f0b82965a30f..62ac8436d1f3 100644 --- a/src/components/script/dom/htmlstyleelement.rs +++ b/src/components/script/dom/htmlstyleelement.rs @@ -79,9 +79,9 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLStyleElement> { self.parse_own_css(); } - fn bind_to_tree(&self) { + fn bind_to_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.bind_to_tree(), + Some(ref s) => s.bind_to_tree(tree_in_doc), _ => () } self.parse_own_css(); diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 52b23c3b3e28..3b7ccb21dfad 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -233,7 +233,7 @@ pub enum NodeTypeId { trait PrivateNodeHelpers { fn node_inserted(&self); - fn node_removed(&self); + fn node_removed(&self, parent_in_doc: bool); fn add_child(&self, new_child: &JSRef, before: Option>); fn remove_child(&self, child: &JSRef); } @@ -243,11 +243,10 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { fn node_inserted(&self) { assert!(self.parent_node().is_some()); let document = document_from_node(self).root(); + let is_in_doc = self.is_in_doc(); - if self.is_in_doc() { - for node in self.traverse_preorder() { - vtable_for(&node).bind_to_tree(); - } + for node in self.traverse_preorder() { + vtable_for(&node).bind_to_tree(is_in_doc); } let parent = self.parent_node().root(); @@ -257,13 +256,12 @@ impl<'a> PrivateNodeHelpers for JSRef<'a, Node> { } // http://dom.spec.whatwg.org/#node-is-removed - fn node_removed(&self) { + fn node_removed(&self, parent_in_doc: bool) { assert!(self.parent_node().is_none()); let document = document_from_node(self).root(); for node in self.traverse_preorder() { - // XXX how about if the node wasn't in the tree in the first place? - vtable_for(&node).unbind_from_tree(); + vtable_for(&node).unbind_from_tree(parent_in_doc); } document.deref().content_changed(); @@ -1187,8 +1185,9 @@ impl Node { // Step 6: mutation records. // Step 7. + let parent_in_doc = parent.is_in_doc(); for removedNode in removedNodes.iter() { - removedNode.node_removed(); + removedNode.node_removed(parent_in_doc); } for addedNode in addedNodes.iter() { addedNode.node_inserted(); @@ -1224,7 +1223,7 @@ impl Node { // Step 9. match suppress_observers { Suppressed => (), - Unsuppressed => node.node_removed(), + Unsuppressed => node.node_removed(parent.is_in_doc()), } } @@ -1713,7 +1712,7 @@ impl<'a> NodeMethods for JSRef<'a, Node> { // Step 12-14. // Step 13: mutation records. - child.node_removed(); + child.node_removed(self.is_in_doc()); if node.type_id() == DocumentFragmentNodeTypeId { for child_node in node.children() { child_node.node_inserted(); diff --git a/src/components/script/dom/virtualmethods.rs b/src/components/script/dom/virtualmethods.rs index aa1ac0313b91..9ebb9a336c47 100644 --- a/src/components/script/dom/virtualmethods.rs +++ b/src/components/script/dom/virtualmethods.rs @@ -60,18 +60,20 @@ pub trait VirtualMethods { } } - /// Called when a Node is appended to a tree that is part of a Document. - fn bind_to_tree(&self) { + /// Called when a Node is appended to a tree, where 'tree_in_doc' indicates + /// whether the tree is part of a Document. + fn bind_to_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.bind_to_tree(), + Some(ref s) => s.bind_to_tree(tree_in_doc), _ => (), } } - /// Called when a Node is removed from a tree that is part of a Document. - fn unbind_from_tree(&self) { + /// Called when a Node is removed from a tree, where 'tree_in_doc' + /// indicates whether the tree is part of a Document. + fn unbind_from_tree(&self, tree_in_doc: bool) { match self.super_type() { - Some(ref s) => s.unbind_from_tree(), + Some(ref s) => s.unbind_from_tree(tree_in_doc), _ => (), } }