diff options
4 files changed, 31 insertions, 46 deletions
diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index f3195050908..21af299303e 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(): @@ -3544,14 +3532,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 " @@ -3968,10 +3948,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: @@ -4311,11 +4288,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 @@ -5037,9 +5011,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 diff --git a/components/script/dom/bindings/codegen/parser/callback-location.patch b/components/script/dom/bindings/codegen/parser/callback-location.patch index ab6b0ae9b9b..fac5d035801 100644 --- a/components/script/dom/bindings/codegen/parser/callback-location.patch +++ b/components/script/dom/bindings/codegen/parser/callback-location.patch @@ -1,7 +1,7 @@ diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index da32340..81c52b7 100644 ---- a/components/script/dom/bindings/codegen/parser/WebIDL.py -+++ b/components/script/dom/bindings/codegen/parser/WebIDL.py +--- WebIDL.py ++++ WebIDL.py @@ -2170,7 +2170,7 @@ class IDLUnresolvedType(IDLType): return typedefType.complete(scope) elif obj.isCallback() and not obj.isInterface(): @@ -19,4 +19,4 @@ index da32340..81c52b7 100644 + type = IDLCallbackType(obj.location, obj) else: type = IDLWrapperType(self.getLocation(p, 1), p[1]) - p[0] = self.handleModifiers(type, p[2])
\ No newline at end of file + 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") |