зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1119490 - Expose the URL constructor to WorkerDebuggerGlobalScope;r=khuey
This commit is contained in:
Родитель
b7e9c528d8
Коммит
dae2755a45
|
@ -12826,6 +12826,46 @@ class CGRegisterWorkerBindings(CGAbstractMethod):
|
||||||
lines.append(CGGeneric("return true;\n"))
|
lines.append(CGGeneric("return true;\n"))
|
||||||
return CGList(lines, "\n").define()
|
return CGList(lines, "\n").define()
|
||||||
|
|
||||||
|
class CGRegisterWorkerDebuggerBindings(CGAbstractMethod):
|
||||||
|
def __init__(self, config):
|
||||||
|
CGAbstractMethod.__init__(self, None, 'RegisterWorkerDebuggerBindings', 'bool',
|
||||||
|
[Argument('JSContext*', 'aCx'),
|
||||||
|
Argument('JS::Handle<JSObject*>', 'aObj')])
|
||||||
|
self.config = config
|
||||||
|
|
||||||
|
def definition_body(self):
|
||||||
|
# We have to be a bit careful: Some of the interfaces we want to expose
|
||||||
|
# in workers only have one descriptor, while others have both a worker
|
||||||
|
# and a non-worker descriptor. When both are present we want the worker
|
||||||
|
# descriptor, but otherwise we want whatever descriptor we've got.
|
||||||
|
descriptors = self.config.getDescriptors(hasInterfaceObject=True,
|
||||||
|
isExposedInWorkerDebugger=True,
|
||||||
|
register=True,
|
||||||
|
skipGen=False,
|
||||||
|
workers=True)
|
||||||
|
workerDescriptorIfaceNames = set(d.interface.identifier.name for
|
||||||
|
d in descriptors)
|
||||||
|
descriptors.extend(
|
||||||
|
filter(
|
||||||
|
lambda d: d.interface.identifier.name not in workerDescriptorIfaceNames,
|
||||||
|
self.config.getDescriptors(hasInterfaceObject=True,
|
||||||
|
isExposedInWorkerDebugger=True,
|
||||||
|
register=True,
|
||||||
|
skipGen=False,
|
||||||
|
workers=False)))
|
||||||
|
conditions = []
|
||||||
|
for desc in descriptors:
|
||||||
|
bindingNS = toBindingNamespace(desc.name)
|
||||||
|
condition = "!%s::GetConstructorObject(aCx, aObj)" % bindingNS
|
||||||
|
if desc.isExposedConditionally():
|
||||||
|
condition = (
|
||||||
|
"%s::ConstructorEnabled(aCx, aObj) && " % bindingNS
|
||||||
|
+ condition)
|
||||||
|
conditions.append(condition)
|
||||||
|
lines = [CGIfWrapper(CGGeneric("return false;\n"), condition) for
|
||||||
|
condition in conditions]
|
||||||
|
lines.append(CGGeneric("return true;\n"))
|
||||||
|
return CGList(lines, "\n").define()
|
||||||
|
|
||||||
class CGResolveSystemBinding(CGAbstractMethod):
|
class CGResolveSystemBinding(CGAbstractMethod):
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
|
@ -16081,6 +16121,32 @@ class GlobalGenRoots():
|
||||||
# Done.
|
# Done.
|
||||||
return curr
|
return curr
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def RegisterWorkerDebuggerBindings(config):
|
||||||
|
|
||||||
|
curr = CGRegisterWorkerDebuggerBindings(config)
|
||||||
|
|
||||||
|
# Wrap all of that in our namespaces.
|
||||||
|
curr = CGNamespace.build(['mozilla', 'dom'],
|
||||||
|
CGWrapper(curr, post='\n'))
|
||||||
|
curr = CGWrapper(curr, post='\n')
|
||||||
|
|
||||||
|
# Add the includes
|
||||||
|
defineIncludes = [CGHeaders.getDeclarationFilename(desc.interface)
|
||||||
|
for desc in config.getDescriptors(hasInterfaceObject=True,
|
||||||
|
register=True,
|
||||||
|
isExposedInWorkerDebugger=True,
|
||||||
|
skipGen=False)]
|
||||||
|
|
||||||
|
curr = CGHeaders([], [], [], [], [], defineIncludes,
|
||||||
|
'RegisterWorkerDebuggerBindings', curr)
|
||||||
|
|
||||||
|
# Add include guards.
|
||||||
|
curr = CGIncludeGuard('RegisterWorkerDebuggerBindings', curr)
|
||||||
|
|
||||||
|
# Done.
|
||||||
|
return curr
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def ResolveSystemBinding(config):
|
def ResolveSystemBinding(config):
|
||||||
|
|
||||||
|
|
|
@ -228,6 +228,8 @@ class Configuration:
|
||||||
getter = lambda x: x.interface.getNavigatorProperty() is not None
|
getter = lambda x: x.interface.getNavigatorProperty() is not None
|
||||||
elif key == 'isExposedInAnyWorker':
|
elif key == 'isExposedInAnyWorker':
|
||||||
getter = lambda x: x.interface.isExposedInAnyWorker()
|
getter = lambda x: x.interface.isExposedInAnyWorker()
|
||||||
|
elif key == 'isExposedInWorkerDebugger':
|
||||||
|
getter = lambda x: x.interface.isExposedInWorkerDebugger()
|
||||||
elif key == 'isExposedInSystemGlobals':
|
elif key == 'isExposedInSystemGlobals':
|
||||||
getter = lambda x: x.interface.isExposedInSystemGlobals()
|
getter = lambda x: x.interface.isExposedInSystemGlobals()
|
||||||
elif key == 'isExposedInWindow':
|
elif key == 'isExposedInWindow':
|
||||||
|
|
|
@ -133,6 +133,7 @@ class WebIDLCodegenManager(LoggingMixin):
|
||||||
'PrototypeList.h',
|
'PrototypeList.h',
|
||||||
'RegisterBindings.h',
|
'RegisterBindings.h',
|
||||||
'RegisterWorkerBindings.h',
|
'RegisterWorkerBindings.h',
|
||||||
|
'RegisterWorkerDebuggerBindings.h',
|
||||||
'ResolveSystemBinding.h',
|
'ResolveSystemBinding.h',
|
||||||
'UnionConversions.h',
|
'UnionConversions.h',
|
||||||
'UnionTypes.h',
|
'UnionTypes.h',
|
||||||
|
@ -142,6 +143,7 @@ class WebIDLCodegenManager(LoggingMixin):
|
||||||
GLOBAL_DEFINE_FILES = {
|
GLOBAL_DEFINE_FILES = {
|
||||||
'RegisterBindings.cpp',
|
'RegisterBindings.cpp',
|
||||||
'RegisterWorkerBindings.cpp',
|
'RegisterWorkerBindings.cpp',
|
||||||
|
'RegisterWorkerDebuggerBindings.cpp',
|
||||||
'ResolveSystemBinding.cpp',
|
'ResolveSystemBinding.cpp',
|
||||||
'UnionTypes.cpp',
|
'UnionTypes.cpp',
|
||||||
'PrototypeList.cpp',
|
'PrototypeList.cpp',
|
||||||
|
|
|
@ -508,6 +508,9 @@ class IDLExposureMixins():
|
||||||
def isExposedInAnyWorker(self):
|
def isExposedInAnyWorker(self):
|
||||||
return len(self.getWorkerExposureSet()) > 0
|
return len(self.getWorkerExposureSet()) > 0
|
||||||
|
|
||||||
|
def isExposedInWorkerDebugger(self):
|
||||||
|
return len(self.getWorkerDebuggerExposureSet()) > 0
|
||||||
|
|
||||||
def isExposedInSystemGlobals(self):
|
def isExposedInSystemGlobals(self):
|
||||||
return 'BackstagePass' in self.exposureSet
|
return 'BackstagePass' in self.exposureSet
|
||||||
|
|
||||||
|
@ -527,6 +530,10 @@ class IDLExposureMixins():
|
||||||
workerScopes = self._globalScope.globalNameMapping["Worker"]
|
workerScopes = self._globalScope.globalNameMapping["Worker"]
|
||||||
return workerScopes.intersection(self.exposureSet)
|
return workerScopes.intersection(self.exposureSet)
|
||||||
|
|
||||||
|
def getWorkerDebuggerExposureSet(self):
|
||||||
|
workerDebuggerScopes = self._globalScope.globalNameMapping["WorkerDebugger"]
|
||||||
|
return workerDebuggerScopes.intersection(self.exposureSet)
|
||||||
|
|
||||||
|
|
||||||
class IDLExternalInterface(IDLObjectWithIdentifier, IDLExposureMixins):
|
class IDLExternalInterface(IDLObjectWithIdentifier, IDLExposureMixins):
|
||||||
def __init__(self, location, parentScope, identifier):
|
def __init__(self, location, parentScope, identifier):
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
// [Constructor(DOMString url, optional (URL or DOMString) base = "about:blank")]
|
// [Constructor(DOMString url, optional (URL or DOMString) base = "about:blank")]
|
||||||
[Constructor(DOMString url, URL base),
|
[Constructor(DOMString url, URL base),
|
||||||
Constructor(DOMString url, optional DOMString base),
|
Constructor(DOMString url, optional DOMString base),
|
||||||
Exposed=(Window,Worker)]
|
Exposed=(Window,Worker,WorkerDebugger)]
|
||||||
interface URL {
|
interface URL {
|
||||||
// Bug 824857: no support for stringifier attributes yet.
|
// Bug 824857: no support for stringifier attributes yet.
|
||||||
// stringifier attribute USVString href;
|
// stringifier attribute USVString href;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
[Constructor(optional USVString init = ""),
|
[Constructor(optional USVString init = ""),
|
||||||
Constructor(URLSearchParams init),
|
Constructor(URLSearchParams init),
|
||||||
Exposed=(Window,Worker,System)]
|
Exposed=(Window,Worker,WorkerDebugger,System)]
|
||||||
interface URLSearchParams {
|
interface URLSearchParams {
|
||||||
void append(USVString name, USVString value);
|
void append(USVString name, USVString value);
|
||||||
void delete(USVString name);
|
void delete(USVString name);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "jsapi.h"
|
#include "jsapi.h"
|
||||||
#include "mozilla/dom/RegisterWorkerBindings.h"
|
#include "mozilla/dom/RegisterWorkerBindings.h"
|
||||||
|
#include "mozilla/dom/RegisterWorkerDebuggerBindings.h"
|
||||||
#include "mozilla/OSFileConstants.h"
|
#include "mozilla/OSFileConstants.h"
|
||||||
|
|
||||||
USING_WORKERS_NAMESPACE
|
USING_WORKERS_NAMESPACE
|
||||||
|
@ -36,3 +37,19 @@ WorkerPrivate::RegisterBindings(JSContext* aCx, JS::Handle<JSObject*> aGlobal)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
WorkerPrivate::RegisterDebuggerBindings(JSContext* aCx,
|
||||||
|
JS::Handle<JSObject*> aGlobal)
|
||||||
|
{
|
||||||
|
// Init Web IDL bindings
|
||||||
|
if (!RegisterWorkerDebuggerBindings(aCx, aGlobal)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!JS_DefineDebuggerObject(aCx, aGlobal)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -6440,14 +6440,18 @@ WorkerPrivate::CreateDebuggerGlobalScope(JSContext* aCx)
|
||||||
|
|
||||||
JSAutoCompartment ac(aCx, global);
|
JSAutoCompartment ac(aCx, global);
|
||||||
|
|
||||||
if (!JS_DefineDebuggerObject(aCx, global)) {
|
// RegisterDebuggerBindings() can spin a nested event loop so we have to set
|
||||||
|
// mDebuggerScope before calling it, and we have to make sure to unset
|
||||||
|
// mDebuggerScope if it fails.
|
||||||
|
mDebuggerScope = Move(globalScope);
|
||||||
|
|
||||||
|
if (!RegisterDebuggerBindings(aCx, global)) {
|
||||||
|
mDebuggerScope = nullptr;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FireOnNewGlobalObject(aCx, global);
|
JS_FireOnNewGlobalObject(aCx, global);
|
||||||
|
|
||||||
mDebuggerScope = globalScope.forget();
|
|
||||||
|
|
||||||
return mDebuggerScope;
|
return mDebuggerScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1264,6 +1264,9 @@ public:
|
||||||
bool
|
bool
|
||||||
RegisterBindings(JSContext* aCx, JS::Handle<JSObject*> aGlobal);
|
RegisterBindings(JSContext* aCx, JS::Handle<JSObject*> aGlobal);
|
||||||
|
|
||||||
|
bool
|
||||||
|
RegisterDebuggerBindings(JSContext* aCx, JS::Handle<JSObject*> aGlobal);
|
||||||
|
|
||||||
#define WORKER_SIMPLE_PREF(name, getter, NAME) \
|
#define WORKER_SIMPLE_PREF(name, getter, NAME) \
|
||||||
bool \
|
bool \
|
||||||
getter() const \
|
getter() const \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче