--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -13555,17 +13555,19 @@ class CGBindingRoot(CGThing):
def deps(self):
return self.root.deps()
class CGNativeMember(ClassMethod):
def __init__(self, descriptorProvider, member, name, signature, extendedAttrs,
breakAfter=True, passJSBitsAsNeeded=True, visibility="public",
typedArraysAreStructs=True, variadicIsSequence=False,
- resultNotAddRefed=False):
+ resultNotAddRefed=False,
+ virtual=False,
+ override=False):
"""
If typedArraysAreStructs is false, typed arrays will be passed as
JS::Handle<JSObject*>. If it's true they will be passed as one of the
dom::TypedArray subclasses.
If passJSBitsAsNeeded is false, we don't automatically pass in a
JSContext* or a JSObject* based on the return and argument types. We
can still pass it based on 'implicitJSContext' annotations.
@@ -13583,17 +13585,19 @@ class CGNativeMember(ClassMethod):
self.getArgs(signature[0], signature[1]),
static=member.isStatic(),
# Mark our getters, which are attrs that
# have a non-void return type, as const.
const=(not member.isStatic() and member.isAttr() and
not signature[0].isVoid()),
breakAfterReturnDecl=" ",
breakAfterSelf=breakAfterSelf,
- visibility=visibility)
+ visibility=visibility,
+ virtual=virtual,
+ override=override)
def getReturnType(self, type, isMember):
return self.getRetvalInfo(type, isMember)[0]
def getRetvalInfo(self, type, isMember):
"""
Returns a tuple:
@@ -14360,47 +14364,59 @@ def jsImplName(name):
class CGJSImplMember(CGNativeMember):
"""
Base class for generating code for the members of the implementation class
for a JS-implemented WebIDL interface.
"""
def __init__(self, descriptorProvider, member, name, signature,
extendedAttrs, breakAfter=True, passJSBitsAsNeeded=True,
- visibility="public", variadicIsSequence=False):
+ visibility="public", variadicIsSequence=False,
+ virtual=False, override=False):
CGNativeMember.__init__(self, descriptorProvider, member, name,
signature, extendedAttrs, breakAfter=breakAfter,
passJSBitsAsNeeded=passJSBitsAsNeeded,
visibility=visibility,
- variadicIsSequence=variadicIsSequence)
+ variadicIsSequence=variadicIsSequence,
+ virtual=virtual,
+ override=override)
self.body = self.getImpl()
def getArgs(self, returnType, argList):
args = CGNativeMember.getArgs(self, returnType, argList)
args.append(Argument("JSCompartment*", "aCompartment", "nullptr"))
return args
class CGJSImplMethod(CGJSImplMember):
"""
Class for generating code for the methods for a JS-implemented WebIDL
interface.
"""
def __init__(self, descriptor, method, signature, isConstructor, breakAfter=True):
+ virtual = False
+ override = False
+ if (method.identifier.name == "eventListenerWasAdded" or
+ method.identifier.name == "eventListenerWasRemoved"):
+ virtual = True
+ override = True
+
self.signature = signature
self.descriptor = descriptor
self.isConstructor = isConstructor
CGJSImplMember.__init__(self, descriptor, method,
CGSpecializedMethod.makeNativeName(descriptor,
method),
signature,
descriptor.getExtendedAttributes(method),
breakAfter=breakAfter,
variadicIsSequence=True,
- passJSBitsAsNeeded=False)
+ passJSBitsAsNeeded=False,
+ virtual=virtual,
+ override=override)
def getArgs(self, returnType, argList):
if self.isConstructor:
# Skip the JSCompartment bits for constructors; it's handled
# manually in getImpl.
return CGNativeMember.getArgs(self, returnType, argList)
return CGJSImplMember.getArgs(self, returnType, argList)