diff options
Diffstat (limited to 'src/components/script/dom/node.rs')
-rw-r--r-- | src/components/script/dom/node.rs | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 15d2b47c0a9..249cfdd1ac1 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -9,7 +9,7 @@ use dom::bindings::utils::{Reflectable, Reflector}; use dom::bindings::utils::{DOMString, null_str_as_empty}; use dom::bindings::utils::{ErrorResult, Fallible, NotFound, HierarchyRequest}; use dom::characterdata::CharacterData; -use dom::document::AbstractDocument; +use dom::document::{AbstractDocument, DocumentTypeId}; use dom::documenttype::DocumentType; use dom::element::{Element, ElementTypeId, HTMLImageElementTypeId, HTMLIframeElementTypeId}; use dom::element::{HTMLStyleElementTypeId}; @@ -88,7 +88,7 @@ pub struct Node<View> { prev_sibling: Option<AbstractNode<View>>, /// The document that this node belongs to. - priv owner_doc: AbstractDocument, + priv owner_doc: Option<AbstractDocument>, /// The live list of children return by .childNodes. child_list: Option<@mut NodeList>, @@ -103,6 +103,7 @@ pub enum NodeTypeId { DoctypeNodeTypeId, DocumentFragmentNodeTypeId, CommentNodeTypeId, + DocumentNodeTypeId(DocumentTypeId), ElementNodeTypeId(ElementTypeId), TextNodeTypeId, } @@ -200,6 +201,13 @@ impl<'self, View> AbstractNode<View> { } } + /// Allow consumers to upcast from derived classes. + pub fn from_document(doc: AbstractDocument) -> AbstractNode<View> { + unsafe { + cast::transmute(doc) + } + } + // Convenience accessors /// Returns the type ID of this node. Fails if this node is borrowed mutably. @@ -327,6 +335,13 @@ impl<'self, View> AbstractNode<View> { self.transmute_mut(f) } + pub fn is_document(self) -> bool { + match self.type_id() { + DocumentNodeTypeId(*) => true, + _ => false + } + } + // FIXME: This should be doing dynamic borrow checking for safety. pub fn with_imm_element<R>(self, f: &fn(&Element) -> R) -> R { if !self.is_element() { @@ -463,11 +478,11 @@ impl<View> Iterator<AbstractNode<View>> for AbstractNodeChildrenIterator<View> { impl<View> Node<View> { pub fn owner_doc(&self) -> AbstractDocument { - self.owner_doc + self.owner_doc.unwrap() } pub fn set_owner_doc(&mut self, document: AbstractDocument) { - self.owner_doc = document; + self.owner_doc = Some(document); } } @@ -508,6 +523,14 @@ impl Node<ScriptView> { } pub fn new(type_id: NodeTypeId, doc: AbstractDocument) -> Node<ScriptView> { + Node::new_(type_id, Some(doc)) + } + + pub fn new_without_doc(type_id: NodeTypeId) -> Node<ScriptView> { + Node::new_(type_id, None) + } + + fn new_(type_id: NodeTypeId, doc: Option<AbstractDocument>) -> Node<ScriptView> { Node { reflector_: Reflector::new(), type_id: type_id, @@ -526,24 +549,6 @@ impl Node<ScriptView> { layout_data: LayoutData::new(), } } - - pub fn getNextSibling(&mut self) -> Option<&mut AbstractNode<ScriptView>> { - match self.next_sibling { - // transmute because the compiler can't deduce that the reference - // is safe outside of with_mut_base blocks. - Some(ref mut n) => Some(unsafe { cast::transmute(n) }), - None => None - } - } - - pub fn getFirstChild(&mut self) -> Option<&mut AbstractNode<ScriptView>> { - match self.first_child { - // transmute because the compiler can't deduce that the reference - // is safe outside of with_mut_base blocks. - Some(ref mut n) => Some(unsafe { cast::transmute(n) }), - None => None - } - } } impl Node<ScriptView> { @@ -552,6 +557,7 @@ impl Node<ScriptView> { ElementNodeTypeId(_) => 1, TextNodeTypeId => 3, CommentNodeTypeId => 8, + DocumentNodeTypeId(_)=> 9, DoctypeNodeTypeId => 10, DocumentFragmentNodeTypeId => 11, } @@ -572,6 +578,7 @@ impl Node<ScriptView> { } }, DocumentFragmentNodeTypeId => ~"#document-fragment", + DocumentNodeTypeId(_) => ~"#document" }) } @@ -586,7 +593,7 @@ impl Node<ScriptView> { TextNodeTypeId | DoctypeNodeTypeId | DocumentFragmentNodeTypeId => Some(self.owner_doc()), - // DocumentNodeTypeId => None + DocumentNodeTypeId(_) => None } } @@ -655,7 +662,7 @@ impl Node<ScriptView> { characterdata.Data() } } - DoctypeNodeTypeId => { + DoctypeNodeTypeId | DocumentNodeTypeId(_) => { None } } @@ -722,7 +729,7 @@ impl Node<ScriptView> { document.document().content_changed(); } } - DoctypeNodeTypeId => {} + DoctypeNodeTypeId | DocumentNodeTypeId(_) => {} } Ok(()) } @@ -744,10 +751,9 @@ impl Node<ScriptView> { if new_child.is_doctype() { return true; } - if !this_node.is_element() { - // FIXME: This should also work for Document and DocumentFragments when they inherit from node. - // per jgraham - return true; + match this_node.type_id() { + DocumentNodeTypeId(*) | ElementNodeTypeId(*) => (), + _ => return true } if this_node == new_child { return true; @@ -798,7 +804,8 @@ impl Node<ScriptView> { // Unregister elements having "id' from the owner doc. // This need be called before target nodes are removed from tree. - self.owner_doc.mut_document().unregister_nodes_with_id(&abstract_self); + let owner_doc = self.owner_doc(); + owner_doc.mut_document().unregister_nodes_with_id(&abstract_self); abstract_self.remove_child(node); // Signal the document that it needs to update its display. |