diff --git a/components/layout/construct.rs b/components/layout/construct.rs index dd1d58a6acce..8b4fd32d56c2 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -1430,6 +1430,8 @@ 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()); @@ -1585,6 +1587,7 @@ 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 5b3a3de2f186..d0b45e350a3f 100644 --- a/components/script/dom/bindings/codegen/CodegenRust.py +++ b/components/script/dom/bindings/codegen/CodegenRust.py @@ -1722,6 +1722,25 @@ def build(namespaces, child, public=False): return CGNamespace(namespaces[0], inner, public=public) +def EventTargetEnum(desc): + protochain = desc.prototypeChain + if protochain[0] != "EventTarget": + return "None" + + inner = "" + name = desc.interface.identifier.name + if desc.interface.getUserData("hasConcreteDescendant", False): + inner = "(::dom::%s::%sTypeId::%s)" % (name.lower(), name, name) + prev_proto = "" + for proto in reversed(protochain): + if prev_proto != "": + inner = "(::dom::%s::%sTypeId::%s%s)" % (proto.lower(), proto, prev_proto, inner) + prev_proto = proto + if inner == "": + return "None" + return "Some%s" % inner + + def DOMClass(descriptor): protoList = ['PrototypeList::ID::' + proto for proto in descriptor.prototypeChain] # Pad out the list to the right length with ID::Count so we @@ -1734,7 +1753,8 @@ def DOMClass(descriptor): DOMClass { interface_chain: [ %s ], native_hooks: &sNativePropertyHooks, -}""" % prototypeChainString + type_id: %s, +}""" % (prototypeChainString, EventTargetEnum(descriptor)) class CGDOMJSClass(CGThing): diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py index 1a88968619bf..2573e96fc785 100644 --- a/components/script/dom/bindings/codegen/Configuration.py +++ b/components/script/dom/bindings/codegen/Configuration.py @@ -223,8 +223,9 @@ def addIndexedOrNamedOperation(operation, m): if m.isDeleter(): addIndexedOrNamedOperation('Deleter', m) - iface.setUserData('hasConcreteDescendant', True) iface = iface.parent + if iface: + iface.setUserData('hasConcreteDescendant', True) if self.proxy: iface = self.interface diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 35f7be92b948..7118bef0e685 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -645,7 +645,7 @@ pub unsafe fn native_from_reflector(obj: *mut JSObject) -> *const T { } /// Get the `DOMClass` from `obj`, or `Err(())` if `obj` is not a DOM object. -unsafe fn get_dom_class(obj: *mut JSObject) -> Result { +pub unsafe fn get_dom_class(obj: *mut JSObject) -> Result<&'static DOMClass, ()> { use dom::bindings::utils::DOMJSClass; use js::glue::GetProxyHandlerExtra; @@ -653,12 +653,12 @@ unsafe fn get_dom_class(obj: *mut JSObject) -> Result { if is_dom_class(&*clasp) { debug!("plain old dom object"); let domjsclass: *const DOMJSClass = clasp as *const DOMJSClass; - return Ok((*domjsclass).dom_class); + return Ok(&(&*domjsclass).dom_class); } if is_dom_proxy(obj) { debug!("proxy dom object"); let dom_class: *const DOMClass = GetProxyHandlerExtra(obj) as *const DOMClass; - return Ok(*dom_class); + return Ok(&*dom_class); } debug!("not a dom object"); Err(()) diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 08e8fde72250..be600d807d37 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -15,6 +15,7 @@ use dom::bindings::global::GlobalRef; use dom::bindings::js::Root; use dom::bindings::trace::trace_object; use dom::browsercontext; +use dom::eventtarget::EventTargetTypeId; use dom::window; use util::mem::HeapSizeOf; use util::str::DOMString; @@ -157,6 +158,9 @@ pub struct DOMClass { /// derivedness. pub interface_chain: [PrototypeList::ID; MAX_PROTO_CHAIN_LENGTH], + /// The EventTarget type, if this is derived from an EventTarget. + pub type_id: Option, + /// The NativePropertyHooks for the interface associated with this class. pub native_hooks: &'static NativePropertyHooks, } diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index 3efcd7c16c28..d4a2c5e04784 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -158,8 +158,10 @@ impl CharacterDataMethods for CharacterData { } /// The different types of CharacterData. -#[derive(JSTraceable, Copy, Clone, PartialEq, Debug, HeapSizeOf)] +#[derive(Copy, Clone, PartialEq, Debug)] pub enum CharacterDataTypeId { + CharacterData, + Comment, Text, ProcessingInstruction, diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index a3c033e56a69..9ced72210783 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -163,8 +163,7 @@ impl DedicatedWorkerGlobalScope { -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { workerglobalscope: WorkerGlobalScope::new_inherited( - WorkerGlobalScopeTypeId::DedicatedGlobalScope, init, worker_url, - runtime, from_devtools_receiver), + init, worker_url, runtime, from_devtools_receiver), id: id, receiver: receiver, own_sender: own_sender, @@ -364,7 +363,7 @@ impl DedicatedWorkerGlobalScopeMethods for DedicatedWorkerGlobalScope { impl DedicatedWorkerGlobalScopeDerived for EventTarget { fn is_dedicatedworkerglobalscope(&self) -> bool { match *self.type_id() { - EventTargetTypeId::WorkerGlobalScope(WorkerGlobalScopeTypeId::DedicatedGlobalScope) => true, + EventTargetTypeId::WorkerGlobalScope(WorkerGlobalScopeTypeId::DedicatedWorkerGlobalScope) => true, _ => false } } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 27e8e9c7b7ec..bd522dccf0af 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -116,7 +116,7 @@ impl PartialEq for Element { } } -#[derive(JSTraceable, Copy, Clone, PartialEq, Debug, HeapSizeOf)] +#[derive(Copy, Clone, PartialEq, Debug)] pub enum ElementTypeId { HTMLElement(HTMLElementTypeId), Element, diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index f2f228f2c0df..6ac33876e09d 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -7,6 +7,7 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventListenerBinding::EventListener; use dom::bindings::codegen::Bindings::EventTargetBinding::EventTargetMethods; +use dom::bindings::conversions::get_dom_class; use dom::bindings::error::Error::InvalidState; use dom::bindings::error::{Fallible, report_pending_exception}; use dom::bindings::utils::{Reflectable, Reflector}; @@ -45,9 +46,10 @@ pub enum ListenerPhase { Bubbling, } -#[derive(JSTraceable, Copy, Clone)] -#[derive(HeapSizeOf)] +#[derive(Copy, Clone)] pub enum EventTargetTypeId { + EventTarget, + Node(NodeTypeId), WebSocket, Window, @@ -132,15 +134,13 @@ pub struct EventListenerEntry { #[dom_struct] pub struct EventTarget { reflector_: Reflector, - type_id: EventTargetTypeId, handlers: DOMRefCell, DefaultState>>, } impl EventTarget { - pub fn new_inherited(type_id: EventTargetTypeId) -> EventTarget { + pub fn new_inherited() -> EventTarget { EventTarget { reflector_: Reflector::new(), - type_id: type_id, handlers: DOMRefCell::new(Default::default()), } } @@ -159,9 +159,12 @@ impl EventTarget { }) } - #[inline] + #[allow(unsafe_code)] pub fn type_id(&self) -> &EventTargetTypeId { - &self.type_id + let domclass = unsafe { + get_dom_class(self.reflector_.get_jsobject().get()).unwrap() + }; + domclass.type_id.as_ref().unwrap() } pub fn dispatch_event_with_target(&self, diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index ffd74806c04d..5de6f4dd5f99 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -15,7 +15,7 @@ use dom::bindings::utils::{reflect_dom_object, Reflectable}; use dom::blob::Blob; use dom::domexception::{DOMException, DOMErrorName}; use dom::event::{EventCancelable, EventBubbles}; -use dom::eventtarget::{EventTarget, EventTargetTypeId}; +use dom::eventtarget::EventTarget; use dom::progressevent::ProgressEvent; use encoding::all::UTF_8; use encoding::label::encoding_from_whatwg_label; @@ -80,7 +80,7 @@ pub struct FileReader { impl FileReader { pub fn new_inherited(global: GlobalRef) -> FileReader { FileReader { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::FileReader),//? + eventtarget: EventTarget::new_inherited(),//? global: GlobalField::from_rooted(&global), ready_state: Cell::new(FileReaderReadyState::Empty), error: MutNullableHeap::new(None), diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 661378a7fc40..9a02a47dd0f8 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -344,7 +344,7 @@ impl VirtualMethods for HTMLElement { } } -#[derive(JSTraceable, Copy, Clone, Debug, HeapSizeOf)] +#[derive(Copy, Clone, Debug)] pub enum HTMLElementTypeId { HTMLElement, diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 4b40e13e1292..7a2b798c7285 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -41,8 +41,10 @@ impl HTMLMediaElement { } } -#[derive(JSTraceable, Copy, Clone, Debug, HeapSizeOf)] +#[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 c67d02c86937..e1f8179a19b7 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -22,8 +22,10 @@ use std::cmp::max; const DEFAULT_COLSPAN: u32 = 1; -#[derive(JSTraceable, Copy, Clone, Debug, HeapSizeOf)] +#[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 b0c8d79228eb..5f437fe0cad7 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>, @@ -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 { #[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 = 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> { - 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 { - 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) { - 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 { - 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) { 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> { // 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!() } } diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 4b614786efa9..2bf84d609e71 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -20,7 +20,7 @@ use dom::bindings::utils::{reflect_dom_object, Reflectable}; use dom::blob::Blob; use dom::closeevent::CloseEvent; use dom::event::{Event, EventBubbles, EventCancelable}; -use dom::eventtarget::{EventTarget, EventTargetTypeId}; +use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; use script_task::ScriptTaskEventCategory::WebSocketEvent; use script_task::{Runnable, CommonScriptMsg}; @@ -110,7 +110,7 @@ fn establish_a_websocket_connection(resource_url: &Url, net_url: (Host, String, impl WebSocket { fn new_inherited(global: GlobalRef, url: Url) -> WebSocket { WebSocket { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::WebSocket), + eventtarget: EventTarget::new_inherited(), url: url, global: GlobalField::from_rooted(&global), ready_state: Cell::new(WebSocketRequestState::Connecting), diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2ca420d441d3..484685584c2a 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1288,7 +1288,7 @@ impl Window { }; let win = box Window { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::Window), + eventtarget: EventTarget::new_inherited(), script_chan: script_chan, image_cache_chan: image_cache_chan, control_chan: control_chan, diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 2711e8502db5..92053392db76 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -17,7 +17,7 @@ use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::dedicatedworkerglobalscope::{DedicatedWorkerGlobalScope, WorkerScriptMsg}; use dom::errorevent::ErrorEvent; use dom::event::{Event, EventBubbles, EventCancelable}; -use dom::eventtarget::{EventTarget, EventTargetTypeId}; +use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; use dom::workerglobalscope::WorkerGlobalScopeInit; @@ -52,7 +52,7 @@ impl Worker { sender: Sender<(TrustedWorkerAddress, WorkerScriptMsg)>) -> Worker { Worker { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::Worker), + eventtarget: EventTarget::new_inherited(), global: GlobalField::from_rooted(&global), sender: sender, } diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 3bc805a67e67..5d5e944ccf23 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -12,7 +12,7 @@ use dom::bindings::js::{JS, Root, MutNullableHeap}; use dom::bindings::utils::Reflectable; use dom::console::Console; use dom::crypto::Crypto; -use dom::eventtarget::{EventTarget, EventTargetTypeId}; +use dom::eventtarget::EventTarget; use dom::window::{base64_atob, base64_btoa}; use dom::workerlocation::WorkerLocation; use dom::workernavigator::WorkerNavigator; @@ -36,9 +36,11 @@ use std::default::Default; use std::rc::Rc; use std::sync::mpsc::Receiver; -#[derive(JSTraceable, Copy, Clone, PartialEq, HeapSizeOf)] +#[derive(Copy, Clone, PartialEq)] pub enum WorkerGlobalScopeTypeId { - DedicatedGlobalScope, + WorkerGlobalScope, + + DedicatedWorkerGlobalScope, } pub struct WorkerGlobalScopeInit { @@ -90,14 +92,13 @@ pub struct WorkerGlobalScope { } impl WorkerGlobalScope { - pub fn new_inherited(type_id: WorkerGlobalScopeTypeId, - init: WorkerGlobalScopeInit, + pub fn new_inherited(init: WorkerGlobalScopeInit, worker_url: Url, runtime: Rc, from_devtools_receiver: Receiver) -> WorkerGlobalScope { WorkerGlobalScope { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::WorkerGlobalScope(type_id)), + eventtarget: EventTarget::new_inherited(), next_worker_id: Cell::new(WorkerId(0)), worker_id: init.worker_id, worker_url: worker_url, diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 4dd5647029a0..743c0e2f6dd7 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -155,7 +155,7 @@ pub struct XMLHttpRequest { impl XMLHttpRequest { fn new_inherited(global: GlobalRef) -> XMLHttpRequest { XMLHttpRequest { - eventtarget: XMLHttpRequestEventTarget::new_inherited(XMLHttpRequestEventTargetTypeId::XMLHttpRequest), + eventtarget: XMLHttpRequestEventTarget::new_inherited(), ready_state: Cell::new(XMLHttpRequestState::Unsent), timeout: Cell::new(0u32), with_credentials: Cell::new(false), diff --git a/components/script/dom/xmlhttprequesteventtarget.rs b/components/script/dom/xmlhttprequesteventtarget.rs index 627e4882dded..20452261f949 100644 --- a/components/script/dom/xmlhttprequesteventtarget.rs +++ b/components/script/dom/xmlhttprequesteventtarget.rs @@ -8,8 +8,10 @@ use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::codegen::InheritTypes::XMLHttpRequestEventTargetDerived; use dom::eventtarget::{EventTarget, EventTargetTypeId}; -#[derive(JSTraceable, Copy, Clone, PartialEq, HeapSizeOf)] +#[derive(Copy, Clone, PartialEq)] pub enum XMLHttpRequestEventTargetTypeId { + XMLHttpRequestEventTarget, + XMLHttpRequest, XMLHttpRequestUpload, } @@ -20,9 +22,9 @@ pub struct XMLHttpRequestEventTarget { } impl XMLHttpRequestEventTarget { - pub fn new_inherited(type_id: XMLHttpRequestEventTargetTypeId) -> XMLHttpRequestEventTarget { + pub fn new_inherited() -> XMLHttpRequestEventTarget { XMLHttpRequestEventTarget { - eventtarget: EventTarget::new_inherited(EventTargetTypeId::XMLHttpRequestEventTarget(type_id)) + eventtarget: EventTarget::new_inherited() } } } diff --git a/components/script/dom/xmlhttprequestupload.rs b/components/script/dom/xmlhttprequestupload.rs index d112d9d1e08b..c7d4d4d4ca30 100644 --- a/components/script/dom/xmlhttprequestupload.rs +++ b/components/script/dom/xmlhttprequestupload.rs @@ -19,8 +19,7 @@ pub struct XMLHttpRequestUpload { impl XMLHttpRequestUpload { fn new_inherited() -> XMLHttpRequestUpload { XMLHttpRequestUpload { - eventtarget: XMLHttpRequestEventTarget::new_inherited( - XMLHttpRequestEventTargetTypeId::XMLHttpRequestUpload) + eventtarget: XMLHttpRequestEventTarget::new_inherited(), } } pub fn new(global: GlobalRef) -> Root { diff --git a/components/script/mem.rs b/components/script/mem.rs index b3a236866bbf..55c92f6e4e4d 100644 --- a/components/script/mem.rs +++ b/components/script/mem.rs @@ -8,8 +8,12 @@ use dom::bindings::codegen::InheritTypes::*; use dom::element::ElementTypeId; use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::htmlelement::HTMLElementTypeId; -use dom::htmlmediaelement::HTMLMediaElementTypeId::{HTMLAudioElement, HTMLVideoElement}; -use dom::htmltablecellelement::HTMLTableCellElementTypeId::{HTMLTableDataCellElement, HTMLTableHeaderCellElement}; +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; use libc; use util::mem::{HeapSizeOf, heap_size_of}; @@ -245,5 +249,13 @@ 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 8aec2e816e4b..250b128e5f33 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -184,6 +184,8 @@ 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(), diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs index cea905ef5458..1b34e4624701 100644 --- a/tests/unit/script/size_of.rs +++ b/tests/unit/script/size_of.rs @@ -38,11 +38,11 @@ macro_rules! sizeof_checker ( ); // Update the sizes here -sizeof_checker!(size_event_target, EventTarget, 48); -sizeof_checker!(size_node, Node, 184); -sizeof_checker!(size_element, Element, 296); -sizeof_checker!(size_htmlelement, HTMLElement, 312); -sizeof_checker!(size_div, HTMLDivElement, 312); -sizeof_checker!(size_span, HTMLSpanElement, 312); -sizeof_checker!(size_text, Text, 216); -sizeof_checker!(size_characterdata, CharacterData, 216); +sizeof_checker!(size_event_target, EventTarget, 40); +sizeof_checker!(size_node, Node, 168); +sizeof_checker!(size_element, Element, 280); +sizeof_checker!(size_htmlelement, HTMLElement, 296); +sizeof_checker!(size_div, HTMLDivElement, 296); +sizeof_checker!(size_span, HTMLSpanElement, 296); +sizeof_checker!(size_text, Text, 200); +sizeof_checker!(size_characterdata, CharacterData, 200);