diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-11 23:55:20 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2015-09-13 19:46:28 +0200 |
commit | c25085f68a86e2885d77146add097f9f796c96ac (patch) | |
tree | 6e5f7040cd7b4ba5cfb421049485782f44b22740 | |
parent | 941f7dc04bc02ad196e86c5167ea292477fb7284 (diff) | |
download | servo-c25085f68a86e2885d77146add097f9f796c96ac.tar.gz servo-c25085f68a86e2885d77146add097f9f796c96ac.zip |
Introduce [Abstract] to mark non-leaf interfaces
Some interfaces like Node, CharacterData and HTMLTableCellElement are never
instantiated directly, only their descendant interfaces are. Those are marked
with [Abstract] to set their type_id to None instead of having dummy values
in the TypeId enums.
21 files changed, 26 insertions, 48 deletions
diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 8b4fd32d56c..dd1d58a6acc 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -1430,8 +1430,6 @@ impl<'a> PostorderNodeMutTraversal for FlowConstructor<'a> { Some(NodeTypeId::Document) => { (display::T::none, float::T::none, position::T::static_) } - Some(NodeTypeId::Node) => unreachable!(), - Some(NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData)) => unreachable!(), }; debug!("building flow for node: {:?} {:?} {:?} {:?}", display, float, positioning, node.type_id()); @@ -1587,7 +1585,6 @@ impl<'ln> NodeUtils for ThreadSafeLayoutNode<'ln> { Some(NodeTypeId::Element(ElementTypeId::HTMLElement( HTMLElementTypeId::HTMLObjectElement))) => self.has_object_data(), Some(NodeTypeId::Element(_)) => false, - Some(NodeTypeId::Node) => unreachable!(), } } diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py index d0b45e350a3..e5a90633f01 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1724,7 +1724,7 @@ class CGNamespace(CGWrapper): def EventTargetEnum(desc): protochain = desc.prototypeChain - if protochain[0] != "EventTarget": + if protochain[0] != "EventTarget" or desc.interface.getExtendedAttribute("Abstract"): return "None" inner = "" diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index 09368e45aa7..90ec9e88921 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -1357,7 +1357,8 @@ class IDLInterface(IDLObjectWithScope, IDLExposureMixins): identifier == "ChromeOnly" or identifier == "Unforgeable" or identifier == "UnsafeInPrerendering" or - identifier == "LegacyEventInit"): + identifier == "LegacyEventInit" or + identifier == "Abstract"): # Known extended attributes that do not take values if not attr.noArguments(): raise WebIDLError("[%s] must take no arguments" % identifier, diff --git a/components/script/dom/bindings/codegen/parser/abstract.patch b/components/script/dom/bindings/codegen/parser/abstract.patch new file mode 100644 index 00000000000..e971a97e443 --- /dev/null +++ b/components/script/dom/bindings/codegen/parser/abstract.patch @@ -0,0 +1,12 @@ +--- WebIDL.py ++++ WebIDL.py +@@ -1357,7 +1357,8 @@ class IDLInterface(IDLObjectWithScope, IDLExposureMixins): + identifier == "ChromeOnly" or + identifier == "Unforgeable" or + identifier == "UnsafeInPrerendering" or +- identifier == "LegacyEventInit"): ++ identifier == "LegacyEventInit" or ++ identifier == "Abstract"): + # Known extended attributes that do not take values + if not attr.noArguments(): + raise WebIDLError("[%s] must take no arguments" % identifier, diff --git a/components/script/dom/bindings/codegen/parser/update.sh b/components/script/dom/bindings/codegen/parser/update.sh index 5dd513812e1..26f70aac6ae 100755 --- a/components/script/dom/bindings/codegen/parser/update.sh +++ b/components/script/dom/bindings/codegen/parser/update.sh @@ -1,3 +1,4 @@ wget https://mxr.mozilla.org/mozilla-central/source/dom/bindings/parser/WebIDL.py?raw=1 -O WebIDL.py patch < external.patch patch < module.patch +patch < abstract.patch diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index d4a2c5e0478..36503f8c041 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -160,8 +160,6 @@ impl CharacterDataMethods for CharacterData { /// The different types of CharacterData. #[derive(Copy, Clone, PartialEq, Debug)] pub enum CharacterDataTypeId { - CharacterData, - Comment, Text, ProcessingInstruction, diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 6ac33876e09..c6f3db73d8c 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -48,8 +48,6 @@ pub enum ListenerPhase { #[derive(Copy, Clone)] pub enum EventTargetTypeId { - EventTarget, - Node(NodeTypeId), WebSocket, Window, diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 7a2b798c728..8630cf5a745 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -43,8 +43,6 @@ impl HTMLMediaElement { #[derive(Copy, Clone, Debug)] pub enum HTMLMediaElementTypeId { - HTMLMediaElement = -1, - HTMLAudioElement = 0, HTMLVideoElement = 1, } diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index e1f8179a19b..15c1acf3737 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -24,8 +24,6 @@ const DEFAULT_COLSPAN: u32 = 1; #[derive(Copy, Clone, Debug)] pub enum HTMLTableCellElementTypeId { - HTMLTableCellElement = -1, - HTMLTableDataCellElement = 0, HTMLTableHeaderCellElement = 1, } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 5f437fe0cad..ae725d3d856 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -283,8 +283,6 @@ impl LayoutDataRef { /// The different types of nodes. #[derive(Copy, Clone, PartialEq, Debug)] pub enum NodeTypeId { - Node, - CharacterData(CharacterDataTypeId), DocumentType, DocumentFragment, @@ -1456,8 +1454,6 @@ 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); @@ -1540,7 +1536,7 @@ impl Node { } }, NodeTypeId::CharacterData(_) => (), - NodeTypeId::Document | NodeTypeId::Node => unreachable!(), + NodeTypeId::Document => unreachable!(), } } Ok(()) @@ -1700,8 +1696,6 @@ 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(), @@ -1894,8 +1888,6 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-nodetype fn NodeType(&self) -> u16 { match self.type_id() { - NodeTypeId::Node => unreachable!(), - NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData) => unreachable!(), NodeTypeId::CharacterData(CharacterDataTypeId::Text) => NodeConstants::TEXT_NODE, NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => @@ -1916,12 +1908,10 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-nodename fn NodeName(&self) -> DOMString { 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 = @@ -1946,7 +1936,6 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-ownerdocument fn GetOwnerDocument(&self) -> Option<Root<Document>> { match self.type_id() { - NodeTypeId::Node => unreachable!(), NodeTypeId::CharacterData(..) | NodeTypeId::Element(..) | NodeTypeId::DocumentType | @@ -2025,7 +2014,6 @@ impl NodeMethods for Node { // https://dom.spec.whatwg.org/#dom-node-textcontent fn GetTextContent(&self) -> Option<DOMString> { match self.type_id() { - NodeTypeId::Node => unreachable!(), NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => { let content = Node::collect_text_contents(self.traverse_preorder()); @@ -2046,7 +2034,6 @@ impl NodeMethods for Node { fn SetTextContent(&self, value: Option<DOMString>) { let value = value.unwrap_or(String::new()); match self.type_id() { - NodeTypeId::Node => unreachable!(), NodeTypeId::DocumentFragment | NodeTypeId::Element(..) => { // Step 1-2. @@ -2106,7 +2093,6 @@ 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), @@ -2170,7 +2156,7 @@ impl NodeMethods for Node { } }, NodeTypeId::CharacterData(..) => (), - NodeTypeId::Document | NodeTypeId::Node => unreachable!() + NodeTypeId::Document => unreachable!(), } } diff --git a/components/script/dom/webidls/CharacterData.webidl b/components/script/dom/webidls/CharacterData.webidl index b22d755438f..68ba9ab8eb8 100644 --- a/components/script/dom/webidls/CharacterData.webidl +++ b/components/script/dom/webidls/CharacterData.webidl @@ -10,6 +10,7 @@ * liability, trademark and document use rules apply. */ +[Abstract] interface CharacterData : Node { [TreatNullAs=EmptyString] attribute DOMString data; readonly attribute unsigned long length; diff --git a/components/script/dom/webidls/EventTarget.webidl b/components/script/dom/webidls/EventTarget.webidl index 1bc929851ed..403b1287fe4 100644 --- a/components/script/dom/webidls/EventTarget.webidl +++ b/components/script/dom/webidls/EventTarget.webidl @@ -6,6 +6,7 @@ * https://dom.spec.whatwg.org/#interface-eventtarget */ +[Abstract] interface EventTarget { void addEventListener(DOMString type, EventListener? listener, diff --git a/components/script/dom/webidls/HTMLMediaElement.webidl b/components/script/dom/webidls/HTMLMediaElement.webidl index e7b0383d1a3..17e86f91469 100644 --- a/components/script/dom/webidls/HTMLMediaElement.webidl +++ b/components/script/dom/webidls/HTMLMediaElement.webidl @@ -5,6 +5,7 @@ // https://www.whatwg.org/html/#htmlmediaelement //enum CanPlayTypeResult { "" /* empty string */, "maybe", "probably" }; +[Abstract] interface HTMLMediaElement : HTMLElement { // error state diff --git a/components/script/dom/webidls/HTMLTableCellElement.webidl b/components/script/dom/webidls/HTMLTableCellElement.webidl index de1211b6333..1371bea720e 100644 --- a/components/script/dom/webidls/HTMLTableCellElement.webidl +++ b/components/script/dom/webidls/HTMLTableCellElement.webidl @@ -4,6 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // https://www.whatwg.org/html/#htmltablecellelement +[Abstract] interface HTMLTableCellElement : HTMLElement { attribute unsigned long colSpan; // attribute unsigned long rowSpan; diff --git a/components/script/dom/webidls/Node.webidl b/components/script/dom/webidls/Node.webidl index bb118820237..73635ab6f7b 100644 --- a/components/script/dom/webidls/Node.webidl +++ b/components/script/dom/webidls/Node.webidl @@ -7,6 +7,7 @@ * https://dom.spec.whatwg.org/#interface-node */ +[Abstract] interface Node : EventTarget { const unsigned short ELEMENT_NODE = 1; const unsigned short ATTRIBUTE_NODE = 2; // historical diff --git a/components/script/dom/webidls/WorkerGlobalScope.webidl b/components/script/dom/webidls/WorkerGlobalScope.webidl index c8427b95fd0..28a4f028bb5 100644 --- a/components/script/dom/webidls/WorkerGlobalScope.webidl +++ b/components/script/dom/webidls/WorkerGlobalScope.webidl @@ -2,8 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -// https://www.whatwg.org/html/#workerglobalscope -//[Exposed=Worker] +// https://html.spec.whatwg.org/multipage/#workerglobalscope +[Abstract/*, Exposed=Worker*/] interface WorkerGlobalScope : EventTarget { [BinaryName="Self_"] readonly attribute WorkerGlobalScope self; readonly attribute WorkerLocation location; diff --git a/components/script/dom/webidls/XMLHttpRequestEventTarget.webidl b/components/script/dom/webidls/XMLHttpRequestEventTarget.webidl index fa2d9625ad9..7756d9dd623 100644 --- a/components/script/dom/webidls/XMLHttpRequestEventTarget.webidl +++ b/components/script/dom/webidls/XMLHttpRequestEventTarget.webidl @@ -13,7 +13,7 @@ * http://www.openwebfoundation.org/legal/the-owf-1-0-agreements/owfa-1-0. */ -//[Exposed=(Window,Worker)] +[Abstract/*, Exposed=(Window,Worker)*/] interface XMLHttpRequestEventTarget : EventTarget { // event handlers attribute EventHandler onloadstart; diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 5d5e944ccf2..4fbd17a7413 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -38,8 +38,6 @@ use std::sync::mpsc::Receiver; #[derive(Copy, Clone, PartialEq)] pub enum WorkerGlobalScopeTypeId { - WorkerGlobalScope, - DedicatedWorkerGlobalScope, } diff --git a/components/script/dom/xmlhttprequesteventtarget.rs b/components/script/dom/xmlhttprequesteventtarget.rs index 20452261f94..66dcb5f8211 100644 --- a/components/script/dom/xmlhttprequesteventtarget.rs +++ b/components/script/dom/xmlhttprequesteventtarget.rs @@ -10,8 +10,6 @@ use dom::eventtarget::{EventTarget, EventTargetTypeId}; #[derive(Copy, Clone, PartialEq)] pub enum XMLHttpRequestEventTargetTypeId { - XMLHttpRequestEventTarget, - XMLHttpRequest, XMLHttpRequestUpload, } diff --git a/components/script/mem.rs b/components/script/mem.rs index 55c92f6e4e4..2e46ffea85e 100644 --- a/components/script/mem.rs +++ b/components/script/mem.rs @@ -9,9 +9,7 @@ use dom::element::ElementTypeId; use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::htmlelement::HTMLElementTypeId; use dom::htmlmediaelement::HTMLMediaElementTypeId::HTMLAudioElement; -use dom::htmlmediaelement::HTMLMediaElementTypeId::HTMLMediaElement; use dom::htmlmediaelement::HTMLMediaElementTypeId::HTMLVideoElement; -use dom::htmltablecellelement::HTMLTableCellElementTypeId::HTMLTableCellElement; use dom::htmltablecellelement::HTMLTableCellElementTypeId::HTMLTableDataCellElement; use dom::htmltablecellelement::HTMLTableCellElementTypeId::HTMLTableHeaderCellElement; use dom::node::NodeTypeId; @@ -249,13 +247,5 @@ pub fn heap_size_of_eventtarget(target: &EventTarget) -> usize { heap_size_of_self_and_children(DocumentTypeCast::to_ref(target).unwrap()), &EventTargetTypeId::Node(NodeTypeId::DocumentFragment) => heap_size_of_self_and_children(DocumentFragmentCast::to_ref(target).unwrap()), - &EventTargetTypeId::EventTarget | - &EventTargetTypeId::Node(NodeTypeId::Node) | - &EventTargetTypeId::Node(NodeTypeId::Element(ElementTypeId::HTMLElement( - HTMLElementTypeId::HTMLMediaElement(HTMLMediaElement)))) | - &EventTargetTypeId::Node(NodeTypeId::Element(ElementTypeId::HTMLElement( - HTMLElementTypeId::HTMLTableCellElement(HTMLTableCellElement)))) => { - unreachable!() - }, } } diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index 250b128e5f3..8aec2e816e4 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -184,8 +184,6 @@ impl<'a> Serializable for &'a Node { traversal_scope: TraversalScope) -> io::Result<()> { let node = *self; match (traversal_scope, node.type_id()) { - (_, NodeTypeId::Node) => unreachable!(), - (_, NodeTypeId::CharacterData(CharacterDataTypeId::CharacterData)) => unreachable!(), (_, NodeTypeId::Element(..)) => { let elem = ElementCast::to_ref(node).unwrap(); let name = QualName::new(elem.namespace().clone(), |