diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index fff76939e634..7938e10cca52 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -10,7 +10,7 @@ import re import string from WebIDL import BuiltinTypes, IDLBuiltinType, IDLNullValue, IDLSequenceType, IDLType -from Configuration import NoSuchDescriptorError, getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback +from Configuration import NoSuchDescriptorError, getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback, Descriptor AUTOGENERATED_WARNING_COMMENT = \ "/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n\n" @@ -476,8 +476,9 @@ class CGHeaders(CGWrapper): Generates the appropriate include statements. """ def __init__(self, descriptors, dictionaries, callbacks, - callbackDescriptors, declareIncludes, defineIncludes, child, - config=None): + callbackDescriptors, + declareIncludes, defineIncludes, child, + config=None, anyJSImplemented=False): """ Builds a set of includes to cover |descriptors|. @@ -586,7 +587,7 @@ class CGHeaders(CGWrapper): # And we need BindingUtils.h so we can wrap "this" objects declareIncludes.add("mozilla/dom/BindingUtils.h") - if len(callbackDescriptors) != 0: + if len(callbackDescriptors) != 0 or anyJSImplemented: # We need CallbackInterface to serve as our parent class declareIncludes.add("mozilla/dom/CallbackInterface.h") # And we need BindingUtils.h so we can wrap "this" objects @@ -7075,7 +7076,8 @@ class CGBindingRoot(CGThing): workers=True) callbackDescriptors = config.getDescriptors(webIDLFile=webIDLFile, isCallback=True) - + jsImplemented = config.getDescriptors(webIDLFile=webIDLFile, + isJSImplemented=True) forwardDeclares = [CGClassForwardDeclare('XPCWrappedNativeScope')] descriptorsForForwardDeclaration = list(descriptors) @@ -7229,6 +7231,11 @@ class CGBindingRoot(CGThing): # Do codegen for all the callback interfaces cgthings.extend([CGCallbackInterface(x) for x in callbackDescriptors]) + # Do codegen for JS implemented classes + for x in jsImplemented: + cgthings.append(CGCallbackInterface(x)) + cgthings.append(CGJSImplClass(x)) + # And make sure we have the right number of newlines at the end curr = CGWrapper(CGList(cgthings, "\n\n"), post="\n\n") @@ -7267,7 +7274,8 @@ class CGBindingRoot(CGThing): 'nsDOMQS.h' ], curr, - config) + config, + anyJSImplemented = len(jsImplemented) != 0) # Add include guards. curr = CGIncludeGuard(prefix, curr) @@ -8059,6 +8067,8 @@ class CGCallback(CGClass): name = idlObject.identifier.name if descriptorProvider.workers: name += "Workers" + if isinstance(descriptorProvider, Descriptor) and descriptorProvider.interface.isJSImplemented(): + name = jsImplName(name) # For our public methods that needThisHandling we want most of the # same args and the same return type as what CallbackMember # generates. So we want to take advantage of all its diff --git a/dom/bindings/Configuration.py b/dom/bindings/Configuration.py index 8e3e6888f4d1..49aedea0eaea 100644 --- a/dom/bindings/Configuration.py +++ b/dom/bindings/Configuration.py @@ -113,6 +113,8 @@ class Configuration: getter = lambda x: x.interface.isCallback() elif key == 'isExternal': getter = lambda x: x.interface.isExternal() + elif key == 'isJSImplemented': + getter = lambda x: x.interface.isJSImplemented() else: getter = lambda x: getattr(x, key) curr = filter(lambda x: getter(x) == val, curr) @@ -213,7 +215,7 @@ class Descriptor(DescriptorProvider): # Do something sane for JSObject if self.nativeType == "JSObject": headerDefault = "jsapi.h" - elif self.interface.isCallback(): + elif self.interface.isCallback() or self.interface.isJSImplemented(): # A copy of CGHeaders.getDeclarationFilename; we can't # import it here, sadly. # Use our local version of the header, not the exported one, so that diff --git a/dom/bindings/parser/WebIDL.py b/dom/bindings/parser/WebIDL.py index 8d5ebd05a1d6..f334ad34cc16 100644 --- a/dom/bindings/parser/WebIDL.py +++ b/dom/bindings/parser/WebIDL.py @@ -779,7 +779,7 @@ class IDLInterface(IDLObjectWithScope): return self._callback def isSingleOperationInterface(self): - assert self.isCallback() + assert self.isCallback() or self.isJSImplemented() return ( # Not inheriting from another interface not self.parent and