diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index af8c45ba3cc8..c55a7e38dfac 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -213,6 +213,11 @@ DOMInterfaces = { 'concrete': False }, +'ChromeWindow': { + 'concrete': False, + 'register': False, +}, + 'ChromeWorker': { 'headerFile': 'mozilla/dom/WorkerPrivate.h', 'nativeType': 'mozilla::dom::workers::ChromeWorkerPrivate', @@ -1494,6 +1499,8 @@ DOMInterfaces = { 'Window': { 'nativeType': 'nsGlobalWindow', + # When turning on Window, remember to drop the "'register': False" + # from ChromeWindow. 'hasXPConnectImpls': True, 'register': False, 'implicitJSContext': [ 'setInterval', 'setTimeout' ], diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index cc78315dd535..a52fb7d8c19f 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -1286,15 +1286,19 @@ class CGClassHasInstanceHook(CGAbstractStaticMethod): return true; } """ + if self.descriptor.interface.identifier.name == "ChromeWindow": + setBp = "*bp = UnwrapDOMObject(js::UncheckedUnwrap(instance))->IsChromeWindow()" + else: + setBp = "*bp = true" # Sort interaces implementing self by name so we get stable output. for iface in sorted(self.descriptor.interface.interfacesImplementingSelf, key=lambda iface: iface.identifier.name): hasInstanceCode += """ if (domClass->mInterfaceChain[PrototypeTraits::Depth] == prototypes::id::%s) { - *bp = true; + %s; return true; } -""" % (iface.identifier.name, iface.identifier.name) +""" % (iface.identifier.name, iface.identifier.name, setBp) hasInstanceCode += " return true;" return header + hasInstanceCode; diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl index 1b8409897f7f..8f0b436161d4 100644 --- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl @@ -339,3 +339,7 @@ partial interface Window { Window implements TouchEventHandlers; Window implements OnErrorEventHandlerForWindow; + +[ChromeOnly] interface ChromeWindow {}; + +Window implements ChromeWindow;