diff options
author | Ms2ger <ms2ger@gmail.com> | 2013-10-08 21:12:02 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2013-10-10 10:57:38 +0200 |
commit | 04319fdb684e37bcb29cad7e096da2298dc027a5 (patch) | |
tree | 27f8d1465fa5557e1e12f933edbb36246c732d92 /src/components/script/dom/node.rs | |
parent | 59d2d345c82974d686692d16570828046866488a (diff) | |
download | servo-04319fdb684e37bcb29cad7e096da2298dc027a5.tar.gz servo-04319fdb684e37bcb29cad7e096da2298dc027a5.zip |
Issue #888 - Node's owner document should never be None.
Diffstat (limited to 'src/components/script/dom/node.rs')
-rw-r--r-- | src/components/script/dom/node.rs | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index d3797200503..f9ac7b42dbc 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -86,7 +86,7 @@ pub struct Node<View> { prev_sibling: Option<AbstractNode<View>>, /// The document that this node belongs to. - owner_doc: Option<AbstractDocument>, + owner_doc: AbstractDocument, /// Layout information. Only the layout task may touch this data. priv layout_data: LayoutData, @@ -393,6 +393,32 @@ impl<'self, View> AbstractNode<View> { current_node: self.first_child(), } } + + pub fn is_in_doc(&self) -> bool { + do self.with_base |node| { + do node.owner_doc.with_base |document| { + match document.root { + None => false, + Some(root) => { + let mut node = *self; + let mut in_doc; + loop { + match node.parent_node() { + Some(parent) => { + node = parent; + }, + None => { + in_doc = unsafe { node.raw_object() as uint == root.raw_object() as uint }; + break; + } + } + } + in_doc + } + } + } + } + } } impl<View> Iterator<AbstractNode<View>> for AbstractNodeChildrenIterator<View> { @@ -415,23 +441,22 @@ impl Node<ScriptView> { pub fn add_to_doc(&mut self, doc: AbstractDocument) { let old_doc = self.owner_doc; - self.owner_doc = Some(doc); + self.owner_doc = doc; let mut cur_node = self.first_child; while cur_node.is_some() { for node in cur_node.unwrap().traverse_preorder() { do node.with_mut_base |node_base| { - node_base.owner_doc = Some(doc); + node_base.owner_doc = doc; } }; cur_node = cur_node.unwrap().next_sibling(); } // Signal the old document that it needs to update its display - match old_doc { - Some(old_doc) if old_doc != doc => do old_doc.with_base |old_doc| { + if old_doc != doc { + do old_doc.with_base |old_doc| { old_doc.content_changed(); - }, - _ => () + } } // Signal the new document that it needs to update its display @@ -440,30 +465,14 @@ impl Node<ScriptView> { } } - pub fn remove_from_doc(&mut self) { - let old_doc = self.owner_doc; - self.owner_doc = None; - - let mut cur_node = self.first_child; - while cur_node.is_some() { - for node in cur_node.unwrap().traverse_preorder() { - do node.with_mut_base |node_base| { - node_base.owner_doc = None; - } - }; - cur_node = cur_node.unwrap().next_sibling(); - } - - // Signal the old document that it needs to update its display - match old_doc { - Some(doc) => do doc.with_base |doc| { - doc.content_changed(); - }, - None => () + pub fn remove_from_doc(&self) { + // Signal the document that it needs to update its display. + do self.owner_doc.with_base |doc| { + doc.content_changed(); } } - pub fn new(type_id: NodeTypeId) -> Node<ScriptView> { + pub fn new(type_id: NodeTypeId, doc: AbstractDocument) -> Node<ScriptView> { Node { reflector_: Reflector::new(), type_id: type_id, @@ -476,7 +485,7 @@ impl Node<ScriptView> { next_sibling: None, prev_sibling: None, - owner_doc: None, + owner_doc: doc, layout_data: LayoutData::new(), } @@ -616,8 +625,8 @@ impl Node<ScriptView> { let node = if is_empty { None } else { - let text_node = do self.owner_doc.unwrap().with_base |document| { - document.CreateTextNode(value) + let text_node = do self.owner_doc.with_base |document| { + document.CreateTextNode(self.owner_doc, value) }; Some(text_node) }; @@ -630,10 +639,8 @@ impl Node<ScriptView> { characterdata.data = null_str_as_empty(value); // Notify the document that the content of this node is different - for doc in self.owner_doc.iter() { - do doc.with_base |doc| { - doc.content_changed(); - } + do self.owner_doc.with_base |doc| { + doc.content_changed(); } } } @@ -647,10 +654,8 @@ impl Node<ScriptView> { } fn wait_until_safe_to_modify_dom(&self) { - for doc in self.owner_doc.iter() { - do doc.with_base |doc| { - doc.wait_until_safe_to_modify_dom(); - } + do self.owner_doc.with_base |doc| { + doc.wait_until_safe_to_modify_dom(); } } @@ -689,11 +694,8 @@ impl Node<ScriptView> { // If the node already exists it is removed from current parent node. node.parent_node().map(|parent| parent.remove_child(node)); abstract_self.add_child(node); - match self.owner_doc { - Some(doc) => do node.with_mut_base |node| { - node.add_to_doc(doc); - }, - None => () + do node.with_mut_base |node| { + node.add_to_doc(self.owner_doc); } Ok(node) } |