Move EventTargetTypeId/NodeTypeId to DOMClass

This commit is contained in:
Michael Wu 2015-07-10 21:27:41 -04:00 committed by Anthony Ramine
parent 8d7ba12f28
commit 941f7dc04b
24 changed files with 149 additions and 74 deletions

View file

@ -1722,6 +1722,25 @@ class CGNamespace(CGWrapper):
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):

View file

@ -223,8 +223,9 @@ class Descriptor(DescriptorProvider):
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

View file

@ -645,7 +645,7 @@ pub unsafe fn native_from_reflector<T>(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<DOMClass, ()> {
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<DOMClass, ()> {
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(())

View file

@ -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<EventTargetTypeId>,
/// The NativePropertyHooks for the interface associated with this class.
pub native_hooks: &'static NativePropertyHooks,
}