aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2016-09-26 15:48:09 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2016-10-06 20:59:08 +0200
commit5a42bb58f9da18426f1d5bb892ccf74525793e01 (patch)
treec6cc2144f8ffaa47c4714aa2ffa0a30f779fd686
parentb745866a4d16eeb5de5f05811b7c4e107d644397 (diff)
downloadservo-5a42bb58f9da18426f1d5bb892ccf74525793e01.tar.gz
servo-5a42bb58f9da18426f1d5bb892ccf74525793e01.zip
Implement [Inline] interfaces
Inline interfaces just appear as a Rust type and in the TypeId hierarchy. They are completely invisible on the JS side.
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py56
-rw-r--r--components/script/dom/bindings/codegen/Configuration.py11
-rw-r--r--components/script/dom/bindings/codegen/parser/WebIDL.py3
-rw-r--r--components/script/dom/bindings/codegen/parser/inline.patch12
-rwxr-xr-xcomponents/script/dom/bindings/codegen/parser/update.sh1
-rw-r--r--components/script/dom/globalscope.rs18
-rw-r--r--components/script/dom/mod.rs1
-rw-r--r--components/script/dom/webidls/GlobalScope.webidl10
-rw-r--r--components/script/dom/webidls/Window.webidl2
-rw-r--r--components/script/dom/webidls/WorkerGlobalScope.webidl2
-rw-r--r--components/script/dom/window.rs5
-rw-r--r--components/script/dom/workerglobalscope.rs6
12 files changed, 91 insertions, 36 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index d5b92569d1a..d30cee0ca93 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1929,8 +1929,8 @@ class CGImports(CGWrapper):
if t.isInterface() or t.isNamespace():
descriptor = descriptorProvider.getDescriptor(getIdentifier(t).name)
extras += [descriptor.path]
- if descriptor.interface.parent:
- parentName = getIdentifier(descriptor.interface.parent).name
+ parentName = descriptor.getParentName()
+ if parentName:
descriptor = descriptorProvider.getDescriptor(parentName)
extras += [descriptor.path, descriptor.bindingPath]
elif t.isType() and t.isMozMap():
@@ -2754,7 +2754,7 @@ assert!((*cache)[PrototypeList::Constructor::%(id)s as usize].is_null());
getPrototypeProto = "prototype_proto.set(JS_GetObjectPrototype(cx, global))"
else:
getPrototypeProto = ("%s::GetProtoObject(cx, global, prototype_proto.handle_mut())" %
- toBindingNamespace(self.descriptor.prototypeChain[-2]))
+ toBindingNamespace(self.descriptor.getParentName()))
code = [CGGeneric("""\
rooted!(in(cx) let mut prototype_proto = ptr::null_mut());
@@ -2808,8 +2808,9 @@ assert!((*cache)[PrototypeList::ID::%(id)s as usize].is_null());
properties["length"] = methodLength(self.descriptor.interface.ctor())
else:
properties["length"] = 0
- if self.descriptor.interface.parent:
- parentName = toBindingNamespace(self.descriptor.getParentName())
+ parentName = self.descriptor.getParentName()
+ if parentName:
+ parentName = toBindingNamespace(parentName)
code.append(CGGeneric("""
rooted!(in(cx) let mut interface_proto = ptr::null_mut());
%s::GetConstructorObject(cx, global, interface_proto.handle_mut());""" % parentName))
@@ -5744,25 +5745,26 @@ class CGDescriptor(CGThing):
cgThings.append(CGGeneric(str(properties)))
- if not descriptor.interface.isCallback() and not descriptor.interface.isNamespace():
- cgThings.append(CGGetProtoObjectMethod(descriptor))
- reexports.append('GetProtoObject')
- cgThings.append(CGPrototypeJSClass(descriptor))
- if descriptor.interface.hasInterfaceObject():
- if descriptor.interface.ctor():
- cgThings.append(CGClassConstructHook(descriptor))
- for ctor in descriptor.interface.namedConstructors:
- cgThings.append(CGClassConstructHook(descriptor, ctor))
- if not descriptor.interface.isCallback():
- cgThings.append(CGInterfaceObjectJSClass(descriptor))
- if descriptor.shouldHaveGetConstructorObjectMethod():
- cgThings.append(CGGetConstructorObjectMethod(descriptor))
- reexports.append('GetConstructorObject')
- if descriptor.register:
- cgThings.append(CGDefineDOMInterfaceMethod(descriptor))
- reexports.append('DefineDOMInterface')
- cgThings.append(CGConstructorEnabled(descriptor))
- cgThings.append(CGCreateInterfaceObjectsMethod(descriptor, properties, haveUnscopables))
+ if not descriptor.interface.getExtendedAttribute("Inline"):
+ if not descriptor.interface.isCallback() and not descriptor.interface.isNamespace():
+ cgThings.append(CGGetProtoObjectMethod(descriptor))
+ reexports.append('GetProtoObject')
+ cgThings.append(CGPrototypeJSClass(descriptor))
+ if descriptor.interface.hasInterfaceObject():
+ if descriptor.interface.ctor():
+ cgThings.append(CGClassConstructHook(descriptor))
+ for ctor in descriptor.interface.namedConstructors:
+ cgThings.append(CGClassConstructHook(descriptor, ctor))
+ if not descriptor.interface.isCallback():
+ cgThings.append(CGInterfaceObjectJSClass(descriptor))
+ if descriptor.shouldHaveGetConstructorObjectMethod():
+ cgThings.append(CGGetConstructorObjectMethod(descriptor))
+ reexports.append('GetConstructorObject')
+ if descriptor.register:
+ cgThings.append(CGDefineDOMInterfaceMethod(descriptor))
+ reexports.append('DefineDOMInterface')
+ cgThings.append(CGConstructorEnabled(descriptor))
+ cgThings.append(CGCreateInterfaceObjectsMethod(descriptor, properties, haveUnscopables))
cgThings = generate_imports(config, CGList(cgThings, '\n'), [descriptor])
cgThings = CGWrapper(CGNamespace(toBindingNamespace(descriptor.name),
@@ -6803,7 +6805,7 @@ class GlobalGenRoots():
globals_ = CGWrapper(CGIndenter(global_flags), pre="bitflags! {\n", post="\n}")
pairs = []
- for d in config.getDescriptors(hasInterfaceObject=True):
+ for d in config.getDescriptors(hasInterfaceObject=True, isInline=False):
binding = toBindingNamespace(d.name)
pairs.append((d.name, binding, binding))
for ctor in d.interface.namedConstructors:
@@ -6931,7 +6933,7 @@ class GlobalGenRoots():
allprotos.append(CGGeneric("\n"))
if downcast:
- hierarchy[descriptor.getParentName()].append(name)
+ hierarchy[descriptor.interface.parent.identifier.name].append(name)
typeIdCode = []
topTypeVariants = [
@@ -6955,7 +6957,7 @@ class GlobalGenRoots():
for base, derived in hierarchy.iteritems():
variants = []
- if not config.getInterface(base).getExtendedAttribute("Abstract"):
+ if config.getDescriptor(base).concrete:
variants.append(CGGeneric(base))
variants += [CGGeneric(type_id_variant(derivedName)) for derivedName in derived]
derives = "Clone, Copy, Debug, PartialEq"
diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py
index 9a1120769c8..f2f64e9bee0 100644
--- a/components/script/dom/bindings/codegen/Configuration.py
+++ b/components/script/dom/bindings/codegen/Configuration.py
@@ -88,6 +88,8 @@ class Configuration:
getter = lambda x: x.interface.isJSImplemented()
elif key == 'isGlobal':
getter = lambda x: x.isGlobal()
+ elif key == 'isInline':
+ getter = lambda x: x.interface.getExtendedAttribute('Inline') is not None
elif key == 'isExposedConditionally':
getter = lambda x: x.interface.isExposedConditionally()
elif key == 'isIteratorInterface':
@@ -234,6 +236,7 @@ class Descriptor(DescriptorProvider):
self.concrete = (not self.interface.isCallback() and
not self.interface.isNamespace() and
not self.interface.getExtendedAttribute("Abstract") and
+ not self.interface.getExtendedAttribute("Inline") and
not spiderMonkeyInterface)
self.hasUnforgeableMembers = (self.concrete and
any(MemberIsUnforgeable(m, self) for m in
@@ -383,8 +386,12 @@ class Descriptor(DescriptorProvider):
return attrs
def getParentName(self):
- assert self.interface.parent is not None
- return self.interface.parent.identifier.name
+ parent = self.interface.parent
+ while parent:
+ if not parent.getExtendedAttribute("Inline"):
+ return parent.identifier.name
+ parent = parent.parent
+ return None
def hasDescendants(self):
return (self.interface.getUserData("hasConcreteDescendant", False) or
diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py
index 2894bbeb82e..dc9fa036141 100644
--- a/components/script/dom/bindings/codegen/parser/WebIDL.py
+++ b/components/script/dom/bindings/codegen/parser/WebIDL.py
@@ -1695,7 +1695,8 @@ class IDLInterface(IDLInterfaceOrNamespace):
identifier == "ProbablyShortLivingObject" or
identifier == "LegacyUnenumerableNamedProperties" or
identifier == "NonOrdinaryGetPrototypeOf" or
- identifier == "Abstract"):
+ identifier == "Abstract" or
+ identifier == "Inline"):
# 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/inline.patch b/components/script/dom/bindings/codegen/parser/inline.patch
new file mode 100644
index 00000000000..5d1056d2b58
--- /dev/null
+++ b/components/script/dom/bindings/codegen/parser/inline.patch
@@ -0,0 +1,12 @@
+--- WebIDL.py
++++ WebIDL.py
+@@ -1695,7 +1695,8 @@ class IDLInterface(IDLInterfaceOrNamespace):
+ identifier == "ProbablyShortLivingObject" or
+ identifier == "LegacyUnenumerableNamedProperties" or
+ identifier == "NonOrdinaryGetPrototypeOf" or
+- identifier == "Abstract"):
++ identifier == "Abstract" or
++ identifier == "Inline"):
+ # Known extended attributes that do not take values
+ if not attr.noArguments():
+ raise WebIDLError("[%s] must take no arguments" % identifier, \ No newline at end of file
diff --git a/components/script/dom/bindings/codegen/parser/update.sh b/components/script/dom/bindings/codegen/parser/update.sh
index 6bf56cead30..213aba6df89 100755
--- a/components/script/dom/bindings/codegen/parser/update.sh
+++ b/components/script/dom/bindings/codegen/parser/update.sh
@@ -4,6 +4,7 @@ patch < debug.patch
patch < pref-main-thread.patch
patch < callback-location.patch
patch < union-typedef.patch
+patch < inline.patch
wget https://hg.mozilla.org/mozilla-central/archive/tip.tar.gz/dom/bindings/parser/tests/ -O tests.tar.gz
rm -r tests
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
new file mode 100644
index 00000000000..7c284987958
--- /dev/null
+++ b/components/script/dom/globalscope.rs
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/. */
+
+use dom::eventtarget::EventTarget;
+
+#[dom_struct]
+pub struct GlobalScope {
+ eventtarget: EventTarget,
+}
+
+impl GlobalScope {
+ pub fn new_inherited() -> GlobalScope {
+ GlobalScope {
+ eventtarget: EventTarget::new_inherited(),
+ }
+ }
+}
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 0081efba21c..2335f8a0a25 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -276,6 +276,7 @@ pub mod filereadersync;
pub mod focusevent;
pub mod forcetouchevent;
pub mod formdata;
+pub mod globalscope;
pub mod hashchangeevent;
pub mod headers;
pub mod history;
diff --git a/components/script/dom/webidls/GlobalScope.webidl b/components/script/dom/webidls/GlobalScope.webidl
new file mode 100644
index 00000000000..7dab4f3afa7
--- /dev/null
+++ b/components/script/dom/webidls/GlobalScope.webidl
@@ -0,0 +1,10 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/. */
+
+// This interface is entirely internal to Servo, and should not be accessible to
+// web pages.
+
+[Exposed=(Window,Worker),
+ Inline]
+interface GlobalScope : EventTarget {};
diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl
index 84fb4d754de..8fdc636a732 100644
--- a/components/script/dom/webidls/Window.webidl
+++ b/components/script/dom/webidls/Window.webidl
@@ -4,7 +4,7 @@
// https://html.spec.whatwg.org/multipage/#window
[PrimaryGlobal, Exposed=(Window,Worker)]
-/*sealed*/ interface Window : EventTarget {
+/*sealed*/ interface Window : GlobalScope {
// the current browsing context
[Unforgeable] readonly attribute WindowProxy window;
[BinaryName="Self_", Replaceable] readonly attribute WindowProxy self;
diff --git a/components/script/dom/webidls/WorkerGlobalScope.webidl b/components/script/dom/webidls/WorkerGlobalScope.webidl
index 186e5cd7fee..dcdd2957d43 100644
--- a/components/script/dom/webidls/WorkerGlobalScope.webidl
+++ b/components/script/dom/webidls/WorkerGlobalScope.webidl
@@ -4,7 +4,7 @@
// https://html.spec.whatwg.org/multipage/#workerglobalscope
[Abstract, Exposed=Worker]
-interface WorkerGlobalScope : EventTarget {
+interface WorkerGlobalScope : GlobalScope {
[BinaryName="Self_"] readonly attribute WorkerGlobalScope self;
readonly attribute WorkerLocation location;
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 3ac5c4e37f9..85c8f46fc63 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -35,6 +35,7 @@ use dom::element::Element;
use dom::errorevent::ErrorEvent;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventtarget::EventTarget;
+use dom::globalscope::GlobalScope;
use dom::history::History;
use dom::htmliframeelement::build_mozbrowser_custom_event;
use dom::location::Location;
@@ -143,7 +144,7 @@ pub type ScrollPoint = Point2D<Au>;
#[dom_struct]
pub struct Window {
- eventtarget: EventTarget,
+ globalscope: GlobalScope,
#[ignore_heap_size_of = "trait objects are hard"]
script_chan: MainThreadScriptChan,
#[ignore_heap_size_of = "task sources are hard"]
@@ -1629,7 +1630,7 @@ impl Window {
};
let current_time = time::get_time();
let win = box Window {
- eventtarget: EventTarget::new_inherited(),
+ globalscope: GlobalScope::new_inherited(),
script_chan: script_chan,
dom_manipulation_task_source: dom_task_source,
user_interaction_task_source: user_task_source,
diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs
index 9b976c5a31d..e05043b31c4 100644
--- a/components/script/dom/workerglobalscope.rs
+++ b/components/script/dom/workerglobalscope.rs
@@ -22,6 +22,7 @@ use dom::errorevent::ErrorEvent;
use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventdispatcher::EventStatus;
use dom::eventtarget::EventTarget;
+use dom::globalscope::GlobalScope;
use dom::promise::Promise;
use dom::serviceworkerglobalscope::ServiceWorkerGlobalScope;
use dom::window::{base64_atob, base64_btoa};
@@ -79,7 +80,8 @@ pub fn prepare_workerscope_init(global: GlobalRef,
// https://html.spec.whatwg.org/multipage/#the-workerglobalscope-common-interface
#[dom_struct]
pub struct WorkerGlobalScope {
- eventtarget: EventTarget,
+ globalscope: GlobalScope,
+
worker_id: WorkerId,
pipeline_id: PipelineId,
worker_url: Url,
@@ -140,7 +142,7 @@ impl WorkerGlobalScope {
closing: Option<Arc<AtomicBool>>)
-> WorkerGlobalScope {
WorkerGlobalScope {
- eventtarget: EventTarget::new_inherited(),
+ globalscope: GlobalScope::new_inherited(),
next_worker_id: Cell::new(WorkerId(0)),
worker_id: init.worker_id,
pipeline_id: init.pipeline_id,