diff options
Diffstat (limited to 'components/script/dom/node.rs')
-rw-r--r-- | components/script/dom/node.rs | 73 |
1 files changed, 48 insertions, 25 deletions
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index b0c8d79228e..5f437fe0cad 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -81,9 +81,6 @@ pub struct Node { /// The JavaScript reflector for this node. eventtarget: EventTarget, - /// The type of node that this is. - type_id: NodeTypeId, - /// The parent of this node. parent_node: MutNullableHeap<JS<Node>>, @@ -284,9 +281,10 @@ impl LayoutDataRef { } /// The different types of nodes. -#[derive(JSTraceable, Copy, Clone, PartialEq, Debug)] -#[derive(HeapSizeOf)] +#[derive(Copy, Clone, PartialEq, Debug)] pub enum NodeTypeId { + Node, + CharacterData(CharacterDataTypeId), DocumentType, DocumentFragment, @@ -452,7 +450,7 @@ impl Node { /// Returns a string that describes this node. pub fn debug_str(&self) -> String { - format!("{:?}", self.type_id) + format!("{:?}", self.type_id()) } pub fn is_in_doc(&self) -> bool { @@ -461,12 +459,15 @@ impl Node { /// Returns the type ID of this node. Fails if this node is borrowed mutably. pub fn type_id(&self) -> NodeTypeId { - self.type_id + match *self.eventtarget.type_id() { + EventTargetTypeId::Node(type_id) => type_id, + _ => unreachable!(), + } } // https://dom.spec.whatwg.org/#concept-node-length pub fn len(&self) -> u32 { - match self.type_id { + match self.type_id() { NodeTypeId::DocumentType => 0, NodeTypeId::CharacterData(_) => { CharacterDataCast::to_ref(self).unwrap().Length() @@ -486,12 +487,12 @@ impl Node { #[inline] pub fn is_anchor_element(&self) -> bool { - self.type_id == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) + self.type_id() == NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) } #[inline] pub fn is_doctype(&self) -> bool { - self.type_id == NodeTypeId::DocumentType + self.type_id() == NodeTypeId::DocumentType } pub fn get_flag(&self, flag: NodeFlags) -> bool { @@ -1026,7 +1027,7 @@ impl LayoutNodeHelpers for LayoutJS<Node> { #[inline] #[allow(unsafe_code)] unsafe fn type_id_for_layout(&self) -> NodeTypeId { - (*self.unsafe_get()).type_id + (*self.unsafe_get()).type_id() } #[inline] @@ -1393,8 +1394,7 @@ impl Node { fn new_(type_id: NodeTypeId, doc: Option<&Document>) -> Node { Node { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::Node(type_id)), - type_id: type_id, + eventtarget: EventTarget::new_inherited(), parent_node: Default::default(), first_child: Default::default(), @@ -1456,6 +1456,8 @@ impl Node { // Step 4-5. match node.type_id() { + NodeTypeId::Node => unreachable!(), + NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData) => unreachable!(), NodeTypeId::CharacterData(CharacterDataTypeId::Text) => { if parent.is_document() { return Err(HierarchyRequest); @@ -1538,7 +1540,7 @@ impl Node { } }, NodeTypeId::CharacterData(_) => (), - NodeTypeId::Document => unreachable!(), + NodeTypeId::Document | NodeTypeId::Node => unreachable!(), } } Ok(()) @@ -1698,6 +1700,8 @@ impl Node { // Step 2. // XXXabinader: clone() for each node as trait? let copy: Root<Node> = match node.type_id() { + NodeTypeId::Node => unreachable!(), + NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData) => unreachable!(), NodeTypeId::DocumentType => { let doctype: &DocumentType = DocumentTypeCast::to_ref(node).unwrap(); let doctype = DocumentType::new(doctype.name().clone(), @@ -1833,7 +1837,7 @@ impl Node { } } - match node.type_id { + match node.type_id() { NodeTypeId::Element(_) => { let element = ElementCast::to_ref(node).unwrap(); // Step 1. @@ -1889,7 +1893,9 @@ impl Node { impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-nodetype fn NodeType(&self) -> u16 { - match self.type_id { + match self.type_id() { + NodeTypeId::Node => unreachable!(), + NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData) => unreachable!(), NodeTypeId::CharacterData(CharacterDataTypeId::Text) => NodeConstants::TEXT_NODE, NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => @@ -1909,11 +1915,13 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-nodename fn NodeName(&self) -> DOMString { - match self.type_id { + match self.type_id() { + NodeTypeId::Node => unreachable!(), NodeTypeId::Element(..) => { let elem: &Element = ElementCast::to_ref(self).unwrap(); elem.TagName() } + NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData) => unreachable!(), NodeTypeId::CharacterData(CharacterDataTypeId::Text) => "#text".to_owned(), NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => { let processing_instruction: &ProcessingInstruction = @@ -1937,7 +1945,8 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-ownerdocument fn GetOwnerDocument(&self) -> Option<Root<Document>> { - match self.type_id { + match self.type_id() { + NodeTypeId::Node => unreachable!(), NodeTypeId::CharacterData(..) | NodeTypeId::Element(..) | NodeTypeId::DocumentType | @@ -1992,19 +2001,31 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-nodevalue fn GetNodeValue(&self) -> Option<DOMString> { - CharacterDataCast::to_ref(self).map(|c| c.Data()) + match self.type_id() { + NodeTypeId::CharacterData(..) => { + let chardata: &CharacterData = CharacterDataCast::to_ref(self).unwrap(); + Some(chardata.Data()) + } + _ => { + None + } + } } // https://dom.spec.whatwg.org/#dom-node-nodevalue fn SetNodeValue(&self, val: Option<DOMString>) { - if let NodeTypeId::CharacterData(..) = self.type_id { - self.SetTextContent(val) + match self.type_id() { + NodeTypeId::CharacterData(..) => { + self.SetTextContent(val) + } + _ => {} } } // https://dom.spec.whatwg.org/#dom-node-textcontent fn GetTextContent(&self) -> Option<DOMString> { - match self.type_id { + match self.type_id() { + NodeTypeId::Node => unreachable!(), NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => { let content = Node::collect_text_contents(self.traverse_preorder()); @@ -2024,7 +2045,8 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-textcontent fn SetTextContent(&self, value: Option<DOMString>) { let value = value.unwrap_or(String::new()); - match self.type_id { + match self.type_id() { + NodeTypeId::Node => unreachable!(), NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => { // Step 1-2. @@ -2065,7 +2087,7 @@ impl NodeMethods for Node { fn ReplaceChild(&self, node: &Node, child: &Node) -> Fallible<Root<Node>> { // Step 1. - match self.type_id { + match self.type_id() { NodeTypeId::Document | NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => (), @@ -2084,6 +2106,7 @@ impl NodeMethods for Node { // Step 4-5. match node.type_id() { + NodeTypeId::Node => unreachable!(), NodeTypeId::CharacterData(CharacterDataTypeId::Text) if self.is_document() => return Err(HierarchyRequest), NodeTypeId::DocumentType if !self.is_document() => return Err(HierarchyRequest), @@ -2147,7 +2170,7 @@ impl NodeMethods for Node { } }, NodeTypeId::CharacterData(..) => (), - NodeTypeId::Document => unreachable!() + NodeTypeId::Document | NodeTypeId::Node => unreachable!() } } |