aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2015-09-11 23:55:20 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2015-09-13 19:46:28 +0200
commitc25085f68a86e2885d77146add097f9f796c96ac (patch)
tree6e5f7040cd7b4ba5cfb421049485782f44b22740
parent941f7dc04bc02ad196e86c5167ea292477fb7284 (diff)
downloadservo-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.
-rw-r--r--components/layout/construct.rs3
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py2
-rw-r--r--components/script/dom/bindings/codegen/parser/WebIDL.py3
-rw-r--r--components/script/dom/bindings/codegen/parser/abstract.patch12
-rwxr-xr-xcomponents/script/dom/bindings/codegen/parser/update.sh1
-rw-r--r--components/script/dom/characterdata.rs2
-rw-r--r--components/script/dom/eventtarget.rs2
-rw-r--r--components/script/dom/htmlmediaelement.rs2
-rw-r--r--components/script/dom/htmltablecellelement.rs2
-rw-r--r--components/script/dom/node.rs18
-rw-r--r--components/script/dom/webidls/CharacterData.webidl1
-rw-r--r--components/script/dom/webidls/EventTarget.webidl1
-rw-r--r--components/script/dom/webidls/HTMLMediaElement.webidl1
-rw-r--r--components/script/dom/webidls/HTMLTableCellElement.webidl1
-rw-r--r--components/script/dom/webidls/Node.webidl1
-rw-r--r--components/script/dom/webidls/WorkerGlobalScope.webidl4
-rw-r--r--components/script/dom/webidls/XMLHttpRequestEventTarget.webidl2
-rw-r--r--components/script/dom/workerglobalscope.rs2
-rw-r--r--components/script/dom/xmlhttprequesteventtarget.rs2
-rw-r--r--components/script/mem.rs10
-rw-r--r--components/script/parse/html.rs2
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(),