diff options
author | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-07-14 14:15:41 -0400 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno.d@partner.samsung.com> | 2014-07-16 08:59:56 -0400 |
commit | aea4ccf8496ec9639be666bf93918fb09edd7027 (patch) | |
tree | 77b57e677c243942e89dfce292ede62fa85be751 /src/components/script/dom/node.rs | |
parent | e8996d5ce57c473c33b3bf5c140f7e91dd811e91 (diff) | |
download | servo-aea4ccf8496ec9639be666bf93918fb09edd7027.tar.gz servo-aea4ccf8496ec9639be666bf93918fb09edd7027.zip |
Added 'parent is/was in tree' param to bind_to_tree/unbind_from_tree
According to a talk with Ms2ger, both bind_to_tree / unbind_from_tree
should be called regardless if the tree is part of a Document. This
information is now passed as a parameter to their respective virtual
methods.
Diffstat (limited to 'src/components/script/dom/node.rs')
-rw-r--r-- | src/components/script/dom/node.rs | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 52b23c3b3e2..3b7ccb21dfa 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<Node>, before: Option<JSRef<Node>>); fn remove_child(&self, child: &JSRef<Node>); } @@ -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(); |