diff options
Diffstat (limited to 'components/script/dom/bindings/codegen/parser')
7 files changed, 117 insertions, 46 deletions
diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index da32340dda6..878c221f01c 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -1261,10 +1261,7 @@ class IDLInterfaceOrNamespace(IDLObjectWithScope, IDLExposureMixins): member.getExtendedAttribute("ChromeOnly") or member.getExtendedAttribute("Pref") or member.getExtendedAttribute("Func") or - member.getExtendedAttribute("SecureContext") or - member.getExtendedAttribute("AvailableIn") or - member.getExtendedAttribute("CheckAnyPermissions") or - member.getExtendedAttribute("CheckAllPermissions")): + member.getExtendedAttribute("SecureContext")): raise WebIDLError("[Alias] must not be used on a " "conditionally exposed operation", [member.location]) @@ -1290,17 +1287,11 @@ class IDLInterfaceOrNamespace(IDLObjectWithScope, IDLExposureMixins): alias, [member.location, m.location]) - for attribute in ["CheckAnyPermissions", "CheckAllPermissions"]: - if (self.getExtendedAttribute(attribute) and - self._exposureGlobalNames != set([self.parentScope.primaryGlobalName])): - raise WebIDLError("[%s] used on an interface that is " - "not %s-only" % - (attribute, self.parentScope.primaryGlobalName), - [self.location]) - # Conditional exposure makes no sense for interfaces with no # interface object, unless they're navigator properties. - if (self.isExposedConditionally() and + # 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()): raise WebIDLError("Interface with no interface object is " @@ -1538,8 +1529,8 @@ class IDLInterfaceOrNamespace(IDLObjectWithScope, IDLExposureMixins): "SecureContext", "CheckAnyPermissions", "CheckAllPermissions" ] - def isExposedConditionally(self): - return any(self.getExtendedAttribute(a) for a in self.conditionExtendedAttributes) + def isExposedConditionally(self, exclusions=[]): + return any(((not a in exclusions) and self.getExtendedAttribute(a)) for a in self.conditionExtendedAttributes) class IDLInterface(IDLInterfaceOrNamespace): def __init__(self, location, parentScope, name, parent, members, @@ -1715,10 +1706,7 @@ class IDLInterface(IDLInterfaceOrNamespace): identifier == "JSImplementation" or identifier == "HeaderFile" or identifier == "NavigatorProperty" or - identifier == "AvailableIn" or identifier == "Func" or - identifier == "CheckAnyPermissions" or - identifier == "CheckAllPermissions" or identifier == "Deprecated"): # Known extended attributes that take a string value if not attr.hasValue(): @@ -2170,7 +2158,7 @@ class IDLUnresolvedType(IDLType): return typedefType.complete(scope) elif obj.isCallback() and not obj.isInterface(): assert self.name.name == obj.identifier.name - return IDLCallbackType(self.location, obj) + return IDLCallbackType(obj.location, obj) if self._promiseInnerType and not self._promiseInnerType.isComplete(): self._promiseInnerType = self._promiseInnerType.complete(scope) @@ -2503,10 +2491,18 @@ class IDLUnionType(IDLType): return type.name for (i, type) in enumerate(self.memberTypes): - if not type.isComplete(): + # Exclude typedefs because if given "typedef (B or C) test", + # we want AOrTest, not AOrBOrC + if not type.isComplete() and not isinstance(type, IDLTypedefType): self.memberTypes[i] = type.complete(scope) self.name = "Or".join(typeName(type) for type in self.memberTypes) + + # We do this again to complete the typedef types + for (i, type) in enumerate(self.memberTypes): + if not type.isComplete(): + self.memberTypes[i] = type.complete(scope) + self.flatMemberTypes = list(self.memberTypes) i = 0 while i < len(self.flatMemberTypes): @@ -3391,6 +3387,11 @@ class IDLValue(IDLObject): # extra normalization step. assert self.type.isDOMString() return self + elif self.type.isString() and type.isByteString(): + # Allow ByteStrings to use default value just like + # DOMString. No coercion is required here. + assert self.type.isDOMString() + return self raise WebIDLError("Cannot coerce type %s to type %s." % (self.type, type), [location]) @@ -3539,14 +3540,6 @@ class IDLInterfaceMember(IDLObjectWithIdentifier, IDLExposureMixins): IDLExposureMixins.finish(self, scope) def validate(self): - for attribute in ["CheckAnyPermissions", "CheckAllPermissions"]: - if (self.getExtendedAttribute(attribute) and - self.exposureSet != set([self._globalScope.primaryGlobalName])): - raise WebIDLError("[%s] used on an interface member that is " - "not %s-only" % - (attribute, self.parentScope.primaryGlobalName), - [self.location]) - if self.isAttr() or self.isMethod(): if self.affects == "Everything" and self.dependsOn != "Everything": raise WebIDLError("Interface member is flagged as affecting " @@ -3963,10 +3956,7 @@ class IDLConst(IDLInterfaceMember): elif (identifier == "Pref" or identifier == "ChromeOnly" or identifier == "Func" or - identifier == "SecureContext" or - identifier == "AvailableIn" or - identifier == "CheckAnyPermissions" or - identifier == "CheckAllPermissions"): + identifier == "SecureContext"): # Known attributes that we don't need to do anything with here pass else: @@ -4306,11 +4296,8 @@ class IDLAttribute(IDLInterfaceMember): identifier == "Func" or identifier == "SecureContext" or identifier == "Frozen" or - identifier == "AvailableIn" or identifier == "NewObject" or identifier == "UnsafeInPrerendering" or - identifier == "CheckAnyPermissions" or - identifier == "CheckAllPermissions" or identifier == "BinaryName"): # Known attributes that we don't need to do anything with here pass @@ -5032,9 +5019,6 @@ class IDLMethod(IDLInterfaceMember, IDLScope): identifier == "Deprecated" or identifier == "Func" or identifier == "SecureContext" or - identifier == "AvailableIn" or - identifier == "CheckAnyPermissions" or - identifier == "CheckAllPermissions" or identifier == "BinaryName" or identifier == "StaticClassOverride"): # Known attributes that we don't need to do anything with here @@ -5759,6 +5743,14 @@ class Parser(Tokenizer): booleanType = BuiltinTypes[IDLBuiltinType.Types.boolean] p[0] = IDLValue(location, booleanType, p[1]) + def p_ConstValueByteString(self, p): + """ + ConstValue : BYTESTRING + """ + location = self.getLocation(p, 1) + bytestringType = BuiltinTypes[IDLBuiltinType.Types.bytestring] + p[0] = IDLValue(location, bytestringType, p[1]) + def p_ConstValueInteger(self, p): """ ConstValue : INTEGER @@ -6521,7 +6513,7 @@ class Parser(Tokenizer): type = IDLTypedefType(self.getLocation(p, 1), obj.innerType, obj.identifier.name) elif obj.isCallback() and not obj.isInterface(): - type = IDLCallbackType(self.getLocation(p, 1), obj) + type = IDLCallbackType(obj.location, obj) else: type = IDLWrapperType(self.getLocation(p, 1), p[1]) p[0] = self.handleModifiers(type, p[2]) diff --git a/components/script/dom/bindings/codegen/parser/abstract.patch b/components/script/dom/bindings/codegen/parser/abstract.patch new file mode 100644 index 00000000000..a8e2ddcf759 --- /dev/null +++ b/components/script/dom/bindings/codegen/parser/abstract.patch @@ -0,0 +1,12 @@ +--- WebIDL.py ++++ WebIDL.py +@@ -1416,7 +1416,8 @@ + identifier == "LegacyEventInit" or + identifier == "ProbablyShortLivingObject" or + identifier == "LegacyUnenumerableNamedProperties" or +- identifier == "NonOrdinaryGetPrototypeOf"): ++ identifier == "NonOrdinaryGetPrototypeOf" or ++ identifier == "Abstract"): + # Known extended attributes that do not take values + if not attr.noArguments(): + raise WebIDLError("[%s] must take no arguments" % identifier, diff --git a/components/script/dom/bindings/codegen/parser/bytestring.patch b/components/script/dom/bindings/codegen/parser/bytestring.patch new file mode 100644 index 00000000000..823f14cf996 --- /dev/null +++ b/components/script/dom/bindings/codegen/parser/bytestring.patch @@ -0,0 +1,29 @@ +--- WebIDL.py ++++ WebIDL.py +@@ -3391,6 +3391,11 @@ class IDLValue(IDLObject): + # extra normalization step. + assert self.type.isDOMString() + return self ++ elif self.type.isString() and type.isByteString(): ++ # Allow ByteStrings to use default value just like ++ # DOMString. No coercion is required here. ++ assert self.type.isDOMString() ++ return self + raise WebIDLError("Cannot coerce type %s to type %s." % + (self.type, type), [location]) + +@@ -5759,6 +5764,14 @@ class Parser(Tokenizer): + booleanType = BuiltinTypes[IDLBuiltinType.Types.boolean] + p[0] = IDLValue(location, booleanType, p[1]) + ++ def p_ConstValueByteString(self, p): ++ """ ++ ConstValue : BYTESTRING ++ """ ++ location = self.getLocation(p, 1) ++ bytestringType = BuiltinTypes[IDLBuiltinType.Types.bytestring] ++ p[0] = IDLValue(location, bytestringType, p[1]) ++ + def p_ConstValueInteger(self, p): + """ + ConstValue : INTEGER diff --git a/components/script/dom/bindings/codegen/parser/callback-location.patch b/components/script/dom/bindings/codegen/parser/callback-location.patch new file mode 100644 index 00000000000..fac5d035801 --- /dev/null +++ b/components/script/dom/bindings/codegen/parser/callback-location.patch @@ -0,0 +1,22 @@ +diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py +index da32340..81c52b7 100644 +--- WebIDL.py ++++ WebIDL.py +@@ -2170,7 +2170,7 @@ class IDLUnresolvedType(IDLType): + return typedefType.complete(scope) + elif obj.isCallback() and not obj.isInterface(): + assert self.name.name == obj.identifier.name +- return IDLCallbackType(self.location, obj) ++ return IDLCallbackType(obj.location, obj) + + if self._promiseInnerType and not self._promiseInnerType.isComplete(): + self._promiseInnerType = self._promiseInnerType.complete(scope) +@@ -6521,7 +6521,7 @@ class Parser(Tokenizer): + type = IDLTypedefType(self.getLocation(p, 1), obj.innerType, + obj.identifier.name) + elif obj.isCallback() and not obj.isInterface(): +- type = IDLCallbackType(self.getLocation(p, 1), obj) ++ type = IDLCallbackType(obj.location, obj) + else: + type = IDLWrapperType(self.getLocation(p, 1), p[1]) + p[0] = self.handleModifiers(type, p[2]) diff --git a/components/script/dom/bindings/codegen/parser/pref-main-thread.patch b/components/script/dom/bindings/codegen/parser/pref-main-thread.patch index 4e4f8945f60..7be2dcbfc5e 100644 --- a/components/script/dom/bindings/codegen/parser/pref-main-thread.patch +++ b/components/script/dom/bindings/codegen/parser/pref-main-thread.patch @@ -2,7 +2,7 @@ +++ WebIDL.py @@ -1239,12 +1239,6 @@ class IDLInterface(IDLObjectWithScope, IDLExposureMixins): alias, - [member.location, m.location]) + [member.location, m.location]) - if (self.getExtendedAttribute("Pref") and - self._exposureGlobalNames != set([self.parentScope.primaryGlobalName])): @@ -10,9 +10,9 @@ - self.parentScope.primaryGlobalName, - [self.location]) - - for attribute in ["CheckAnyPermissions", "CheckAllPermissions"]: - if (self.getExtendedAttribute(attribute) and - self._exposureGlobalNames != set([self.parentScope.primaryGlobalName])): + # Conditional exposure makes no sense for interfaces with no + # interface object, unless they're navigator properties. + # And SecureContext makes sense for interfaces with no interface object, @@ -3459,12 +3453,6 @@ class IDLInterfaceMember(IDLObjectWithIdentifier, IDLExposureMixins): IDLExposureMixins.finish(self, scope) @@ -23,6 +23,6 @@ - "%s-only" % self._globalScope.primaryGlobalName, - [self.location]) - - for attribute in ["CheckAnyPermissions", "CheckAllPermissions"]: - if (self.getExtendedAttribute(attribute) and - self.exposureSet != set([self._globalScope.primaryGlobalName])): + if self.isAttr() or self.isMethod(): + if self.affects == "Everything" and self.dependsOn != "Everything": + raise WebIDLError("Interface member is flagged as affecting " 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 d907d08449f..084f19fa7f5 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 @@ -316,3 +316,17 @@ def WebIDLTest(parser, harness): harness.ok(results[0].members[3].getExtendedAttribute("SecureContext") is None, "Methods copied from non-[SecureContext] interface should not be [SecureContext]") + # Test SecureContext and NoInterfaceObject + parser = parser.reset() + parser.parse(""" + [NoInterfaceObject, SecureContext] + interface TestSecureContextNoInterfaceObject { + void testSecureMethod(byte foo); + }; + """) + results = parser.finish() + harness.check(len(results[0].members), 1, "TestSecureContextNoInterfaceObject should have only one member") + harness.ok(results[0].getExtendedAttribute("SecureContext"), + "Interface should have [SecureContext] extended attribute") + harness.ok(results[0].members[0].getExtendedAttribute("SecureContext"), + "Interface member should have [SecureContext] extended attribute") diff --git a/components/script/dom/bindings/codegen/parser/update.sh b/components/script/dom/bindings/codegen/parser/update.sh index 76a99d9cecb..ef1da728b13 100755 --- a/components/script/dom/bindings/codegen/parser/update.sh +++ b/components/script/dom/bindings/codegen/parser/update.sh @@ -2,6 +2,8 @@ wget https://hg.mozilla.org/mozilla-central/raw-file/tip/dom/bindings/parser/Web patch < abstract.patch patch < debug.patch patch < pref-main-thread.patch +patch < callback-location.patch +patch < bytestring.patch wget https://hg.mozilla.org/mozilla-central/archive/tip.tar.gz/dom/bindings/parser/tests/ -O tests.tar.gz rm -r tests |