aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/codegen')
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py4
-rw-r--r--components/script/dom/bindings/codegen/Configuration.py5
-rw-r--r--components/script/dom/bindings/codegen/parser/WebIDL.py615
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_argument_keywords.py17
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_attributes_on_types.py12
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_constructor.py207
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_constructor_global.py30
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_constructor_no_interface_object.py18
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_dictionary.py88
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py21
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_exposed_extended_attribute.py76
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_global_extended_attr.py16
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_implements.py216
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_interface.py112
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_interface_maplikesetlikeiterable.py87
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_interfacemixin.py72
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_securecontext_extended_attribute.py17
-rw-r--r--components/script/dom/bindings/codegen/parser/tests/test_unforgeable.py26
18 files changed, 708 insertions, 931 deletions
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index c02499f222f..103450f78f3 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -827,10 +827,6 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
elif isArgument:
descriptorType = descriptor.argumentType
- if descriptor.interface.isConsequential():
- raise TypeError("Consequential interface %s being used as an "
- "argument" % descriptor.interface.identifier.name)
-
if failureCode is None:
substitutions = {
"sourceDescription": sourceDescription,
diff --git a/components/script/dom/bindings/codegen/Configuration.py b/components/script/dom/bindings/codegen/Configuration.py
index bde6e71bcfb..1d50c3ed4f7 100644
--- a/components/script/dom/bindings/codegen/Configuration.py
+++ b/components/script/dom/bindings/codegen/Configuration.py
@@ -38,11 +38,6 @@ class Configuration:
iface = thing
self.interfaces[iface.identifier.name] = iface
if iface.identifier.name not in config:
- # Completely skip consequential interfaces with no descriptor
- # if they have no interface object because chances are we
- # don't need to do anything interesting with them.
- if iface.isConsequential() and not iface.hasInterfaceObject():
- continue
entry = {}
else:
entry = config[iface.identifier.name]
diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py
index b934c21db5b..a36b1b3ecfe 100644
--- a/components/script/dom/bindings/codegen/parser/WebIDL.py
+++ b/components/script/dom/bindings/codegen/parser/WebIDL.py
@@ -154,6 +154,9 @@ class IDLObject(object):
def isNamespace(self):
return False
+ def isInterfaceMixin(self):
+ return False
+
def isEnum(self):
return False
@@ -233,8 +236,6 @@ class IDLScope(IDLObject):
# A mapping from global name to the set of global interfaces
# that have that global name.
self.globalNameMapping = defaultdict(set)
- self.primaryGlobalAttr = None
- self.primaryGlobalName = None
def __str__(self):
return self.QName()
@@ -462,8 +463,17 @@ class IDLExposureMixins():
raise WebIDLError("Unknown [Exposed] value %s" % globalName,
[self._location])
- if len(self._exposureGlobalNames) == 0:
- self._exposureGlobalNames.add(scope.primaryGlobalName)
+ # Verify that we are exposed _somwhere_ if we have some place to be
+ # exposed. We don't want to assert that we're definitely exposed
+ # because a lot of our parser tests have small-enough IDL snippets that
+ # they don't include any globals, and we don't really want to go through
+ # and add global interfaces and [Exposed] annotations to all those
+ # tests.
+ if len(scope.globalNames) != 0:
+ if (len(self._exposureGlobalNames) == 0):
+ raise WebIDLError(("'%s' is not exposed anywhere even though we have "
+ "globals to be exposed to") % self,
+ [self.location])
globalNameSetToExposureSet(scope, self._exposureGlobalNames,
self.exposureSet)
@@ -508,17 +518,15 @@ class IDLExposureMixins():
return workerDebuggerScopes.intersection(self.exposureSet)
-class IDLExternalInterface(IDLObjectWithIdentifier, IDLExposureMixins):
+class IDLExternalInterface(IDLObjectWithIdentifier):
def __init__(self, location, parentScope, identifier):
assert isinstance(identifier, IDLUnresolvedIdentifier)
assert isinstance(parentScope, IDLScope)
self.parent = None
IDLObjectWithIdentifier.__init__(self, location, parentScope, identifier)
- IDLExposureMixins.__init__(self, location)
IDLObjectWithIdentifier.resolve(self, parentScope)
def finish(self, scope):
- IDLExposureMixins.finish(self, scope)
pass
def validate(self):
@@ -533,9 +541,6 @@ class IDLExternalInterface(IDLObjectWithIdentifier, IDLExposureMixins):
def isInterface(self):
return True
- def isConsequential(self):
- return False
-
def addExtendedAttributes(self, attrs):
if len(attrs) != 0:
raise WebIDLError("There are no extended attributes that are "
@@ -554,12 +559,6 @@ class IDLExternalInterface(IDLObjectWithIdentifier, IDLExposureMixins):
def hasProbablyShortLivingWrapper(self):
return False
- def isNavigatorProperty(self):
- return False
-
- def isSerializable(self):
- return False
-
def _getDependentObjects(self):
return set()
@@ -611,7 +610,7 @@ class IDLPartialInterfaceOrNamespace(IDLObject):
for attr in attrs:
identifier = attr.identifier()
- if identifier in ["Constructor", "NamedConstructor"]:
+ if identifier == "NamedConstructor":
self.propagatedExtendedAttrs.append(attr)
elif identifier == "SecureContext":
self._haveSecureContextExtendedAttribute = True
@@ -721,6 +720,7 @@ class IDLInterfaceOrInterfaceMixinOrNamespace(IDLObjectWithScope, IDLExposureMix
return "interface"
if self.isNamespace():
return "namespace"
+ assert self.isInterfaceMixin()
return "interface mixin"
def getExtendedAttribute(self, name):
@@ -737,7 +737,7 @@ class IDLInterfaceOrInterfaceMixinOrNamespace(IDLObjectWithScope, IDLExposureMix
self.location = location
# Put the new members at the beginning
self.members = members + self.members
-
+
def addPartial(self, partial):
assert self.identifier.name == partial.identifier.name
self._partials.append(partial)
@@ -773,10 +773,13 @@ class IDLInterfaceOrInterfaceMixinOrNamespace(IDLObjectWithScope, IDLExposureMix
# sets, make sure they aren't exposed in places where we are not.
for member in self.members:
if not member.exposureSet.issubset(self.exposureSet):
- raise WebIDLError("Interface or interface mixin member has"
+ raise WebIDLError("Interface or interface mixin member has "
"larger exposure set than its container",
[member.location, self.location])
+ def isExternal(self):
+ return False
+
class IDLInterfaceMixin(IDLInterfaceOrInterfaceMixinOrNamespace):
def __init__(self, location, parentScope, name, members, isKnownNonPartial):
@@ -790,7 +793,10 @@ class IDLInterfaceMixin(IDLInterfaceOrInterfaceMixinOrNamespace):
def __str__(self):
return "Interface mixin '%s'" % self.identifier.name
-
+
+ def isInterfaceMixin(self):
+ return True
+
def finish(self, scope):
if self._finished:
return
@@ -799,8 +805,10 @@ class IDLInterfaceMixin(IDLInterfaceOrInterfaceMixinOrNamespace):
# Expose to the globals of interfaces that includes this mixin if this
# mixin has no explicit [Exposed] so that its members can be exposed
# based on the base interface exposure set.
- # Make sure this is done before IDLExposureMixins.finish call to
- # prevent exposing to PrimaryGlobal by default.
+ #
+ # Make sure this is done before IDLExposureMixins.finish call, since
+ # that converts our set of exposure global names to an actual exposure
+ # set.
hasImplicitExposure = len(self._exposureGlobalNames) == 0
if hasImplicitExposure:
self._exposureGlobalNames.update(self.actualExposureGlobalNames)
@@ -879,16 +887,11 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
# them.
self.namedConstructors = list()
self.legacyWindowAliases = []
- self.implementedInterfaces = set()
self.includedMixins = set()
- self._consequential = False
# self.interfacesBasedOnSelf is the set of interfaces that inherit from
- # self or have self as a consequential interface, including self itself.
+ # self, including self itself.
# Used for distinguishability checking.
self.interfacesBasedOnSelf = set([self])
- # self.interfacesImplementingSelf is the set of interfaces that directly
- # have self as a consequential interface
- self.interfacesImplementingSelf = set()
self._hasChildInterfaces = False
self._isOnGlobalProtoChain = False
# Tracking of the number of reserved slots we need for our
@@ -899,6 +902,10 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
# If this is an iterator interface, we need to know what iterable
# interface we're iterating for in order to get its nativeType.
self.iterableInterface = None
+ # True if we have cross-origin members.
+ self.hasCrossOriginMembers = False
+ # True if some descendant (including ourselves) has cross-origin members
+ self.hasDescendantWithCrossOriginMembers = False
self.toStringTag = toStringTag
@@ -969,7 +976,11 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
(self.identifier.name,
self.parent.identifier.name),
[self.location])
- assert not parent or isinstance(parent, IDLInterface)
+ if parent and not isinstance(parent, IDLInterface):
+ raise WebIDLError("%s inherits from %s which is not an interface " %
+ (self.identifier.name,
+ self.parent.identifier.name),
+ [self.location, parent.location])
self.parent = parent
@@ -995,10 +1006,8 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
self.totalMembersInSlots = self.parent.totalMembersInSlots
- # Interfaces with [Global] or [PrimaryGlobal] must not
- # have anything inherit from them
- if (self.parent.getExtendedAttribute("Global") or
- self.parent.getExtendedAttribute("PrimaryGlobal")):
+ # Interfaces with [Global] must not have anything inherit from them
+ if self.parent.getExtendedAttribute("Global"):
# Note: This is not a self.parent.isOnGlobalProtoChain() check
# because ancestors of a [Global] interface can have other
# descendants.
@@ -1014,10 +1023,8 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
self.parent.identifier.name),
[self.location, self.parent.location])
- # Callbacks must not inherit from non-callbacks or inherit from
- # anything that has consequential interfaces.
+ # Callbacks must not inherit from non-callbacks.
# XXXbz Can non-callbacks inherit from callbacks? Spec issue pending.
- # XXXbz Can callbacks have consequential interfaces? Spec issue pending
if self.isCallback():
if not self.parent.isCallback():
raise WebIDLError("Callback interface %s inheriting from "
@@ -1054,33 +1061,47 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
self.parent.identifier.name),
[self.location, self.parent.location])
- for iface in self.implementedInterfaces:
- iface.finish(scope)
for mixin in self.includedMixins:
mixin.finish(scope)
cycleInGraph = self.findInterfaceLoopPoint(self)
if cycleInGraph:
- raise WebIDLError("Interface %s has itself as ancestor or "
- "implemented interface" % self.identifier.name,
- [self.location, cycleInGraph.location])
-
- if self.isCallback():
- # "implements" should have made sure we have no
- # consequential interfaces.
- assert len(self.getConsequentialInterfaces()) == 0
- # And that we're not consequential.
- assert not self.isConsequential()
+ raise WebIDLError(
+ "Interface %s has itself as ancestor" % self.identifier.name,
+ [self.location, cycleInGraph.location])
self.finishMembers(scope)
ctor = self.ctor()
if ctor is not None:
- assert len(ctor._exposureGlobalNames) == 0
+ if not self.hasInterfaceObject():
+ raise WebIDLError(
+ "Can't have both a constructor and [NoInterfaceObject]",
+ [self.location, ctor.location])
+
+ if self.globalNames:
+ raise WebIDLError(
+ "Can't have both a constructor and [Global]",
+ [self.location, ctor.location])
+
+ assert(len(ctor._exposureGlobalNames) == 0 or
+ ctor._exposureGlobalNames == self._exposureGlobalNames)
ctor._exposureGlobalNames.update(self._exposureGlobalNames)
- ctor.finish(scope)
+ if ctor in self.members:
+ # constructor operation.
+ self.members.remove(ctor)
+ else:
+ # extended attribute. This can only happen with
+ # [HTMLConstructor] and this is the only way we can get into this
+ # code with len(ctor._exposureGlobalNames) !=
+ # self._exposureGlobalNames.
+ ctor.finish(scope)
for ctor in self.namedConstructors:
+ if self.globalNames:
+ raise WebIDLError(
+ "Can't have both a named constructor and [Global]",
+ [self.location, ctor.location])
assert len(ctor._exposureGlobalNames) == 0
ctor._exposureGlobalNames.update(self._exposureGlobalNames)
ctor.finish(scope)
@@ -1090,43 +1111,15 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
# admixed.
self.originalMembers = list(self.members)
- # Import everything from our consequential interfaces into
- # self.members. Sort our consequential interfaces by name
- # just so we have a consistent order.
- for iface in sorted(self.getConsequentialInterfaces(),
+ for mixin in sorted(self.includedMixins,
key=lambda x: x.identifier.name):
- # Flag the interface as being someone's consequential interface
- iface.setIsConsequentialInterfaceOf(self)
- # Verify that we're not exposed somewhere where iface is not exposed
- if not self.exposureSet.issubset(iface.exposureSet):
- raise WebIDLError("Interface %s is exposed in globals where its "
- "consequential interface %s is not exposed." %
- (self.identifier.name, iface.identifier.name),
- [self.location, iface.location])
-
- # If we have a maplike or setlike, and the consequential interface
- # also does, throw an error.
- if iface.maplikeOrSetlikeOrIterable and self.maplikeOrSetlikeOrIterable:
- raise WebIDLError("Maplike/setlike/iterable interface %s cannot have "
- "maplike/setlike/iterable interface %s as a "
- "consequential interface" %
- (self.identifier.name,
- iface.identifier.name),
- [self.maplikeOrSetlikeOrIterable.location,
- iface.maplikeOrSetlikeOrIterable.location])
- additionalMembers = iface.originalMembers
- for additionalMember in additionalMembers:
+ for mixinMember in mixin.members:
for member in self.members:
- if additionalMember.identifier.name == member.identifier.name:
+ if mixinMember.identifier.name == member.identifier.name:
raise WebIDLError(
- "Multiple definitions of %s on %s coming from 'implements' statements" %
+ "Multiple definitions of %s on %s coming from 'includes' statements" %
(member.identifier.name, self),
- [additionalMember.location, member.location])
- self.members.extend(additionalMembers)
- iface.interfacesImplementingSelf.add(self)
-
- for mixin in sorted(self.includedMixins,
- key=lambda x: x.identifier.name):
+ [mixinMember.location, member.location])
self.members.extend(mixin.members)
for ancestor in self.getInheritedInterfaces():
@@ -1140,8 +1133,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
ancestor.identifier.name),
[self.maplikeOrSetlikeOrIterable.location,
ancestor.maplikeOrSetlikeOrIterable.location])
- for ancestorConsequential in ancestor.getConsequentialInterfaces():
- ancestorConsequential.interfacesBasedOnSelf.add(self)
# Deal with interfaces marked [Unforgeable], now that we have our full
# member list, except unforgeables pulled in from parents. We want to
@@ -1175,6 +1166,21 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
not hasattr(member, "originatingInterface")):
member.originatingInterface = self
+ for member in self.members:
+ if ((member.isMethod() and
+ member.getExtendedAttribute("CrossOriginCallable")) or
+ (member.isAttr() and
+ (member.getExtendedAttribute("CrossOriginReadable") or
+ member.getExtendedAttribute("CrossOriginWritable")))):
+ self.hasCrossOriginMembers = True
+ break
+
+ if self.hasCrossOriginMembers:
+ parent = self
+ while parent:
+ parent.hasDescendantWithCrossOriginMembers = True
+ parent = parent.parent
+
# Compute slot indices for our members before we pull in unforgeable
# members from our parent. Also, maplike/setlike declarations get a
# slot to hold their backing object.
@@ -1197,13 +1203,12 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
self._ownMembersInSlots += 1
if self.parent:
- # Make sure we don't shadow any of the [Unforgeable] attributes on
- # our ancestor interfaces. We don't have to worry about
- # consequential interfaces here, because those have already been
- # imported into the relevant .members lists. And we don't have to
- # worry about anything other than our parent, because it has already
- # imported its ancestors unforgeable attributes into its member
- # list.
+ # Make sure we don't shadow any of the [Unforgeable] attributes on our
+ # ancestor interfaces. We don't have to worry about mixins here, because
+ # those have already been imported into the relevant .members lists. And
+ # we don't have to worry about anything other than our parent, because it
+ # has already imported its ancestors' unforgeable attributes into its
+ # member list.
for unforgeableMember in (member for member in self.parent.members if
(member.isAttr() or member.isMethod()) and
member.isUnforgeable()):
@@ -1339,17 +1344,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
(attributeName, name),
[member.location, m.location])
- # We don't support consequential unforgeable interfaces. Need to check
- # this here, because in finish() an interface might not know yet that
- # it's consequential.
- if self.getExtendedAttribute("Unforgeable") and self.isConsequential():
- raise WebIDLError(
- "%s is an unforgeable consequential interface" %
- self.identifier.name,
- [self.location] +
- list(i.location for i in
- (self.interfacesBasedOnSelf - {self})))
-
# We also don't support inheriting from unforgeable interfaces.
if self.getExtendedAttribute("Unforgeable") and self.hasChildInterfaces():
locations = ([self.location] +
@@ -1462,12 +1456,11 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
# Conditional exposure makes no sense for interfaces with no
- # interface object, unless they're navigator properties.
+ # interface object.
# And SecureContext makes sense for interfaces with no interface object,
# since it is also propagated to interface members.
if (self.isExposedConditionally(exclusions=["SecureContext"]) and
- not self.hasInterfaceObject() and
- not self.isNavigatorProperty()):
+ not self.hasInterfaceObject()):
raise WebIDLError("Interface with no interface object is "
"exposed conditionally",
[self.location])
@@ -1506,16 +1499,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
'an integer-typed "length" attribute',
[self.location, indexedGetter.location])
- def isExternal(self):
- return False
-
- def setIsConsequentialInterfaceOf(self, other):
- self._consequential = True
- self.interfacesBasedOnSelf.add(other)
-
- def isConsequential(self):
- return self._consequential
-
def setCallback(self, value):
self._callback = value
@@ -1530,8 +1513,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
not self.isJSImplemented() and
# Not inheriting from another interface
not self.parent and
- # No consequential interfaces
- len(self.getConsequentialInterfaces()) == 0 and
# No attributes of any kinds
not any(m.isAttr() for m in self.members) and
# There is at least one regular operation, and all regular
@@ -1559,10 +1540,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
return (not self.isCallback() and not self.isNamespace()
and self.getUserData('hasConcreteDescendant', False))
- def addImplementedInterface(self, implementedInterface):
- assert(isinstance(implementedInterface, IDLInterface))
- self.implementedInterfaces.add(implementedInterface)
-
def addIncludedMixin(self, includedMixin):
assert(isinstance(includedMixin, IDLInterfaceMixin))
self.includedMixins.add(includedMixin)
@@ -1580,27 +1557,10 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
parentInterfaces.insert(0, self.parent)
return parentInterfaces
- def getConsequentialInterfaces(self):
- assert(self._finished)
- # The interfaces we implement directly
- consequentialInterfaces = set(self.implementedInterfaces)
-
- # And their inherited interfaces
- for iface in self.implementedInterfaces:
- consequentialInterfaces |= set(iface.getInheritedInterfaces())
-
- # And now collect up the consequential interfaces of all of those
- temp = set()
- for iface in consequentialInterfaces:
- temp |= iface.getConsequentialInterfaces()
-
- return consequentialInterfaces | temp
-
def findInterfaceLoopPoint(self, otherInterface):
"""
- Finds an interface, amongst our ancestors and consequential interfaces,
- that inherits from otherInterface or implements otherInterface
- directly. If there is no such interface, returns None.
+ Finds an interface amongst our ancestors that inherits from otherInterface.
+ If there is no such interface, returns None.
"""
if self.parent:
if self.parent == otherInterface:
@@ -1608,13 +1568,8 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
loopPoint = self.parent.findInterfaceLoopPoint(otherInterface)
if loopPoint:
return loopPoint
- if otherInterface in self.implementedInterfaces:
- return self
- for iface in self.implementedInterfaces:
- loopPoint = iface.findInterfaceLoopPoint(otherInterface)
- if loopPoint:
- return loopPoint
return None
+
def setNonPartial(self, location, parent, members):
assert not parent or isinstance(parent, IDLIdentifierPlaceholder)
IDLInterfaceOrInterfaceMixinOrNamespace.setNonPartial(self, location, members)
@@ -1640,39 +1595,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
current = current.parent
return False
- def isNavigatorProperty(self):
- naviProp = self.getExtendedAttribute("NavigatorProperty")
- if not naviProp:
- return False
- assert len(naviProp) == 1
- assert isinstance(naviProp, list)
- assert len(naviProp[0]) != 0
- return True
-
- def getNavigatorProperty(self):
- naviProp = self.getExtendedAttribute("NavigatorProperty")
- if not naviProp:
- return None
- assert len(naviProp) == 1
- assert isinstance(naviProp, list)
- assert len(naviProp[0]) != 0
- conditionExtendedAttributes = self._extendedAttrDict.viewkeys() & IDLInterfaceOrNamespace.conditionExtendedAttributes
- attr = IDLAttribute(self.location,
- IDLUnresolvedIdentifier(BuiltinLocation("<auto-generated-identifier>"), naviProp[0]),
- IDLUnresolvedType(self.location, IDLUnresolvedIdentifier(self.location, self.identifier.name)),
- True,
- extendedAttrDict={ a: self._extendedAttrDict[a] for a in conditionExtendedAttributes },
- navigatorObjectGetter=True)
- attr._exposureGlobalNames = self._exposureGlobalNames
- # We're abusing Constant a little bit here, because we need Cached. The
- # getter will create a new object every time, but we're never going to
- # clear the cached value.
- extendedAttrs = [ IDLExtendedAttribute(self.location, ("Throws", )),
- IDLExtendedAttribute(self.location, ("Cached", )),
- IDLExtendedAttribute(self.location, ("Constant", )) ]
- attr.addExtendedAttributes(extendedAttrs)
- return attr
-
def hasChildInterfaces(self):
return self._hasChildInterfaces
@@ -1681,7 +1603,6 @@ class IDLInterfaceOrNamespace(IDLInterfaceOrInterfaceMixinOrNamespace):
def _getDependentObjects(self):
deps = set(self.members)
- deps.update(self.implementedInterfaces)
deps.update(self.includedMixins)
if self.parent:
deps.add(self.parent)
@@ -1731,67 +1652,39 @@ class IDLInterface(IDLInterfaceOrNamespace):
raise WebIDLError("[NoInterfaceObject] must take no arguments",
[attr.location])
- if self.ctor():
- raise WebIDLError("Constructor and NoInterfaceObject are incompatible",
- [self.location])
-
self._noInterfaceObject = True
- elif identifier == "Constructor" or identifier == "NamedConstructor" or identifier == "ChromeConstructor" or identifier == "HTMLConstructor":
- if identifier == "Constructor" and not self.hasInterfaceObject():
- raise WebIDLError(str(identifier) + " and NoInterfaceObject are incompatible",
- [self.location])
-
+ elif identifier == "NamedConstructor" or identifier == "HTMLConstructor":
if identifier == "NamedConstructor" and not attr.hasValue():
raise WebIDLError("NamedConstructor must either take an identifier or take a named argument list",
[attr.location])
- if identifier == "ChromeConstructor" and not self.hasInterfaceObject():
- raise WebIDLError(str(identifier) + " and NoInterfaceObject are incompatible",
- [self.location])
-
if identifier == "HTMLConstructor":
- if not self.hasInterfaceObject():
- raise WebIDLError(str(identifier) + " and NoInterfaceObject are incompatible",
- [self.location])
-
if not attr.noArguments():
raise WebIDLError(str(identifier) + " must take no arguments",
[attr.location])
- if self.globalNames:
- raise WebIDLError("[%s] must not be specified together with "
- "[Global]" % identifier,
- [self.location, attr.location])
-
args = attr.args() if attr.hasArgs() else []
retType = IDLWrapperType(self.location, self)
- if identifier == "Constructor" or identifier == "ChromeConstructor" or identifier == "HTMLConstructor":
+ if identifier == "HTMLConstructor":
name = "constructor"
allowForbidden = True
else:
name = attr.value()
allowForbidden = False
- methodIdentifier = IDLUnresolvedIdentifier(self.location, name,
- allowForbidden=allowForbidden)
+ method = IDLConstructor(
+ attr.location, args, name,
+ htmlConstructor=(identifier == "HTMLConstructor"))
+ method.reallyInit(self)
- method = IDLMethod(self.location, methodIdentifier, retType,
- args, static=True,
- htmlConstructor=(identifier == "HTMLConstructor"))
- # Constructors are always NewObject and are always
- # assumed to be able to throw (since there's no way to
- # indicate otherwise) and never have any other
- # extended attributes.
+ # Are always assumed to be able to throw (since there's no way to
+ # indicate otherwise).
method.addExtendedAttributes(
- [IDLExtendedAttribute(self.location, ("NewObject",)),
- IDLExtendedAttribute(self.location, ("Throws",))])
- if identifier == "ChromeConstructor":
- method.addExtendedAttributes(
- [IDLExtendedAttribute(self.location, ("ChromeOnly",))])
+ [IDLExtendedAttribute(self.location, ("Throws",))])
- if identifier == "Constructor" or identifier == "ChromeConstructor" or identifier == "HTMLConstructor":
+ if identifier == "HTMLConstructor":
method.resolve(self)
else:
# We need to detect conflicts for NamedConstructors across
@@ -1823,10 +1716,6 @@ class IDLInterface(IDLInterfaceOrNamespace):
"an interface with inherited interfaces",
[attr.location, self.location])
elif identifier == "Global":
- if self.ctor() or self.namedConstructors:
- raise WebIDLError("[Global] cannot be specified on an "
- "interface with a constructor",
- [attr.location, self.location]);
if attr.hasValue():
self.globalNames = [attr.value()]
elif attr.hasArgs():
@@ -1836,20 +1725,6 @@ class IDLInterface(IDLInterfaceOrNamespace):
self.parentScope.addIfaceGlobalNames(self.identifier.name,
self.globalNames)
self._isOnGlobalProtoChain = True
- elif identifier == "PrimaryGlobal":
- if not attr.noArguments():
- raise WebIDLError("[PrimaryGlobal] must take no arguments",
- [attr.location])
- if self.parentScope.primaryGlobalAttr is not None:
- raise WebIDLError(
- "[PrimaryGlobal] specified twice",
- [attr.location,
- self.parentScope.primaryGlobalAttr.location])
- self.parentScope.primaryGlobalAttr = attr
- self.parentScope.primaryGlobalName = self.identifier.name
- self.parentScope.addIfaceGlobalNames(self.identifier.name,
- [self.identifier.name])
- self._isOnGlobalProtoChain = True
elif identifier == "LegacyWindowAlias":
if attr.hasValue():
self.legacyWindowAliases = [attr.value()]
@@ -1896,7 +1771,6 @@ class IDLInterface(IDLInterfaceOrNamespace):
elif (identifier == "Pref" or
identifier == "JSImplementation" or
identifier == "HeaderFile" or
- identifier == "NavigatorProperty" or
identifier == "Func" or
identifier == "Deprecated"):
# Known extended attributes that take a string value
@@ -1923,6 +1797,17 @@ class IDLInterface(IDLInterfaceOrNamespace):
def isSerializable(self):
return self.getExtendedAttribute("Serializable")
+ def setNonPartial(self, location, parent, members):
+ # Before we do anything else, finish initializing any constructors that
+ # might be in "members", so we don't have partially-initialized objects
+ # hanging around. We couldn't do it before now because we needed to have
+ # to have the IDLInterface on hand to properly set the return type.
+ for member in members:
+ if isinstance(member, IDLConstructor):
+ member.reallyInit(self)
+
+ IDLInterfaceOrNamespace.setNonPartial(self, location, parent, members)
+
class IDLNamespace(IDLInterfaceOrNamespace):
def __init__(self, location, parentScope, name, members, isKnownNonPartial):
@@ -2193,6 +2078,7 @@ class IDLType(IDLObject):
'domstring',
'bytestring',
'usvstring',
+ 'jsstring',
'object',
'date',
'void',
@@ -2254,6 +2140,9 @@ class IDLType(IDLObject):
def isUSVString(self):
return False
+ def isJSString(self):
+ return False
+
def isVoid(self):
return self.name == "Void"
@@ -2479,6 +2368,9 @@ class IDLNullableType(IDLParametrizedType):
def isUSVString(self):
return self.inner.isUSVString()
+ def isJSString(self):
+ return self.inner.isJSString()
+
def isFloat(self):
return self.inner.isFloat()
@@ -2600,6 +2492,9 @@ class IDLSequenceType(IDLParametrizedType):
def isUSVString(self):
return False
+ def isJSString(self):
+ return False
+
def isVoid(self):
return False
@@ -2861,6 +2756,9 @@ class IDLTypedefType(IDLType):
def isUSVString(self):
return self.inner.isUSVString()
+ def isJSString(self):
+ return self.inner.isJSString()
+
def isVoid(self):
return self.inner.isVoid()
@@ -2991,6 +2889,9 @@ class IDLWrapperType(IDLType):
def isUSVString(self):
return False
+ def isJSString(self):
+ return False
+
def isVoid(self):
return False
@@ -3097,8 +2998,9 @@ class IDLWrapperType(IDLType):
return True
iface = self.inner
if iface.isExternal():
- # Let's say true, though ideally we'd only do this when
- # exposureSet contains the primary global's name.
+ # Let's say true, so we don't have to implement exposure mixins on
+ # external interfaces and sprinkle [Exposed=Window] on every single
+ # external interface declaration.
return True
return iface.exposureSet.issuperset(exposureSet)
@@ -3190,6 +3092,7 @@ class IDLBuiltinType(IDLType):
'domstring',
'bytestring',
'usvstring',
+ 'jsstring',
'object',
'date',
'void',
@@ -3227,6 +3130,7 @@ class IDLBuiltinType(IDLType):
Types.domstring: IDLType.Tags.domstring,
Types.bytestring: IDLType.Tags.bytestring,
Types.usvstring: IDLType.Tags.usvstring,
+ Types.jsstring: IDLType.Tags.jsstring,
Types.object: IDLType.Tags.object,
Types.date: IDLType.Tags.date,
Types.void: IDLType.Tags.void,
@@ -3311,7 +3215,8 @@ class IDLBuiltinType(IDLType):
def isString(self):
return (self._typeTag == IDLBuiltinType.Types.domstring or
self._typeTag == IDLBuiltinType.Types.bytestring or
- self._typeTag == IDLBuiltinType.Types.usvstring)
+ self._typeTag == IDLBuiltinType.Types.usvstring or
+ self._typeTag == IDLBuiltinType.Types.jsstring)
def isByteString(self):
return self._typeTag == IDLBuiltinType.Types.bytestring
@@ -3322,6 +3227,9 @@ class IDLBuiltinType(IDLType):
def isUSVString(self):
return self._typeTag == IDLBuiltinType.Types.usvstring
+ def isJSString(self):
+ return self._typeTag == IDLBuiltinType.Types.jsstring
+
def isInteger(self):
return self._typeTag <= IDLBuiltinType.Types.unsigned_long_long
@@ -3524,6 +3432,9 @@ BuiltinTypes = {
IDLBuiltinType.Types.usvstring:
IDLBuiltinType(BuiltinLocation("<builtin type>"), "USVString",
IDLBuiltinType.Types.usvstring),
+ IDLBuiltinType.Types.jsstring:
+ IDLBuiltinType(BuiltinLocation("<builtin type>"), "JSString",
+ IDLBuiltinType.Types.jsstring),
IDLBuiltinType.Types.object:
IDLBuiltinType(BuiltinLocation("<builtin type>"), "Object",
IDLBuiltinType.Types.object),
@@ -3690,8 +3601,8 @@ class IDLValue(IDLObject):
# TreatNullAsEmpty is a different type for resolution reasons,
# however once you have a value it doesn't matter
return self
- elif self.type.isString() and type.isByteString():
- # Allow ByteStrings to use a default value like DOMString.
+ elif self.type.isString() and (type.isByteString() or type.isJSString()):
+ # Allow ByteStrings and JSStrings to use a default value like DOMString.
# No coercion is required as Codegen.py will handle the
# extra steps. We want to make sure that our string contains
# only valid characters, so we check that here.
@@ -3872,10 +3783,6 @@ class IDLInterfaceMember(IDLObjectWithIdentifier, IDLExposureMixins):
return self._extendedAttrDict.get(name, None)
def finish(self, scope):
- # We better be exposed _somewhere_.
- if (len(self._exposureGlobalNames) == 0):
- print(self.identifier.name)
- assert len(self._exposureGlobalNames) != 0
IDLExposureMixins.finish(self, scope)
def validate(self):
@@ -4340,7 +4247,7 @@ class IDLConst(IDLInterfaceMember):
class IDLAttribute(IDLInterfaceMember):
def __init__(self, location, identifier, type, readonly, inherit=False,
static=False, stringifier=False, maplikeOrSetlike=None,
- extendedAttrDict=None, navigatorObjectGetter=False):
+ extendedAttrDict=None):
IDLInterfaceMember.__init__(self, location, identifier,
IDLInterfaceMember.Tags.Attr,
extendedAttrDict=extendedAttrDict)
@@ -4358,7 +4265,6 @@ class IDLAttribute(IDLInterfaceMember):
self.maplikeOrSetlike = maplikeOrSetlike
self.dependsOn = "Everything"
self.affects = "Everything"
- self.navigatorObjectGetter = navigatorObjectGetter
self.bindingAliases = []
if static and identifier.name == "prototype":
@@ -5239,7 +5145,7 @@ class IDLMethod(IDLInterfaceMember, IDLScope):
assert argument.type.isComplete()
if ((argument.type.isDictionary() and
- argument.type.inner.canBeEmpty())or
+ argument.type.unroll().inner.canBeEmpty()) or
(argument.type.isUnion() and
argument.type.unroll().hasPossiblyEmptyDictionaryType())):
# Optional dictionaries and unions containing optional
@@ -5263,12 +5169,16 @@ class IDLMethod(IDLInterfaceMember, IDLScope):
"must have a default value",
[argument.location])
- # An argument cannot be a Nullable Dictionary
- if argument.type.nullable():
- raise WebIDLError("An argument cannot be a nullable "
- "dictionary or nullable union "
- "containing a dictionary",
- [argument.location])
+ # An argument cannot be a nullable dictionary or a
+ # nullable union containing a dictionary.
+ if (argument.type.nullable() and
+ (argument.type.isDictionary() or
+ (argument.type.isUnion() and
+ argument.type.unroll().hasDictionaryType()))):
+ raise WebIDLError("An argument cannot be a nullable "
+ "dictionary or nullable union "
+ "containing a dictionary",
+ [argument.location])
# Only the last argument can be variadic
if variadicArgument:
@@ -5497,51 +5407,51 @@ class IDLMethod(IDLInterfaceMember, IDLScope):
return deps
-class IDLImplementsStatement(IDLObject):
- def __init__(self, location, implementor, implementee):
- IDLObject.__init__(self, location)
- self.implementor = implementor
- self.implementee = implementee
- self._finished = False
+class IDLConstructor(IDLMethod):
+ def __init__(self, location, args, name, htmlConstructor=False):
+ # We can't actually init our IDLMethod yet, because we do not know the
+ # return type yet. Just save the info we have for now and we will init
+ # it later.
+ self._initLocation = location
+ self._initArgs = args
+ self._initName = name
+ self._htmlConstructor = htmlConstructor
+ self._inited = False
+ self._initExtendedAttrs = []
- def finish(self, scope):
- if self._finished:
- return
- assert(isinstance(self.implementor, IDLIdentifierPlaceholder))
- assert(isinstance(self.implementee, IDLIdentifierPlaceholder))
- implementor = self.implementor.finish(scope)
- implementee = self.implementee.finish(scope)
- # NOTE: we depend on not setting self.implementor and
- # self.implementee here to keep track of the original
- # locations.
- if not isinstance(implementor, IDLInterface):
- raise WebIDLError("Left-hand side of 'implements' is not an "
- "interface",
- [self.implementor.location])
- if implementor.isCallback():
- raise WebIDLError("Left-hand side of 'implements' is a callback "
- "interface",
- [self.implementor.location])
- if not isinstance(implementee, IDLInterface):
- raise WebIDLError("Right-hand side of 'implements' is not an "
- "interface",
- [self.implementee.location])
- if implementee.isCallback():
- raise WebIDLError("Right-hand side of 'implements' is a callback "
- "interface",
- [self.implementee.location])
- implementor.addImplementedInterface(implementee)
- self.implementor = implementor
- self.implementee = implementee
+ def addExtendedAttributes(self, attrs):
+ if self._inited:
+ return IDLMethod.addExtendedAttributes(self, attrs)
+ self._initExtendedAttrs.extend(attrs)
- def validate(self):
- pass
+ def handleExtendedAttribute(self, attr):
+ identifier = attr.identifier()
+ if (identifier == "BinaryName" or
+ identifier == "ChromeOnly" or
+ identifier == "NewObject" or
+ identifier == "SecureContext" or
+ identifier == "Throws"):
+ IDLMethod.handleExtendedAttribute(self, attr)
+ else:
+ raise WebIDLError("Unknown extended attribute %s on method" % identifier,
+ [attr.location])
+
+ def reallyInit(self, parentInterface):
+ name = self._initName
+ location = self._initLocation
+ identifier = IDLUnresolvedIdentifier(location, name, allowForbidden=True)
+ retType = IDLWrapperType(parentInterface.location, parentInterface)
+ IDLMethod.__init__(self, location, identifier, retType, self._initArgs,
+ static=True, htmlConstructor=self._htmlConstructor)
+ self._inited = True;
+ # Propagate through whatever extended attributes we already had
+ self.addExtendedAttributes(self._initExtendedAttrs)
+ self._initExtendedAttrs = []
+ # Constructors are always NewObject. Whether they throw or not is
+ # indicated by [Throws] annotations in the usual way.
+ self.addExtendedAttributes(
+ [IDLExtendedAttribute(self.location, ("NewObject",))])
- def addExtendedAttributes(self, attrs):
- if len(attrs) != 0:
- raise WebIDLError("There are no extended attributes that are "
- "allowed on implements statements",
- [attrs[0].location, self.location])
class IDLIncludesStatement(IDLObject):
def __init__(self, location, interface, mixin):
@@ -5564,16 +5474,18 @@ class IDLIncludesStatement(IDLObject):
if not isinstance(interface, IDLInterface):
raise WebIDLError("Left-hand side of 'includes' is not an "
"interface",
- [self.interface.location])
+ [self.interface.location, interface.location])
if interface.isCallback():
raise WebIDLError("Left-hand side of 'includes' is a callback "
"interface",
- [self.interface.location])
+ [self.interface.location, interface.location])
if not isinstance(mixin, IDLInterfaceMixin):
raise WebIDLError("Right-hand side of 'includes' is not an "
"interface mixin",
- [self.mixin.location])
+ [self.mixin.location, mixin.location])
+
mixin.actualExposureGlobalNames.update(interface._exposureGlobalNames)
+
interface.addIncludedMixin(mixin)
self.interface = interface
self.mixin = mixin
@@ -5679,7 +5591,6 @@ class Tokenizer(object):
return t
keywords = {
- "module": "MODULE",
"interface": "INTERFACE",
"partial": "PARTIAL",
"mixin": "MIXIN",
@@ -5688,7 +5599,6 @@ class Tokenizer(object):
"enum": "ENUM",
"callback": "CALLBACK",
"typedef": "TYPEDEF",
- "implements": "IMPLEMENTS",
"includes": "INCLUDES",
"const": "CONST",
"null": "NULL",
@@ -5712,6 +5622,7 @@ class Tokenizer(object):
"DOMString": "DOMSTRING",
"ByteString": "BYTESTRING",
"USVString": "USVSTRING",
+ "JSString": "JSSTRING",
"any": "ANY",
"boolean": "BOOLEAN",
"byte": "BYTE",
@@ -5851,7 +5762,6 @@ class Parser(Tokenizer):
| Exception
| Enum
| Typedef
- | ImplementsStatement
| IncludesStatement
"""
p[0] = p[1]
@@ -6076,7 +5986,7 @@ class Parser(Tokenizer):
def p_PartialInterfaceRest(self, p):
"""
- PartialInterfaceRest : IDENTIFIER LBRACE InterfaceMembers RBRACE SEMICOLON
+ PartialInterfaceRest : IDENTIFIER LBRACE PartialInterfaceMembers RBRACE SEMICOLON
"""
location = self.getLocation(p, 1)
identifier = IDLUnresolvedIdentifier(location, p[1])
@@ -6157,12 +6067,42 @@ class Parser(Tokenizer):
def p_InterfaceMember(self, p):
"""
- InterfaceMember : Const
- | AttributeOrOperationOrMaplikeOrSetlikeOrIterable
+ InterfaceMember : PartialInterfaceMember
+ | Constructor
"""
p[0] = p[1]
-
+ def p_Constructor(self, p):
+ """
+ Constructor : CONSTRUCTOR LPAREN ArgumentList RPAREN SEMICOLON
+ """
+ p[0] = IDLConstructor(self.getLocation(p, 1), p[3], "constructor")
+
+ def p_PartialInterfaceMembers(self, p):
+ """
+ PartialInterfaceMembers : ExtendedAttributeList PartialInterfaceMember PartialInterfaceMembers
+ """
+ p[0] = [p[2]]
+
+ assert not p[1] or p[2]
+ p[2].addExtendedAttributes(p[1])
+
+ p[0].extend(p[3])
+
+ def p_PartialInterfaceMembersEmpty(self, p):
+ """
+ PartialInterfaceMembers :
+ """
+ p[0] = []
+
+ def p_PartialInterfaceMember(self, p):
+ """
+ PartialInterfaceMember : Const
+ | AttributeOrOperationOrMaplikeOrSetlikeOrIterable
+ """
+ p[0] = p[1]
+
+
def p_MixinMembersEmpty(self, p):
"""
MixinMembers :
@@ -6354,16 +6294,6 @@ class Parser(Tokenizer):
p[2], p[3])
p[0] = typedef
- def p_ImplementsStatement(self, p):
- """
- ImplementsStatement : ScopedName IMPLEMENTS ScopedName SEMICOLON
- """
- assert(p[2] == "implements")
- implementor = IDLIdentifierPlaceholder(self.getLocation(p, 1), p[1])
- implementee = IDLIdentifierPlaceholder(self.getLocation(p, 3), p[3])
- p[0] = IDLImplementsStatement(self.getLocation(p, 1), implementor,
- implementee)
-
def p_IncludesStatement(self, p):
"""
IncludesStatement : ScopedName INCLUDES ScopedName SEMICOLON
@@ -6778,7 +6708,9 @@ class Parser(Tokenizer):
"""
t = p[2]
assert isinstance(t, IDLType)
- identifier = IDLUnresolvedIdentifier(self.getLocation(p, 3), p[3])
+ # Arg names can be reserved identifiers
+ identifier = IDLUnresolvedIdentifier(self.getLocation(p, 3), p[3],
+ allowForbidden=True)
defaultValue = p[4]
@@ -6795,7 +6727,9 @@ class Parser(Tokenizer):
"""
t = p[1]
assert isinstance(t, IDLType)
- identifier = IDLUnresolvedIdentifier(self.getLocation(p, 3), p[3])
+ # Arg names can be reserved identifiers
+ identifier = IDLUnresolvedIdentifier(self.getLocation(p, 3), p[3],
+ allowForbidden=True)
variadic = p[2]
@@ -6821,7 +6755,6 @@ class Parser(Tokenizer):
| ENUM
| EXCEPTION
| GETTER
- | IMPLEMENTS
| INHERIT
| INTERFACE
| ITERABLE
@@ -6934,6 +6867,7 @@ class Parser(Tokenizer):
| DOMSTRING
| BYTESTRING
| USVSTRING
+ | JSSTRING
| ANY
| ATTRIBUTE
| BOOLEAN
@@ -6947,11 +6881,9 @@ class Parser(Tokenizer):
| FALSE
| FLOAT
| GETTER
- | IMPLEMENTS
| INHERIT
| INTERFACE
| LONG
- | MODULE
| NULL
| OBJECT
| OCTET
@@ -7216,6 +7148,12 @@ class Parser(Tokenizer):
"""
p[0] = IDLBuiltinType.Types.usvstring
+ def p_BuiltinStringTypeJSString(self, p):
+ """
+ BuiltinStringType : JSSTRING
+ """
+ p[0] = IDLBuiltinType.Types.jsstring
+
def p_UnsignedIntegerTypeUnsigned(self, p):
"""
UnsignedIntegerType : UNSIGNED IntegerType
@@ -7395,12 +7333,6 @@ class Parser(Tokenizer):
self._globalScope = IDLScope(BuiltinLocation("<Global Scope>"), None, None)
- # To make our test harness work, pretend like we have a primary global already.
- # Note that we _don't_ set _globalScope.primaryGlobalAttr,
- # so we'll still be able to detect multiple PrimaryGlobal extended attributes.
- self._globalScope.primaryGlobalName = "FakeTestPrimaryGlobal"
- self._globalScope.addIfaceGlobalNames("FakeTestPrimaryGlobal", ["FakeTestPrimaryGlobal"])
-
self._installBuiltins(self._globalScope)
self._productions = []
@@ -7443,23 +7375,9 @@ class Parser(Tokenizer):
for p in self._productions:
if isinstance(p, IDLInterface):
interfaceStatements.append(p)
- if p.identifier.name == "Navigator":
- navigatorInterface = p
iterableIteratorIface = None
for iface in interfaceStatements:
- navigatorProperty = iface.getNavigatorProperty()
- if navigatorProperty:
- # We're generating a partial interface to add a readonly
- # property to the Navigator interface for every interface
- # annotated with NavigatorProperty.
- partialInterface = IDLPartialInterfaceOrNamespace(
- iface.location,
- IDLUnresolvedIdentifier(iface.location, "Navigator"),
- [ navigatorProperty ],
- navigatorInterface)
- self._productions.append(partialInterface)
-
iterable = None
# We haven't run finish() on the interface yet, so we don't know
# whether our interface is maplike/setlike/iterable or not. This
@@ -7498,20 +7416,13 @@ class Parser(Tokenizer):
self._productions.append(itr_iface)
iterable.iteratorType = IDLWrapperType(iface.location, itr_iface)
- # Then, finish all the IDLImplementsStatements. In particular, we
- # have to make sure we do those before we do the IDLInterfaces.
- # XXX khuey hates this bit and wants to nuke it from orbit.
- implementsStatements = [p for p in self._productions if
- isinstance(p, IDLImplementsStatement)]
# Make sure we finish IDLIncludesStatements before we finish the
# IDLInterfaces.
+ # XXX khuey hates this bit and wants to nuke it from orbit.
includesStatements = [p for p in self._productions if
isinstance(p, IDLIncludesStatement)]
otherStatements = [p for p in self._productions if
- not isinstance(p, (IDLImplementsStatement,
- IDLIncludesStatement))]
- for production in implementsStatements:
- production.finish(self.globalScope())
+ not isinstance(p, IDLIncludesStatement)]
for production in includesStatements:
production.finish(self.globalScope())
for production in otherStatements:
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_argument_keywords.py b/components/script/dom/bindings/codegen/parser/tests/test_argument_keywords.py
new file mode 100644
index 00000000000..e190f617e26
--- /dev/null
+++ b/components/script/dom/bindings/codegen/parser/tests/test_argument_keywords.py
@@ -0,0 +1,17 @@
+def WebIDLTest(parser, harness):
+ parser.parse("""
+ interface Foo {
+ void foo(object constructor);
+ };
+ """)
+
+ results = parser.finish()
+ harness.check(len(results), 1, "Should have an interface");
+ iface = results[0];
+ harness.check(len(iface.members), 1, "Should have an operation");
+ operation = iface.members[0];
+ harness.check(len(operation.signatures()), 1, "Should have one signature");
+ (retval, args) = operation.signatures()[0];
+ harness.check(len(args), 1, "Should have an argument");
+ harness.check(args[0].identifier.name, "constructor",
+ "Should have an identifier named 'constructor'");
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_attributes_on_types.py b/components/script/dom/bindings/codegen/parser/tests/test_attributes_on_types.py
index 1128d58317a..43daca3c453 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_attributes_on_types.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_attributes_on_types.py
@@ -209,6 +209,18 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
+ typedef [TreatNullAs=EmptyString] JSString Foo;
+ """)
+ parser.finish()
+ except:
+ threw = True
+
+ harness.ok(threw, "Should not allow [TreatNullAs] on JSString")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
interface Foo {
void foo([Clamp] Bar arg);
};
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_constructor.py b/components/script/dom/bindings/codegen/parser/tests/test_constructor.py
index c722d7bc5c7..20eb152cdab 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_constructor.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_constructor.py
@@ -43,45 +43,55 @@ def WebIDLTest(parser, harness):
(QName, name, type, optional, variadic) = expectedArgs[i]
checkArgument(gotArgs[i], QName, name, type, optional, variadic)
+ def checkResults(results):
+ harness.check(len(results), 3, "Should be three productions")
+ harness.ok(isinstance(results[0], WebIDL.IDLInterface),
+ "Should be an IDLInterface")
+ harness.ok(isinstance(results[1], WebIDL.IDLInterface),
+ "Should be an IDLInterface")
+ harness.ok(isinstance(results[2], WebIDL.IDLInterface),
+ "Should be an IDLInterface")
+
+ checkMethod(results[0].ctor(), "::TestConstructorNoArgs::constructor",
+ "constructor", [("TestConstructorNoArgs (Wrapper)", [])])
+ harness.check(len(results[0].members), 0,
+ "TestConstructorNoArgs should not have members")
+ checkMethod(results[1].ctor(), "::TestConstructorWithArgs::constructor",
+ "constructor",
+ [("TestConstructorWithArgs (Wrapper)",
+ [("::TestConstructorWithArgs::constructor::name", "name", "String", False, False)])])
+ harness.check(len(results[1].members), 0,
+ "TestConstructorWithArgs should not have members")
+ checkMethod(results[2].ctor(), "::TestConstructorOverloads::constructor",
+ "constructor",
+ [("TestConstructorOverloads (Wrapper)",
+ [("::TestConstructorOverloads::constructor::foo", "foo", "Object", False, False)]),
+ ("TestConstructorOverloads (Wrapper)",
+ [("::TestConstructorOverloads::constructor::bar", "bar", "Boolean", False, False)])])
+ harness.check(len(results[2].members), 0,
+ "TestConstructorOverloads should not have members")
+
parser.parse("""
- [Constructor]
interface TestConstructorNoArgs {
+ constructor();
};
- [Constructor(DOMString name)]
interface TestConstructorWithArgs {
+ constructor(DOMString name);
};
- [Constructor(object foo), Constructor(boolean bar)]
interface TestConstructorOverloads {
+ constructor(object foo);
+ constructor(boolean bar);
};
""")
results = parser.finish()
- harness.check(len(results), 3, "Should be three productions")
- harness.ok(isinstance(results[0], WebIDL.IDLInterface),
- "Should be an IDLInterface")
- harness.ok(isinstance(results[1], WebIDL.IDLInterface),
- "Should be an IDLInterface")
- harness.ok(isinstance(results[2], WebIDL.IDLInterface),
- "Should be an IDLInterface")
-
- checkMethod(results[0].ctor(), "::TestConstructorNoArgs::constructor",
- "constructor", [("TestConstructorNoArgs (Wrapper)", [])])
- checkMethod(results[1].ctor(), "::TestConstructorWithArgs::constructor",
- "constructor",
- [("TestConstructorWithArgs (Wrapper)",
- [("::TestConstructorWithArgs::constructor::name", "name", "String", False, False)])])
- checkMethod(results[2].ctor(), "::TestConstructorOverloads::constructor",
- "constructor",
- [("TestConstructorOverloads (Wrapper)",
- [("::TestConstructorOverloads::constructor::foo", "foo", "Object", False, False)]),
- ("TestConstructorOverloads (Wrapper)",
- [("::TestConstructorOverloads::constructor::bar", "bar", "Boolean", False, False)])])
+ checkResults(results)
parser = parser.reset()
parser.parse("""
- [ChromeConstructor()]
- interface TestChromeConstructor {
+ interface TestChromeOnlyConstructor {
+ [ChromeOnly] constructor();
};
""")
results = parser.finish()
@@ -89,8 +99,8 @@ def WebIDLTest(parser, harness):
harness.ok(isinstance(results[0], WebIDL.IDLInterface),
"Should be an IDLInterface")
- checkMethod(results[0].ctor(), "::TestChromeConstructor::constructor",
- "constructor", [("TestChromeConstructor (Wrapper)", [])],
+ checkMethod(results[0].ctor(), "::TestChromeOnlyConstructor::constructor",
+ "constructor", [("TestChromeOnlyConstructor (Wrapper)", [])],
chromeOnly=True)
parser = parser.reset()
@@ -112,16 +122,16 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Constructor(),
- ChromeConstructor(DOMString a)]
- interface TestChromeConstructor {
+ interface TestChromeOnlyConstructor {
+ constructor()
+ [ChromeOnly] constructor(DOMString a);
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a Constructor and a ChromeConstructor")
+ harness.ok(threw, "Can't have both a constructor and a ChromeOnly constructor")
# Test HTMLConstructor with argument
parser = parser.reset()
@@ -153,120 +163,197 @@ def WebIDLTest(parser, harness):
harness.ok(threw, "HTMLConstructor can't be used on a callback interface")
- # Test HTMLConstructor and Constructor
+ # Test HTMLConstructor and constructor operation
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ [HTMLConstructor]
+ interface TestHTMLConstructorAndConstructor {
+ constructor();
+ };
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+
+ harness.ok(threw, "Can't have both a constructor and a HTMLConstructor")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ [HTMLConstructor]
+ interface TestHTMLConstructorAndConstructor {
+ [Throws]
+ constructor();
+ };
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+
+ harness.ok(threw,
+ "Can't have both a throwing constructor and a HTMLConstructor")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ [HTMLConstructor]
+ interface TestHTMLConstructorAndConstructor {
+ constructor(DOMString a);
+ };
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+
+ harness.ok(threw,
+ "Can't have both a HTMLConstructor and a constructor operation")
+
parser = parser.reset()
threw = False
try:
parser.parse("""
- [Constructor,
- HTMLConstructor]
+ [HTMLConstructor]
interface TestHTMLConstructorAndConstructor {
+ [Throws]
+ constructor(DOMString a);
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a Constructor and a HTMLConstructor")
+ harness.ok(threw,
+ "Can't have both a HTMLConstructor and a throwing constructor "
+ "operation")
+ # Test HTMLConstructor and [ChromeOnly] constructor operation
parser = parser.reset()
threw = False
try:
parser.parse("""
- [HTMLConstructor,
- Constructor]
+ [HTMLConstructor]
interface TestHTMLConstructorAndConstructor {
+ [ChromeOnly]
+ constructor();
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a Constructor")
+ harness.ok(threw,
+ "Can't have both a ChromeOnly constructor and a HTMLConstructor")
parser = parser.reset()
threw = False
try:
parser.parse("""
- [HTMLConstructor,
- Constructor(DOMString a)]
+ [HTMLConstructor]
interface TestHTMLConstructorAndConstructor {
+ [Throws, ChromeOnly]
+ constructor();
};
""")
+ results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a Constructor")
+ harness.ok(threw,
+ "Can't have both a throwing chromeonly constructor and a "
+ "HTMLConstructor")
parser = parser.reset()
threw = False
try:
parser.parse("""
- [Constructor(DOMString a),
- HTMLConstructor]
+ [HTMLConstructor]
interface TestHTMLConstructorAndConstructor {
+ [ChromeOnly]
+ constructor(DOMString a);
};
""")
+ results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a Constructor")
+ harness.ok(threw,
+ "Can't have both a HTMLConstructor and a chromeonly constructor "
+ "operation")
- # Test HTMLConstructor and ChromeConstructor
parser = parser.reset()
threw = False
try:
parser.parse("""
- [ChromeConstructor,
- HTMLConstructor]
- interface TestHTMLConstructorAndChromeConstructor {
+ [HTMLConstructor]
+ interface TestHTMLConstructorAndConstructor {
+ [Throws, ChromeOnly]
+ constructor(DOMString a);
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a ChromeConstructor")
+ harness.ok(threw,
+ "Can't have both a HTMLConstructor and a throwing chromeonly "
+ "constructor operation")
parser = parser.reset()
threw = False
try:
parser.parse("""
- [HTMLConstructor,
- ChromeConstructor]
- interface TestHTMLConstructorAndChromeConstructor {
+ [NoInterfaceObject]
+ interface InterfaceWithoutInterfaceObject {
+ constructor();
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a ChromeConstructor")
+ harness.ok(threw,
+ "Can't have a constructor operation on a [NoInterfaceObject] "
+ "interface")
parser = parser.reset()
threw = False
try:
parser.parse("""
- [ChromeConstructor(DOMString a),
- HTMLConstructor]
- interface TestHTMLConstructorAndChromeConstructor {
+ interface InterfaceWithPartial {
+ };
+
+ partial interface InterfaceWithPartial {
+ constructor();
};
""")
results = parser.finish()
except:
threw = True
+ harness.ok(threw,
+ "Can't have a constructor operation on a partial interface")
+
parser = parser.reset()
threw = False
try:
parser.parse("""
- [HTMLConstructor,
- ChromeConstructor(DOMString a)]
- interface TestHTMLConstructorAndChromeConstructor {
+ interface InterfaceWithMixin {
};
+
+ interface mixin Mixin {
+ constructor();
+ };
+
+ InterfaceWithMixin includes Mixin
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Can't have both a HTMLConstructor and a ChromeConstructor")
+ harness.ok(threw,
+ "Can't have a constructor operation on a mixin")
+
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_constructor_global.py b/components/script/dom/bindings/codegen/parser/tests/test_constructor_global.py
index 14d42caf09c..31c5d95317f 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_constructor_global.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_constructor_global.py
@@ -1,24 +1,12 @@
-def WebIDLTest(parser, harness):
- threw = False
- try:
- parser.parse("""
- [Constructor, Global]
- interface TestConstructorGlobal {
- };
- """)
+import traceback
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown.")
-
- parser = parser.reset()
+def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global, Constructor]
+ [Global, Exposed=TestConstructorGlobal]
interface TestConstructorGlobal {
+ constructor();
};
""")
@@ -32,7 +20,8 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global, NamedConstructor=FooBar]
+ [Global, Exposed=TestNamedConstructorGlobal,
+ NamedConstructor=FooBar]
interface TestNamedConstructorGlobal {
};
""")
@@ -46,7 +35,8 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [NamedConstructor=FooBar, Global]
+ [NamedConstructor=FooBar, Global,
+ Exposed=TestNamedConstructorGlobal]
interface TestNamedConstructorGlobal {
};
""")
@@ -60,7 +50,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global, HTMLConstructor]
+ [Global, HTMLConstructor, Exposed=TestHTMLConstructorGlobal]
interface TestHTMLConstructorGlobal {
};
""")
@@ -75,7 +65,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [HTMLConstructor, Global]
+ [HTMLConstructor, Global, Exposed=TestHTMLConstructorGlobal]
interface TestHTMLConstructorGlobal {
};
""")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_constructor_no_interface_object.py b/components/script/dom/bindings/codegen/parser/tests/test_constructor_no_interface_object.py
index e5413350a28..d4175094911 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_constructor_no_interface_object.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_constructor_no_interface_object.py
@@ -2,23 +2,9 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Constructor, NoInterfaceObject]
- interface TestConstructorNoInterfaceObject {
- };
- """)
-
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown.")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- [NoInterfaceObject, Constructor]
+ [NoInterfaceObject]
interface TestConstructorNoInterfaceObject {
+ constructor();
};
""")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_dictionary.py b/components/script/dom/bindings/codegen/parser/tests/test_dictionary.py
index 770f76b22f0..3cad3022389 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_dictionary.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_dictionary.py
@@ -320,30 +320,92 @@ def WebIDLTest(parser, harness):
dictionary A {
};
interface X {
- void doFoo(optional A? arg1);
+ void doFoo(optional A? arg1 = {});
};
""")
results = parser.finish()
- except:
- threw = True
+ except Exception as x:
+ threw = x
+
+ harness.ok(threw, "Optional dictionary arg must not be nullable")
+ harness.ok("nullable" in str(threw),
+ "Must have the expected exception for optional nullable dictionary arg")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ dictionary A {
+ required long x;
+ };
+ interface X {
+ void doFoo(A? arg1);
+ };
+ """)
+ results = parser.finish()
+ except Exception as x:
+ threw = x
+
+ harness.ok(threw, "Required dictionary arg must not be nullable")
+ harness.ok("nullable" in str(threw),
+ "Must have the expected exception for required nullable "
+ "dictionary arg")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ dictionary A {
+ };
+ interface X {
+ void doFoo(optional (A or long)? arg1 = {});
+ };
+ """)
+ results = parser.finish()
+ except Exception as x:
+ threw = x
- harness.ok(threw, "Dictionary arg must not be nullable")
+ harness.ok(threw, "Dictionary arg must not be in an optional nullable union")
+ harness.ok("nullable" in str(threw),
+ "Must have the expected exception for optional nullable union "
+ "arg containing dictionary")
parser = parser.reset()
threw = False
try:
parser.parse("""
dictionary A {
+ required long x;
};
interface X {
- void doFoo(optional (A or long)? arg1);
+ void doFoo((A or long)? arg1);
+ };
+ """)
+ results = parser.finish()
+ except Exception as x:
+ threw = x
+
+ harness.ok(threw, "Dictionary arg must not be in a required nullable union")
+ harness.ok("nullable" in str(threw),
+ "Must have the expected exception for required nullable union "
+ "arg containing dictionary")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ dictionary A {
+ };
+ interface X {
+ void doFoo(sequence<A?> arg1);
};
""")
results = parser.finish()
except:
threw = True
- harness.ok(threw, "Dictionary arg must not be in a nullable union")
+ harness.ok(not threw,
+ "Nullable union should be allowed in a sequence argument")
parser = parser.reset()
threw = False
@@ -674,3 +736,17 @@ def WebIDLTest(parser, harness):
threw = True
harness.ok(threw, "Only unrestricted values can be initialized to NaN")
+
+ parser = parser.reset();
+ threw = False
+ try:
+ parser.parse("""
+ dictionary Foo {
+ long module;
+ };
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+
+ harness.ok(not threw, "Should be able to use 'module' as a dictionary member name")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py b/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py
index e88c2b50d98..bd9996e34c9 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py
@@ -59,8 +59,6 @@ def WebIDLTest(parser, harness):
void passKid(Kid arg);
void passParent(Parent arg);
void passGrandparent(Grandparent arg);
- void passImplemented(Implemented arg);
- void passImplementedParent(ImplementedParent arg);
void passUnrelated1(Unrelated1 arg);
void passUnrelated2(Unrelated2 arg);
void passArrayBuffer(ArrayBuffer arg);
@@ -70,9 +68,6 @@ def WebIDLTest(parser, harness):
interface Kid : Parent {};
interface Parent : Grandparent {};
interface Grandparent {};
- interface Implemented : ImplementedParent {};
- Parent implements Implemented;
- interface ImplementedParent {};
interface Unrelated1 {};
interface Unrelated2 {};
""")
@@ -156,8 +151,7 @@ def WebIDLTest(parser, harness):
argTypes = [ "long", "short", "long?", "short?", "boolean",
"boolean?", "DOMString", "ByteString", "Enum", "Enum2",
"Interface", "Interface?",
- "AncestorInterface", "UnrelatedInterface",
- "ImplementedInterface", "CallbackInterface",
+ "AncestorInterface", "UnrelatedInterface", "CallbackInterface",
"CallbackInterface?", "CallbackInterface2",
"object", "Callback", "Callback2", "Dict",
"Dict2", "sequence<long>", "sequence<short>",
@@ -166,7 +160,7 @@ def WebIDLTest(parser, harness):
"record<ByteString, long>",
"Date", "Date?", "any",
"Promise<any>", "Promise<any>?",
- "USVString", "ArrayBuffer", "ArrayBufferView", "SharedArrayBuffer",
+ "USVString", "JSString", "ArrayBuffer", "ArrayBufferView", "SharedArrayBuffer",
"Uint8Array", "Uint16Array",
"(long or Callback)", "(long or Dict)",
]
@@ -183,14 +177,14 @@ def WebIDLTest(parser, harness):
primitives = numerics + booleans
nonNumerics = allBut(argTypes, numerics + unions)
nonBooleans = allBut(argTypes, booleans)
- strings = [ "DOMString", "ByteString", "Enum", "Enum2", "USVString" ]
+ strings = [ "DOMString", "ByteString", "Enum", "Enum2", "USVString", "JSString" ]
nonStrings = allBut(argTypes, strings)
nonObjects = primitives + strings
objects = allBut(argTypes, nonObjects )
bufferSourceTypes = ["ArrayBuffer", "ArrayBufferView", "Uint8Array", "Uint16Array"]
sharedBufferSourceTypes = ["SharedArrayBuffer"]
interfaces = [ "Interface", "Interface?", "AncestorInterface",
- "UnrelatedInterface", "ImplementedInterface" ] + bufferSourceTypes + sharedBufferSourceTypes
+ "UnrelatedInterface" ] + bufferSourceTypes + sharedBufferSourceTypes
nullables = (["long?", "short?", "boolean?", "Interface?",
"CallbackInterface?", "Dict", "Dict2",
"Date?", "any", "Promise<any>?"] +
@@ -202,7 +196,7 @@ def WebIDLTest(parser, harness):
notRelatedInterfaces = (nonObjects + ["UnrelatedInterface"] +
otherObjects + dates + sequences + bufferSourceTypes + sharedBufferSourceTypes)
records = [ "record<DOMString, object>", "record<USVString, Dict>",
- "record<ByteString, long>" ]
+ "record<ByteString, long>" ] # JSString not supported in records
# Build a representation of the distinguishability table as a dict
# of dicts, holding True values where needed, holes elsewhere.
@@ -222,6 +216,7 @@ def WebIDLTest(parser, harness):
setDistinguishable("DOMString", nonStrings)
setDistinguishable("ByteString", nonStrings)
setDistinguishable("USVString", nonStrings)
+ setDistinguishable("JSString", nonStrings)
setDistinguishable("Enum", nonStrings)
setDistinguishable("Enum2", nonStrings)
setDistinguishable("Interface", notRelatedInterfaces)
@@ -229,7 +224,6 @@ def WebIDLTest(parser, harness):
setDistinguishable("AncestorInterface", notRelatedInterfaces)
setDistinguishable("UnrelatedInterface",
allBut(argTypes, ["object", "UnrelatedInterface"]))
- setDistinguishable("ImplementedInterface", notRelatedInterfaces)
setDistinguishable("CallbackInterface", nonUserObjects)
setDistinguishable("CallbackInterface?", allBut(nonUserObjects, nullables))
setDistinguishable("CallbackInterface2", nonUserObjects)
@@ -244,6 +238,7 @@ def WebIDLTest(parser, harness):
allBut(argTypes, sequences + ["object"]))
setDistinguishable("record<DOMString, object>", nonUserObjects)
setDistinguishable("record<USVString, Dict>", nonUserObjects)
+ # JSString not supported in records
setDistinguishable("record<ByteString, long>", nonUserObjects)
setDistinguishable("Date", allBut(argTypes, dates + ["object"]))
setDistinguishable("Date?", allBut(argTypes, dates + nullables + ["object"]))
@@ -270,8 +265,6 @@ def WebIDLTest(parser, harness):
interface Interface : AncestorInterface {};
interface AncestorInterface {};
interface UnrelatedInterface {};
- interface ImplementedInterface {};
- Interface implements ImplementedInterface;
callback interface CallbackInterface {};
callback interface CallbackInterface2 {};
callback Callback = any();
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_exposed_extended_attribute.py b/components/script/dom/bindings/codegen/parser/tests/test_exposed_extended_attribute.py
index a6c04e30caf..e0241a56426 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_exposed_extended_attribute.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_exposed_extended_attribute.py
@@ -2,9 +2,9 @@ import WebIDL
def WebIDLTest(parser, harness):
parser.parse("""
- [PrimaryGlobal] interface Foo {};
- [Global=(Bar1,Bar2)] interface Bar {};
- [Global=Baz2] interface Baz {};
+ [Global, Exposed=Foo] interface Foo {};
+ [Global=(Bar, Bar1,Bar2), Exposed=Bar] interface Bar {};
+ [Global=(Baz, Baz2), Exposed=Baz] interface Baz {};
[Exposed=(Foo,Bar1)]
interface Iface {
@@ -51,10 +51,11 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [PrimaryGlobal] interface Foo {};
- [Global=(Bar1,Bar2)] interface Bar {};
- [Global=Baz2] interface Baz {};
+ [Global, Exposed=Foo] interface Foo {};
+ [Global=(Bar, Bar1, Bar2), Exposed=Bar] interface Bar {};
+ [Global=(Baz, Baz2), Exposed=Baz] interface Baz {};
+ [Exposed=Foo]
interface Iface2 {
void method3();
};
@@ -80,9 +81,9 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [PrimaryGlobal] interface Foo {};
- [Global=(Bar1,Bar2)] interface Bar {};
- [Global=Baz2] interface Baz {};
+ [Global, Exposed=Foo] interface Foo {};
+ [Global=(Bar, Bar1, Bar2), Exposed=Bar] interface Bar {};
+ [Global=(Baz, Baz2), Exposed=Baz] interface Baz {};
[Exposed=Foo]
interface Iface3 {
@@ -90,11 +91,11 @@ def WebIDLTest(parser, harness):
};
[Exposed=(Foo,Bar1)]
- interface Mixin {
+ interface mixin Mixin {
void method5();
};
- Iface3 implements Mixin;
+ Iface3 includes Mixin;
""")
results = parser.finish()
harness.check(len(results), 6, "Should know about six things");
@@ -181,8 +182,8 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global] interface Foo {};
- [Global] interface Bar {};
+ [Global, Exposed=Foo] interface Foo {};
+ [Global, Exposed=Bar] interface Bar {};
[Exposed=Foo]
interface Baz {
@@ -198,25 +199,40 @@ def WebIDLTest(parser, harness):
harness.ok(threw, "Should have thrown on member exposed where its interface is not.")
parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- [Global] interface Foo {};
- [Global] interface Bar {};
+ parser.parse("""
+ [Global, Exposed=Foo] interface Foo {};
+ [Global, Exposed=Bar] interface Bar {};
- [Exposed=Foo]
- interface Baz {
- void method();
- };
+ [Exposed=Foo]
+ interface Baz {
+ void method();
+ };
- [Exposed=Bar]
- interface Mixin {};
+ [Exposed=Bar]
+ interface mixin Mixin {
+ void otherMethod();
+ };
- Baz implements Mixin;
- """)
+ Baz includes Mixin;
+ """)
+
+ results = parser.finish()
+
+ harness.check(len(results), 5, "Should know about five things");
+ iface = results[2]
+ harness.ok(isinstance(iface, WebIDL.IDLInterface),
+ "Should have an interface here");
+ members = iface.members
+ harness.check(len(members), 2, "Should have two members")
+
+ harness.ok(members[0].exposureSet == set(["Foo"]),
+ "method should have the right exposure set")
+ harness.ok(members[0]._exposureGlobalNames == set(["Foo"]),
+ "method should have the right exposure global names")
+
+ harness.ok(members[1].exposureSet == set(["Bar"]),
+ "otherMethod should have the right exposure set")
+ harness.ok(members[1]._exposureGlobalNames == set(["Bar"]),
+ "otherMethod should have the right exposure global names")
- results = parser.finish()
- except Exception as x:
- threw = True
- harness.ok(threw, "Should have thrown on LHS of implements being exposed where RHS is not.")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_global_extended_attr.py b/components/script/dom/bindings/codegen/parser/tests/test_global_extended_attr.py
index bc20da40bbe..28b79642d86 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_global_extended_attr.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_global_extended_attr.py
@@ -1,9 +1,10 @@
def WebIDLTest(parser, harness):
parser.parse("""
- [Global]
+ [Global, Exposed=Foo]
interface Foo : Bar {
getter any(DOMString name);
};
+ [Exposed=Foo]
interface Bar {};
""")
@@ -18,7 +19,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global]
+ [Global, Exposed=Foo]
interface Foo {
getter any(DOMString name);
setter void(DOMString name, any arg);
@@ -36,7 +37,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global]
+ [Global, Exposed=Foo]
interface Foo {
getter any(DOMString name);
deleter void(DOMString name);
@@ -54,7 +55,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global, OverrideBuiltins]
+ [Global, OverrideBuiltins, Exposed=Foo]
interface Foo {
};
""")
@@ -70,10 +71,10 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global]
+ [Global, Exposed=Foo]
interface Foo : Bar {
};
- [OverrideBuiltins]
+ [OverrideBuiltins, Exposed=Foo]
interface Bar {
};
""")
@@ -89,9 +90,10 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global]
+ [Global, Exposed=Foo]
interface Foo {
};
+ [Exposed=Foo]
interface Bar : Foo {
};
""")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_implements.py b/components/script/dom/bindings/codegen/parser/tests/test_implements.py
deleted file mode 100644
index 04c47d92abe..00000000000
--- a/components/script/dom/bindings/codegen/parser/tests/test_implements.py
+++ /dev/null
@@ -1,216 +0,0 @@
-# Import the WebIDL module, so we can do isinstance checks and whatnot
-import WebIDL
-
-def WebIDLTest(parser, harness):
- # Basic functionality
- threw = False
- try:
- parser.parse("""
- A implements B;
- interface B {
- attribute long x;
- };
- interface A {
- attribute long y;
- };
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(not threw, "Should not have thrown on implements statement "
- "before interfaces")
- harness.check(len(results), 3, "We have three statements")
- harness.ok(isinstance(results[1], WebIDL.IDLInterface), "B is an interface")
- harness.check(len(results[1].members), 1, "B has one member")
- A = results[2]
- harness.ok(isinstance(A, WebIDL.IDLInterface), "A is an interface")
- harness.check(len(A.members), 2, "A has two members")
- harness.check(A.members[0].identifier.name, "y", "First member is 'y'")
- harness.check(A.members[1].identifier.name, "x", "Second member is 'x'")
-
- # Duplicated member names not allowed
- threw = False
- try:
- parser.parse("""
- C implements D;
- interface D {
- attribute long x;
- };
- interface C {
- attribute long x;
- };
- """)
- parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown on implemented interface duplicating "
- "a name on base interface")
-
- # Same, but duplicated across implemented interfaces
- threw = False
- try:
- parser.parse("""
- E implements F;
- E implements G;
- interface F {
- attribute long x;
- };
- interface G {
- attribute long x;
- };
- interface E {};
- """)
- parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown on implemented interfaces "
- "duplicating each other's member names")
-
- # Same, but duplicated across indirectly implemented interfaces
- threw = False
- try:
- parser.parse("""
- H implements I;
- H implements J;
- I implements K;
- interface K {
- attribute long x;
- };
- interface L {
- attribute long x;
- };
- interface I {};
- interface J : L {};
- interface H {};
- """)
- parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown on indirectly implemented interfaces "
- "duplicating each other's member names")
-
- # Same, but duplicated across an implemented interface and its parent
- threw = False
- try:
- parser.parse("""
- M implements N;
- interface O {
- attribute long x;
- };
- interface N : O {
- attribute long x;
- };
- interface M {};
- """)
- parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should have thrown on implemented interface and its "
- "ancestor duplicating member names")
-
- # Reset the parser so we can actually find things where we expect
- # them in the list
- parser = parser.reset()
-
- # Diamonds should be allowed
- threw = False
- try:
- parser.parse("""
- P implements Q;
- P implements R;
- Q implements S;
- R implements S;
- interface Q {};
- interface R {};
- interface S {
- attribute long x;
- };
- interface P {};
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(not threw, "Diamond inheritance is fine")
- harness.check(results[6].identifier.name, "S", "We should be looking at 'S'")
- harness.check(len(results[6].members), 1, "S should have one member")
- harness.check(results[6].members[0].identifier.name, "x",
- "S's member should be 'x'")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface TestInterface {
- };
- callback interface TestCallbackInterface {
- };
- TestInterface implements TestCallbackInterface;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw,
- "Should not allow callback interfaces on the right-hand side "
- "of 'implements'")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface TestInterface {
- };
- callback interface TestCallbackInterface {
- };
- TestCallbackInterface implements TestInterface;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw,
- "Should not allow callback interfaces on the left-hand side of "
- "'implements'")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface TestInterface {
- };
- dictionary Dict {
- };
- Dict implements TestInterface;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw,
- "Should not allow non-interfaces on the left-hand side "
- "of 'implements'")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface TestInterface {
- };
- dictionary Dict {
- };
- TestInterface implements Dict;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw,
- "Should not allow non-interfaces on the right-hand side "
- "of 'implements'")
-
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_interface.py b/components/script/dom/bindings/codegen/parser/tests/test_interface.py
index ea3e842907a..47db3ae4cc9 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_interface.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_interface.py
@@ -84,100 +84,6 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- interface A {};
- interface B {};
- A implements B;
- B implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow cycles via implements")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface A {};
- interface C {};
- interface B {};
- A implements C;
- C implements B;
- B implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow indirect cycles via implements")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface A : B {};
- interface B {};
- B implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow inheriting from an interface that implements us")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface A : B {};
- interface B {};
- interface C {};
- B implements C;
- C implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow inheriting from an interface that indirectly implements us")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface A : B {};
- interface B : C {};
- interface C {};
- C implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow indirectly inheriting from an interface that implements us")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
- interface A : B {};
- interface B : C {};
- interface C {};
- interface D {};
- C implements D;
- D implements A;
- """)
- results = parser.finish()
- except:
- threw = True
-
- harness.ok(threw, "Should not allow indirectly inheriting from an interface that indirectly implements us")
-
- parser = parser.reset()
- threw = False
- try:
- parser.parse("""
interface A;
interface B : A {};
""")
@@ -189,12 +95,12 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [Constructor(long arg)]
interface A {
+ constructor();
+ constructor(long arg);
readonly attribute boolean x;
void foo();
};
- [Constructor]
partial interface A {
readonly attribute boolean y;
void foo(long arg);
@@ -219,13 +125,13 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [Constructor]
partial interface A {
readonly attribute boolean y;
void foo(long arg);
};
- [Constructor(long arg)]
interface A {
+ constructor();
+ constructor(long arg);
readonly attribute boolean x;
void foo();
};
@@ -377,7 +283,7 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [Global] interface Window {};
+ [Global, Exposed=Window] interface Window {};
[Exposed=Window, LegacyWindowAlias=A]
interface B {};
[Exposed=Window, LegacyWindowAlias=(C, D)]
@@ -419,7 +325,8 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global] interface Window {};
+ [Global, Exposed=Window] interface Window {};
+ [Exposed=Window]
interface A {};
[Exposed=Window, LegacyWindowAlias=A]
interface B {};
@@ -434,9 +341,10 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global] interface Window {};
+ [Global, Exposed=Window] interface Window {};
[Exposed=Window, LegacyWindowAlias=A]
interface B {};
+ [Exposed=Window]
interface A {};
""")
results = parser.finish()
@@ -449,7 +357,7 @@ def WebIDLTest(parser, harness):
threw = False
try:
parser.parse("""
- [Global] interface Window {};
+ [Global, Exposed=Window] interface Window {};
[Exposed=Window, LegacyWindowAlias=A]
interface B {};
[Exposed=Window, LegacyWindowAlias=A]
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_interface_maplikesetlikeiterable.py b/components/script/dom/bindings/codegen/parser/tests/test_interface_maplikesetlikeiterable.py
index 72aa7617b84..e070adee7e6 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_interface_maplikesetlikeiterable.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_interface_maplikesetlikeiterable.py
@@ -252,30 +252,20 @@ def WebIDLTest(parser, harness):
};
""", mapRWMembers, numProductions=2)
- shouldPass("Implements with maplike/setlike",
- """
- interface Foo1 {
- maplike<long, long>;
- };
- interface Foo2 {
- };
- Foo2 implements Foo1;
- """, mapRWMembers, numProductions=3)
-
shouldPass("JS Implemented maplike interface",
"""
- [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1",
- Constructor()]
+ [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1"]
interface Foo1 {
+ constructor();
setlike<long>;
};
""", setRWChromeMembers)
shouldPass("JS Implemented maplike interface",
"""
- [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1",
- Constructor()]
+ [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1"]
interface Foo1 {
+ constructor();
maplike<long, long>;
};
""", mapRWChromeMembers)
@@ -350,31 +340,6 @@ def WebIDLTest(parser, harness):
};
""")
- shouldFail("Consequential interface with conflicting maplike/setlike",
- """
- interface Foo1 {
- maplike<long, long>;
- };
- interface Foo2 {
- setlike<long>;
- };
- Foo2 implements Foo1;
- """)
-
- shouldFail("Consequential interfaces with conflicting maplike/setlike",
- """
- interface Foo1 {
- maplike<long, long>;
- };
- interface Foo2 {
- setlike<long>;
- };
- interface Foo3 {
- };
- Foo3 implements Foo1;
- Foo3 implements Foo2;
- """)
-
#
# Member name collision tests
#
@@ -477,52 +442,28 @@ def WebIDLTest(parser, harness):
};
""", mapRWMembers, numProductions=3)
- shouldFail("Interface with consequential maplike/setlike interface member collision",
- """
- interface Foo1 {
- void entries();
- };
- interface Foo2 {
- maplike<long, long>;
- };
- Foo1 implements Foo2;
- """)
-
- shouldFail("Maplike interface with consequential interface member collision",
+ shouldFail("Maplike interface with mixin member collision",
"""
interface Foo1 {
maplike<long, long>;
};
- interface Foo2 {
+ interface mixin Foo2 {
void entries();
};
- Foo1 implements Foo2;
+ Foo1 includes Foo2;
""")
- shouldPass("Consequential Maplike interface with inherited interface member collision",
- """
- interface Foo1 {
- maplike<long, long>;
- };
- interface Foo2 {
- void entries();
- };
- interface Foo3 : Foo2 {
- };
- Foo3 implements Foo1;
- """, mapRWMembers, numProductions=4)
-
shouldPass("Inherited Maplike interface with consequential interface member collision",
"""
interface Foo1 {
maplike<long, long>;
};
- interface Foo2 {
+ interface mixin Foo2 {
void entries();
};
interface Foo3 : Foo1 {
};
- Foo3 implements Foo2;
+ Foo3 includes Foo2;
""", mapRWMembers, numProductions=4)
shouldFail("Inheritance of name collision with child maplike/setlike",
@@ -645,7 +586,7 @@ def WebIDLTest(parser, harness):
};
""")
- shouldPass("Implemented interface with readonly allowable overrides",
+ shouldPass("Interface with readonly allowable overrides",
"""
interface Foo1 {
readonly setlike<long>;
@@ -655,9 +596,9 @@ def WebIDLTest(parser, harness):
shouldPass("JS Implemented read-only interface with readonly allowable overrides",
"""
- [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1",
- Constructor()]
+ [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1"]
interface Foo1 {
+ constructor();
readonly setlike<long>;
readonly attribute boolean clear;
};
@@ -665,9 +606,9 @@ def WebIDLTest(parser, harness):
shouldFail("JS Implemented read-write interface with non-readwrite allowable overrides",
"""
- [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1",
- Constructor()]
+ [JSImplementation="@mozilla.org/dom/test-interface-js-maplike;1"]
interface Foo1 {
+ constructor();
setlike<long>;
readonly attribute boolean clear;
};
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_interfacemixin.py b/components/script/dom/bindings/codegen/parser/tests/test_interfacemixin.py
index ae3400d2cdb..477a9f37799 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_interfacemixin.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_interfacemixin.py
@@ -338,9 +338,47 @@ def WebIDLTest(parser, harness):
"Should fail if an interface mixin includes maplike")
parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ interface Interface {
+ attribute short attr;
+ };
+ interface mixin Mixin {
+ attribute short attr;
+ };
+ Interface includes Mixin;
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+ harness.ok(threw,
+ "Should fail if the included mixin interface has duplicated member")
+
+ parser = parser.reset()
+ threw = False
+ try:
+ parser.parse("""
+ interface Interface {};
+ interface mixin Mixin1 {
+ attribute short attr;
+ };
+ interface mixin Mixin2 {
+ attribute short attr;
+ };
+ Interface includes Mixin1;
+ Interface includes Mixin2;
+ """)
+ results = parser.finish()
+ except:
+ threw = True
+ harness.ok(threw,
+ "Should fail if the included mixin interfaces have duplicated member")
+
+ parser = parser.reset()
parser.parse("""
- [Global] interface Window {};
- [Global] interface Worker {};
+ [Global, Exposed=Window] interface Window {};
+ [Global, Exposed=Worker] interface Worker {};
[Exposed=Window]
interface Base {};
interface mixin Mixin {
@@ -356,8 +394,8 @@ def WebIDLTest(parser, harness):
parser = parser.reset()
parser.parse("""
- [Global] interface Window {};
- [Global] interface Worker {};
+ [Global, Exposed=Window] interface Window {};
+ [Global, Exposed=Worker] interface Worker {};
[Exposed=Window]
interface Base {};
[Exposed=Window]
@@ -371,3 +409,29 @@ def WebIDLTest(parser, harness):
attr = base.members[0]
harness.check(attr.exposureSet, set(["Window"]),
"Should follow [Exposed] on interface mixin")
+
+ parser = parser.reset()
+ parser.parse("""
+ [Global, Exposed=Window] interface Window {};
+ [Global, Exposed=Worker] interface Worker {};
+ [Exposed=Window]
+ interface Base1 {};
+ [Exposed=Worker]
+ interface Base2 {};
+ interface mixin Mixin {
+ attribute short a;
+ };
+ Base1 includes Mixin;
+ Base2 includes Mixin;
+ """)
+ results = parser.finish()
+ base = results[2]
+ attr = base.members[0]
+ harness.check(attr.exposureSet, set(["Window", "Worker"]),
+ "Should expose on all globals where including interfaces are "
+ "exposed")
+ base = results[3]
+ attr = base.members[0]
+ harness.check(attr.exposureSet, set(["Window", "Worker"]),
+ "Should expose on all globals where including interfaces are "
+ "exposed")
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_securecontext_extended_attribute.py b/components/script/dom/bindings/codegen/parser/tests/test_securecontext_extended_attribute.py
index 084f19fa7f5..442dba45d76 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_securecontext_extended_attribute.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_securecontext_extended_attribute.py
@@ -288,33 +288,32 @@ def WebIDLTest(parser, harness):
threw = True
harness.ok(threw, "[SecureContext] must appear on interfaces that inherit from another [SecureContext] interface")
- # Test 'implements'. The behavior tested here may have to change depending
- # on the resolution of https://github.com/heycam/webidl/issues/118
+ # Test 'includes'.
parser = parser.reset()
parser.parse("""
[SecureContext]
- interface TestSecureContextInterfaceThatImplementsNonSecureContextInterface {
+ interface TestSecureContextInterfaceThatIncludesNonSecureContextMixin {
const octet TEST_CONSTANT = 0;
};
- interface TestNonSecureContextInterface {
+ interface mixin TestNonSecureContextMixin {
const octet TEST_CONSTANT_2 = 0;
readonly attribute byte testAttribute2;
void testMethod2(byte foo);
};
- TestSecureContextInterfaceThatImplementsNonSecureContextInterface implements TestNonSecureContextInterface;
+ TestSecureContextInterfaceThatIncludesNonSecureContextMixin includes TestNonSecureContextMixin;
""")
results = parser.finish()
- harness.check(len(results[0].members), 4, "TestSecureContextInterfaceThatImplementsNonSecureContextInterface should have two members")
+ harness.check(len(results[0].members), 4, "TestSecureContextInterfaceThatImplementsNonSecureContextInterface should have four members")
harness.ok(results[0].getExtendedAttribute("SecureContext"),
"Interface should have [SecureContext] extended attribute")
harness.ok(results[0].members[0].getExtendedAttribute("SecureContext"),
"[SecureContext] should propagate from interface to constant members even when other members are copied from a non-[SecureContext] interface")
harness.ok(results[0].members[1].getExtendedAttribute("SecureContext") is None,
- "Constants copied from non-[SecureContext] interface should not be [SecureContext]")
+ "Constants copied from non-[SecureContext] mixin should not be [SecureContext]")
harness.ok(results[0].members[2].getExtendedAttribute("SecureContext") is None,
- "Attributes copied from non-[SecureContext] interface should not be [SecureContext]")
+ "Attributes copied from non-[SecureContext] mixin should not be [SecureContext]")
harness.ok(results[0].members[3].getExtendedAttribute("SecureContext") is None,
- "Methods copied from non-[SecureContext] interface should not be [SecureContext]")
+ "Methods copied from non-[SecureContext] mixin should not be [SecureContext]")
# Test SecureContext and NoInterfaceObject
parser = parser.reset()
diff --git a/components/script/dom/bindings/codegen/parser/tests/test_unforgeable.py b/components/script/dom/bindings/codegen/parser/tests/test_unforgeable.py
index 44a168670ed..770a9d3736f 100644
--- a/components/script/dom/bindings/codegen/parser/tests/test_unforgeable.py
+++ b/components/script/dom/bindings/codegen/parser/tests/test_unforgeable.py
@@ -141,16 +141,16 @@ def WebIDLTest(parser, harness):
interface Child : Parent {
};
interface Parent {};
- interface Consequential {
+ interface mixin Mixin {
[Unforgeable] readonly attribute long foo;
};
- Parent implements Consequential;
+ Parent includes Mixin;
""")
results = parser.finish()
harness.check(len(results), 4,
"Should be able to inherit from an interface with a "
- "consequential interface with [Unforgeable] properties.")
+ "mixin with [Unforgeable] properties.")
parser = parser.reset();
threw = False
@@ -160,10 +160,10 @@ def WebIDLTest(parser, harness):
void foo();
};
interface Parent {};
- interface Consequential {
+ interface mixin Mixin {
[Unforgeable] readonly attribute long foo;
};
- Parent implements Consequential;
+ Parent includes Mixin;
""")
results = parser.finish()
@@ -182,14 +182,14 @@ def WebIDLTest(parser, harness):
};
interface Parent : GrandParent {};
interface GrandParent {};
- interface Consequential {
+ interface mixin Mixin {
[Unforgeable] readonly attribute long foo;
};
- GrandParent implements Consequential;
- interface ChildConsequential {
+ GrandParent includes Mixin;
+ interface mixin ChildMixin {
void foo();
};
- Child implements ChildConsequential;
+ Child includes ChildMixin;
""")
results = parser.finish()
@@ -208,14 +208,14 @@ def WebIDLTest(parser, harness):
};
interface Parent : GrandParent {};
interface GrandParent {};
- interface Consequential {
+ interface mixin Mixin {
[Unforgeable] void foo();
};
- GrandParent implements Consequential;
- interface ChildConsequential {
+ GrandParent includes Mixin;
+ interface mixin ChildMixin {
void foo();
};
- Child implements ChildConsequential;
+ Child includes ChildMixin;
""")
results = parser.finish()