diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-09-26 13:17:12 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-09-26 13:17:12 +0200 |
commit | 107b92cc62d07a48a13f9a7934268fdabf806793 (patch) | |
tree | a89a40a7e886bfca58169430ff9a34da26a034a8 /components/script/dom/bindings/codegen/parser | |
parent | 4c084cefa3ea373d73aed225bdf3952f4f346d62 (diff) | |
download | servo-107b92cc62d07a48a13f9a7934268fdabf806793.tar.gz servo-107b92cc62d07a48a13f9a7934268fdabf806793.zip |
Update the WebIDL parser
Diffstat (limited to 'components/script/dom/bindings/codegen/parser')
12 files changed, 124 insertions, 515 deletions
diff --git a/components/script/dom/bindings/codegen/parser/WebIDL.py b/components/script/dom/bindings/codegen/parser/WebIDL.py index 878c221f01c..2894bbeb82e 100644 --- a/components/script/dom/bindings/codegen/parser/WebIDL.py +++ b/components/script/dom/bindings/codegen/parser/WebIDL.py @@ -9,6 +9,7 @@ import re import os import traceback import math +import string from collections import defaultdict # Machinery @@ -1850,7 +1851,6 @@ class IDLDictionary(IDLObjectWithScope): """ if (memberType.nullable() or - memberType.isArray() or memberType.isSequence() or memberType.isMozMap()): return typeContainsDictionary(memberType.inner, dictionary) @@ -1973,8 +1973,7 @@ class IDLType(IDLObject): 'callback', 'union', 'sequence', - 'mozmap', - 'array' + 'mozmap' ) def __init__(self, location, name): @@ -2027,9 +2026,6 @@ class IDLType(IDLObject): def isMozMap(self): return False - def isArray(self): - return False - def isArrayBuffer(self): return False @@ -2255,9 +2251,6 @@ class IDLNullableType(IDLParameterizedType): def isMozMap(self): return self.inner.isMozMap() - def isArray(self): - return self.inner.isArray() - def isArrayBuffer(self): return self.inner.isArrayBuffer() @@ -2360,9 +2353,6 @@ class IDLSequenceType(IDLParameterizedType): def isSequence(self): return True - def isArray(self): - return False - def isDictionary(self): return False @@ -2575,106 +2565,6 @@ class IDLUnionType(IDLType): return set(self.memberTypes) -class IDLArrayType(IDLType): - def __init__(self, location, parameterType): - assert not parameterType.isVoid() - if parameterType.isSequence(): - raise WebIDLError("Array type cannot parameterize over a sequence type", - [location]) - if parameterType.isMozMap(): - raise WebIDLError("Array type cannot parameterize over a MozMap type", - [location]) - if parameterType.isDictionary(): - raise WebIDLError("Array type cannot parameterize over a dictionary type", - [location]) - - IDLType.__init__(self, location, parameterType.name) - self.inner = parameterType - self.builtin = False - - def __eq__(self, other): - return isinstance(other, IDLArrayType) and self.inner == other.inner - - def __str__(self): - return self.inner.__str__() + "Array" - - def nullable(self): - return False - - def isPrimitive(self): - return False - - def isString(self): - return False - - def isByteString(self): - return False - - def isDOMString(self): - return False - - def isUSVString(self): - return False - - def isVoid(self): - return False - - def isSequence(self): - assert not self.inner.isSequence() - return False - - def isArray(self): - return True - - def isDictionary(self): - assert not self.inner.isDictionary() - return False - - def isInterface(self): - return False - - def isEnum(self): - return False - - def tag(self): - return IDLType.Tags.array - - def resolveType(self, parentScope): - assert isinstance(parentScope, IDLScope) - self.inner.resolveType(parentScope) - - def isComplete(self): - return self.inner.isComplete() - - def complete(self, scope): - self.inner = self.inner.complete(scope) - self.name = self.inner.name - - if self.inner.isDictionary(): - raise WebIDLError("Array type must not contain " - "dictionary as element type.", - [self.inner.location]) - - assert not self.inner.isSequence() - - return self - - def unroll(self): - return self.inner.unroll() - - def isDistinguishableFrom(self, other): - if other.isPromise(): - return False - if other.isUnion(): - # Just forward to the union; it'll deal - return other.isDistinguishableFrom(self) - return (other.isPrimitive() or other.isString() or other.isEnum() or - other.isDate() or other.isNonCallbackInterface()) - - def _getDependentObjects(self): - return self.inner._getDependentObjects() - - class IDLTypedefType(IDLType): def __init__(self, location, innerType, name): IDLType.__init__(self, location, name) @@ -2720,9 +2610,6 @@ class IDLTypedefType(IDLType): def isMozMap(self): return self.inner.isMozMap() - def isArray(self): - return self.inner.isArray() - def isDictionary(self): return self.inner.isDictionary() @@ -2838,9 +2725,6 @@ class IDLWrapperType(IDLType): def isSequence(self): return False - def isArray(self): - return False - def isDictionary(self): return isinstance(self.inner, IDLDictionary) @@ -2907,8 +2791,7 @@ class IDLWrapperType(IDLType): if self.isEnum(): return (other.isPrimitive() or other.isInterface() or other.isObject() or other.isCallback() or other.isDictionary() or - other.isSequence() or other.isMozMap() or other.isArray() or - other.isDate()) + other.isSequence() or other.isMozMap() or other.isDate()) if self.isDictionary() and other.nullable(): return False if (other.isPrimitive() or other.isString() or other.isEnum() or @@ -2930,7 +2813,7 @@ class IDLWrapperType(IDLType): (self.isNonCallbackInterface() or other.isNonCallbackInterface())) if (other.isDictionary() or other.isCallback() or - other.isMozMap() or other.isArray()): + other.isMozMap()): return self.isNonCallbackInterface() # Not much else |other| can be @@ -3140,20 +3023,17 @@ class IDLBuiltinType(IDLType): return (other.isNumeric() or other.isString() or other.isEnum() or other.isInterface() or other.isObject() or other.isCallback() or other.isDictionary() or - other.isSequence() or other.isMozMap() or other.isArray() or - other.isDate()) + other.isSequence() or other.isMozMap() or other.isDate()) if self.isNumeric(): return (other.isBoolean() or other.isString() or other.isEnum() or other.isInterface() or other.isObject() or other.isCallback() or other.isDictionary() or - other.isSequence() or other.isMozMap() or other.isArray() or - other.isDate()) + other.isSequence() or other.isMozMap() or other.isDate()) if self.isString(): return (other.isPrimitive() or other.isInterface() or other.isObject() or other.isCallback() or other.isDictionary() or - other.isSequence() or other.isMozMap() or other.isArray() or - other.isDate()) + other.isSequence() or other.isMozMap() or other.isDate()) if self.isAny(): # Can't tell "any" apart from anything return False @@ -3163,7 +3043,7 @@ class IDLBuiltinType(IDLType): return (other.isPrimitive() or other.isString() or other.isEnum() or other.isInterface() or other.isCallback() or other.isDictionary() or other.isSequence() or - other.isMozMap() or other.isArray()) + other.isMozMap()) if self.isVoid(): return not other.isVoid() # Not much else we could be! @@ -3171,8 +3051,7 @@ class IDLBuiltinType(IDLType): # Like interfaces, but we know we're not a callback return (other.isPrimitive() or other.isString() or other.isEnum() or other.isCallback() or other.isDictionary() or - other.isSequence() or other.isMozMap() or other.isArray() or - other.isDate() or + other.isSequence() or other.isMozMap() or other.isDate() or (other.isInterface() and ( # ArrayBuffer is distinguishable from everything # that's not an ArrayBuffer or a callback interface @@ -3311,6 +3190,11 @@ def matchIntegerValueToType(value): return None +class NoCoercionFoundError(WebIDLError): + """ + A class we use to indicate generic coercion failures because none of the + types worked out in IDLValue.coerceToType. + """ class IDLValue(IDLObject): def __init__(self, location, type, value): @@ -3338,8 +3222,18 @@ class IDLValue(IDLObject): # use the value's type when it is a default value of a # union, and the union cares about the exact float type. return IDLValue(self.location, subtype, coercedValue.value) - except: - pass + except Exception as e: + # Make sure to propagate out WebIDLErrors that are not the + # generic "hey, we could not coerce to this type at all" + # exception, because those are specific "coercion failed for + # reason X" exceptions. Note that we want to swallow + # non-WebIDLErrors here, because those can just happen if + # "type" is not something that can have a default value at + # all. + if (isinstance(e, WebIDLError) and + not isinstance(e, NoCoercionFoundError)): + raise e + # If the type allows null, rerun this matching on the inner type, except # nullable enums. We handle those specially, because we want our # default string values to stay strings even when assigned to a nullable @@ -3388,12 +3282,21 @@ class IDLValue(IDLObject): 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]) + # Allow ByteStrings 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. + valid_ascii_lit = " " + string.ascii_letters + string.digits + string.punctuation + for idx, c in enumerate(self.value): + if c not in valid_ascii_lit: + raise WebIDLError("Coercing this string literal %s to a ByteString is not supported yet. " + "Coercion failed due to an unsupported byte %d at index %d." + % (self.value.__repr__(), ord(c), idx), [location]) + + return IDLValue(self.location, type, self.value) + + raise NoCoercionFoundError("Cannot coerce type %s to type %s." % + (self.type, type), [location]) def _getDependentObjects(self): return set() @@ -4568,12 +4471,6 @@ class IDLMethod(IDLInterfaceMember, IDLScope): base=IDLInterfaceMember.Special ) - TypeSuffixModifier = enum( - 'None', - 'QMark', - 'Brackets' - ) - NamedOrIndexed = enum( 'Neither', 'Named', @@ -5743,14 +5640,6 @@ 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 @@ -6383,9 +6272,9 @@ class Parser(Tokenizer): def p_TypeUnionType(self, p): """ - Type : UnionType TypeSuffix + Type : UnionType Null """ - p[0] = self.handleModifiers(p[1], p[2]) + p[0] = self.handleNullable(p[1], p[2]) def p_SingleTypeNonAnyType(self, p): """ @@ -6395,9 +6284,9 @@ class Parser(Tokenizer): def p_SingleTypeAnyType(self, p): """ - SingleType : ANY TypeSuffixStartingWithArray + SingleType : ANY """ - p[0] = self.handleModifiers(BuiltinTypes[IDLBuiltinType.Types.any], p[2]) + p[0] = BuiltinTypes[IDLBuiltinType.Types.any] def p_UnionType(self, p): """ @@ -6413,19 +6302,11 @@ class Parser(Tokenizer): """ p[0] = p[1] - def p_UnionMemberTypeArrayOfAny(self, p): - """ - UnionMemberTypeArrayOfAny : ANY LBRACKET RBRACKET - """ - p[0] = IDLArrayType(self.getLocation(p, 2), - BuiltinTypes[IDLBuiltinType.Types.any]) - def p_UnionMemberType(self, p): """ - UnionMemberType : UnionType TypeSuffix - | UnionMemberTypeArrayOfAny TypeSuffix + UnionMemberType : UnionType Null """ - p[0] = self.handleModifiers(p[1], p[2]) + p[0] = self.handleNullable(p[1], p[2]) def p_UnionMemberTypes(self, p): """ @@ -6442,10 +6323,10 @@ class Parser(Tokenizer): def p_NonAnyType(self, p): """ - NonAnyType : PrimitiveOrStringType TypeSuffix - | ARRAYBUFFER TypeSuffix - | SHAREDARRAYBUFFER TypeSuffix - | OBJECT TypeSuffix + NonAnyType : PrimitiveOrStringType Null + | ARRAYBUFFER Null + | SHAREDARRAYBUFFER Null + | OBJECT Null """ if p[1] == "object": type = BuiltinTypes[IDLBuiltinType.Types.object] @@ -6456,7 +6337,7 @@ class Parser(Tokenizer): else: type = BuiltinTypes[p[1]] - p[0] = self.handleModifiers(type, p[2]) + p[0] = self.handleNullable(type, p[2]) def p_NonAnyTypeSequenceType(self, p): """ @@ -6464,9 +6345,7 @@ class Parser(Tokenizer): """ innerType = p[3] type = IDLSequenceType(self.getLocation(p, 1), innerType) - if p[5]: - type = IDLNullableType(self.getLocation(p, 5), type) - p[0] = type + p[0] = self.handleNullable(type, p[5]) # Note: Promise<void> is allowed, so we want to parametrize on # ReturnType, not Type. Also, we want this to end up picking up @@ -6478,9 +6357,7 @@ class Parser(Tokenizer): innerType = p[3] promiseIdent = IDLUnresolvedIdentifier(self.getLocation(p, 1), "Promise") type = IDLUnresolvedType(self.getLocation(p, 1), promiseIdent, p[3]) - if p[5]: - type = IDLNullableType(self.getLocation(p, 5), type) - p[0] = type + p[0] = self.handleNullable(type, p[5]) def p_NonAnyTypeMozMapType(self, p): """ @@ -6488,13 +6365,11 @@ class Parser(Tokenizer): """ innerType = p[3] type = IDLMozMapType(self.getLocation(p, 1), innerType) - if p[5]: - type = IDLNullableType(self.getLocation(p, 5), type) - p[0] = type + p[0] = self.handleNullable(type, p[5]) def p_NonAnyTypeScopedName(self, p): """ - NonAnyType : ScopedName TypeSuffix + NonAnyType : ScopedName Null """ assert isinstance(p[1], IDLUnresolvedIdentifier) @@ -6516,29 +6391,27 @@ class Parser(Tokenizer): type = IDLCallbackType(obj.location, obj) else: type = IDLWrapperType(self.getLocation(p, 1), p[1]) - p[0] = self.handleModifiers(type, p[2]) + p[0] = self.handleNullable(type, p[2]) return except: pass type = IDLUnresolvedType(self.getLocation(p, 1), p[1]) - p[0] = self.handleModifiers(type, p[2]) + p[0] = self.handleNullable(type, p[2]) def p_NonAnyTypeDate(self, p): """ - NonAnyType : DATE TypeSuffix + NonAnyType : DATE Null """ - p[0] = self.handleModifiers(BuiltinTypes[IDLBuiltinType.Types.date], - p[2]) + p[0] = self.handleNullable(BuiltinTypes[IDLBuiltinType.Types.date], + p[2]) def p_ConstType(self, p): """ ConstType : PrimitiveOrStringType Null """ type = BuiltinTypes[p[1]] - if p[2]: - type = IDLNullableType(self.getLocation(p, 1), type) - p[0] = type + p[0] = self.handleNullable(type, p[2]) def p_ConstTypeIdentifier(self, p): """ @@ -6547,9 +6420,7 @@ class Parser(Tokenizer): identifier = IDLUnresolvedIdentifier(self.getLocation(p, 1), p[1]) type = IDLUnresolvedType(self.getLocation(p, 1), identifier) - if p[2]: - type = IDLNullableType(self.getLocation(p, 1), type) - p[0] = type + p[0] = self.handleNullable(type, p[2]) def p_PrimitiveOrStringTypeUint(self, p): """ @@ -6657,48 +6528,15 @@ class Parser(Tokenizer): """ p[0] = False - def p_TypeSuffixBrackets(self, p): - """ - TypeSuffix : LBRACKET RBRACKET TypeSuffix - """ - p[0] = [(IDLMethod.TypeSuffixModifier.Brackets, self.getLocation(p, 1))] - p[0].extend(p[3]) - - def p_TypeSuffixQMark(self, p): - """ - TypeSuffix : QUESTIONMARK TypeSuffixStartingWithArray - """ - p[0] = [(IDLMethod.TypeSuffixModifier.QMark, self.getLocation(p, 1))] - p[0].extend(p[2]) - - def p_TypeSuffixEmpty(self, p): - """ - TypeSuffix : - """ - p[0] = [] - - def p_TypeSuffixStartingWithArray(self, p): - """ - TypeSuffixStartingWithArray : LBRACKET RBRACKET TypeSuffix - """ - p[0] = [(IDLMethod.TypeSuffixModifier.Brackets, self.getLocation(p, 1))] - p[0].extend(p[3]) - - def p_TypeSuffixStartingWithArrayEmpty(self, p): - """ - TypeSuffixStartingWithArray : - """ - p[0] = [] - def p_Null(self, p): """ Null : QUESTIONMARK | """ if len(p) > 1: - p[0] = True + p[0] = self.getLocation(p, 1) else: - p[0] = False + p[0] = None def p_ReturnTypeType(self, p): """ @@ -6857,15 +6695,9 @@ class Parser(Tokenizer): typedef = IDLTypedef(BuiltinLocation("<builtin type>"), scope, builtin, name) @ staticmethod - def handleModifiers(type, modifiers): - for (modifier, modifierLocation) in modifiers: - assert (modifier == IDLMethod.TypeSuffixModifier.QMark or - modifier == IDLMethod.TypeSuffixModifier.Brackets) - - if modifier == IDLMethod.TypeSuffixModifier.QMark: - type = IDLNullableType(modifierLocation, type) - elif modifier == IDLMethod.TypeSuffixModifier.Brackets: - type = IDLArrayType(modifierLocation, type) + def handleNullable(type, questionMarkLocation): + if questionMarkLocation is not None: + type = IDLNullableType(questionMarkLocation, type) return type diff --git a/components/script/dom/bindings/codegen/parser/bytestring.patch b/components/script/dom/bindings/codegen/parser/bytestring.patch deleted file mode 100644 index 823f14cf996..00000000000 --- a/components/script/dom/bindings/codegen/parser/bytestring.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- 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/tests/test_array.py b/components/script/dom/bindings/codegen/parser/tests/test_array.py deleted file mode 100644 index 8f9e9c96854..00000000000 --- a/components/script/dom/bindings/codegen/parser/tests/test_array.py +++ /dev/null @@ -1,18 +0,0 @@ -def WebIDLTest(parser, harness): - threw = False - try: - parser.parse(""" - dictionary Foo { - short a; - }; - - dictionary Foo1 { - Foo[] b; - }; - """) - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Array must not contain dictionary " - "as element type.") diff --git a/components/script/dom/bindings/codegen/parser/tests/test_array_of_interface.py b/components/script/dom/bindings/codegen/parser/tests/test_array_of_interface.py deleted file mode 100644 index 26528984595..00000000000 --- a/components/script/dom/bindings/codegen/parser/tests/test_array_of_interface.py +++ /dev/null @@ -1,13 +0,0 @@ -import WebIDL - -def WebIDLTest(parser, harness): - parser.parse(""" - interface A { - attribute long a; - }; - - interface B { - attribute A[] b; - }; - """); - parser.finish() diff --git a/components/script/dom/bindings/codegen/parser/tests/test_arraybuffer.py b/components/script/dom/bindings/codegen/parser/tests/test_arraybuffer.py index 5b8e56f86ca..4a96c0ff512 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_arraybuffer.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_arraybuffer.py @@ -4,37 +4,37 @@ def WebIDLTest(parser, harness): parser.parse(""" interface TestArrayBuffer { attribute ArrayBuffer bufferAttr; - void bufferMethod(ArrayBuffer arg1, ArrayBuffer? arg2, ArrayBuffer[] arg3, sequence<ArrayBuffer> arg4); + void bufferMethod(ArrayBuffer arg1, ArrayBuffer? arg2, sequence<ArrayBuffer> arg3); attribute ArrayBufferView viewAttr; - void viewMethod(ArrayBufferView arg1, ArrayBufferView? arg2, ArrayBufferView[] arg3, sequence<ArrayBufferView> arg4); + void viewMethod(ArrayBufferView arg1, ArrayBufferView? arg2, sequence<ArrayBufferView> arg3); attribute Int8Array int8ArrayAttr; - void int8ArrayMethod(Int8Array arg1, Int8Array? arg2, Int8Array[] arg3, sequence<Int8Array> arg4); + void int8ArrayMethod(Int8Array arg1, Int8Array? arg2, sequence<Int8Array> arg3); attribute Uint8Array uint8ArrayAttr; - void uint8ArrayMethod(Uint8Array arg1, Uint8Array? arg2, Uint8Array[] arg3, sequence<Uint8Array> arg4); + void uint8ArrayMethod(Uint8Array arg1, Uint8Array? arg2, sequence<Uint8Array> arg3); attribute Uint8ClampedArray uint8ClampedArrayAttr; - void uint8ClampedArrayMethod(Uint8ClampedArray arg1, Uint8ClampedArray? arg2, Uint8ClampedArray[] arg3, sequence<Uint8ClampedArray> arg4); + void uint8ClampedArrayMethod(Uint8ClampedArray arg1, Uint8ClampedArray? arg2, sequence<Uint8ClampedArray> arg3); attribute Int16Array int16ArrayAttr; - void int16ArrayMethod(Int16Array arg1, Int16Array? arg2, Int16Array[] arg3, sequence<Int16Array> arg4); + void int16ArrayMethod(Int16Array arg1, Int16Array? arg2, sequence<Int16Array> arg3); attribute Uint16Array uint16ArrayAttr; - void uint16ArrayMethod(Uint16Array arg1, Uint16Array? arg2, Uint16Array[] arg3, sequence<Uint16Array> arg4); + void uint16ArrayMethod(Uint16Array arg1, Uint16Array? arg2, sequence<Uint16Array> arg3); attribute Int32Array int32ArrayAttr; - void int32ArrayMethod(Int32Array arg1, Int32Array? arg2, Int32Array[] arg3, sequence<Int32Array> arg4); + void int32ArrayMethod(Int32Array arg1, Int32Array? arg2, sequence<Int32Array> arg3); attribute Uint32Array uint32ArrayAttr; - void uint32ArrayMethod(Uint32Array arg1, Uint32Array? arg2, Uint32Array[] arg3, sequence<Uint32Array> arg4); + void uint32ArrayMethod(Uint32Array arg1, Uint32Array? arg2, sequence<Uint32Array> arg3); attribute Float32Array float32ArrayAttr; - void float32ArrayMethod(Float32Array arg1, Float32Array? arg2, Float32Array[] arg3, sequence<Float32Array> arg4); + void float32ArrayMethod(Float32Array arg1, Float32Array? arg2, sequence<Float32Array> arg3); attribute Float64Array float64ArrayAttr; - void float64ArrayMethod(Float64Array arg1, Float64Array? arg2, Float64Array[] arg3, sequence<Float64Array> arg4); + void float64ArrayMethod(Float64Array arg1, Float64Array? arg2, sequence<Float64Array> arg3); }; """) @@ -56,7 +56,7 @@ def WebIDLTest(parser, harness): (retType, arguments) = method.signatures()[0] harness.ok(retType.isVoid(), "Should have a void return type") - harness.check(len(arguments), 4, "Expect 4 arguments") + harness.check(len(arguments), 3, "Expect 3 arguments") harness.check(str(arguments[0].type), t, "Expect an ArrayBuffer type") harness.ok(arguments[0].type.isSpiderMonkeyInterface(), "Should test as a js interface") @@ -64,12 +64,9 @@ def WebIDLTest(parser, harness): harness.check(str(arguments[1].type), t + "OrNull", "Expect an ArrayBuffer type") harness.ok(arguments[1].type.inner.isSpiderMonkeyInterface(), "Should test as a js interface") - harness.check(str(arguments[2].type), t + "Array", "Expect an ArrayBuffer type") + harness.check(str(arguments[2].type), t + "Sequence", "Expect an ArrayBuffer type") harness.ok(arguments[2].type.inner.isSpiderMonkeyInterface(), "Should test as a js interface") - harness.check(str(arguments[3].type), t + "Sequence", "Expect an ArrayBuffer type") - harness.ok(arguments[3].type.inner.isSpiderMonkeyInterface(), "Should test as a js interface") - checkStuff(members[0], members[1], "ArrayBuffer") checkStuff(members[2], members[3], "ArrayBufferView") diff --git a/components/script/dom/bindings/codegen/parser/tests/test_attr.py b/components/script/dom/bindings/codegen/parser/tests/test_attr.py index fb0c9196460..ad7aabc1918 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_attr.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_attr.py @@ -77,110 +77,6 @@ def WebIDLTest(parser, harness): attribute float? f; readonly attribute float? rf; }; - - interface TestAttrArray { - attribute byte[] b; - readonly attribute byte[] rb; - attribute octet[] o; - readonly attribute octet[] ro; - attribute short[] s; - readonly attribute short[] rs; - attribute unsigned short[] us; - readonly attribute unsigned short[] rus; - attribute long[] l; - readonly attribute long[] rl; - attribute unsigned long[] ul; - readonly attribute unsigned long[] rul; - attribute long long[] ll; - readonly attribute long long[] rll; - attribute unsigned long long[] ull; - readonly attribute unsigned long long[] rull; - attribute DOMString[] str; - readonly attribute DOMString[] rstr; - attribute object[] obj; - readonly attribute object[] robj; - attribute object[] _object; - attribute float[] f; - readonly attribute float[] rf; - }; - - interface TestAttrNullableArray { - attribute byte[]? b; - readonly attribute byte[]? rb; - attribute octet[]? o; - readonly attribute octet[]? ro; - attribute short[]? s; - readonly attribute short[]? rs; - attribute unsigned short[]? us; - readonly attribute unsigned short[]? rus; - attribute long[]? l; - readonly attribute long[]? rl; - attribute unsigned long[]? ul; - readonly attribute unsigned long[]? rul; - attribute long long[]? ll; - readonly attribute long long[]? rll; - attribute unsigned long long[]? ull; - readonly attribute unsigned long long[]? rull; - attribute DOMString[]? str; - readonly attribute DOMString[]? rstr; - attribute object[]? obj; - readonly attribute object[]? robj; - attribute object[]? _object; - attribute float[]? f; - readonly attribute float[]? rf; - }; - - interface TestAttrArrayOfNullableTypes { - attribute byte?[] b; - readonly attribute byte?[] rb; - attribute octet?[] o; - readonly attribute octet?[] ro; - attribute short?[] s; - readonly attribute short?[] rs; - attribute unsigned short?[] us; - readonly attribute unsigned short?[] rus; - attribute long?[] l; - readonly attribute long?[] rl; - attribute unsigned long?[] ul; - readonly attribute unsigned long?[] rul; - attribute long long?[] ll; - readonly attribute long long?[] rll; - attribute unsigned long long?[] ull; - readonly attribute unsigned long long?[] rull; - attribute DOMString?[] str; - readonly attribute DOMString?[] rstr; - attribute object?[] obj; - readonly attribute object?[] robj; - attribute object?[] _object; - attribute float?[] f; - readonly attribute float?[] rf; - }; - - interface TestAttrNullableArrayOfNullableTypes { - attribute byte?[]? b; - readonly attribute byte?[]? rb; - attribute octet?[]? o; - readonly attribute octet?[]? ro; - attribute short?[]? s; - readonly attribute short?[]? rs; - attribute unsigned short?[]? us; - readonly attribute unsigned short?[]? rus; - attribute long?[]? l; - readonly attribute long?[]? rl; - attribute unsigned long?[]? ul; - readonly attribute unsigned long?[]? rul; - attribute long long?[]? ll; - readonly attribute long long?[]? rll; - attribute unsigned long long?[]? ull; - readonly attribute unsigned long long?[]? rull; - attribute DOMString?[]? str; - readonly attribute DOMString?[]? rstr; - attribute object?[]? obj; - readonly attribute object?[]? robj; - attribute object?[]? _object; - attribute float?[]? f; - readonly attribute float?[]? rf; - }; """) results = parser.finish() @@ -197,7 +93,7 @@ def WebIDLTest(parser, harness): harness.check(attr.readonly, readonly, "Attr's readonly state is correct") harness.ok(True, "TestAttr interface parsed without error.") - harness.check(len(results), 6, "Should be six productions.") + harness.check(len(results), 2, "Should be two productions.") iface = results[0] harness.ok(isinstance(iface, WebIDL.IDLInterface), "Should be an IDLInterface") @@ -228,66 +124,6 @@ def WebIDLTest(parser, harness): (QName, name, type, readonly) = data checkAttr(attr, QName % "Nullable", name, type % "OrNull", readonly) - iface = results[2] - harness.ok(isinstance(iface, WebIDL.IDLInterface), - "Should be an IDLInterface") - harness.check(iface.identifier.QName(), "::TestAttrArray", "Interface has the right QName") - harness.check(iface.identifier.name, "TestAttrArray", "Interface has the right name") - harness.check(len(iface.members), len(testData), "Expect %s members" % len(testData)) - - attrs = iface.members - - for i in range(len(attrs)): - data = testData[i] - attr = attrs[i] - (QName, name, type, readonly) = data - checkAttr(attr, QName % "Array", name, type % "Array", readonly) - - iface = results[3] - harness.ok(isinstance(iface, WebIDL.IDLInterface), - "Should be an IDLInterface") - harness.check(iface.identifier.QName(), "::TestAttrNullableArray", "Interface has the right QName") - harness.check(iface.identifier.name, "TestAttrNullableArray", "Interface has the right name") - harness.check(len(iface.members), len(testData), "Expect %s members" % len(testData)) - - attrs = iface.members - - for i in range(len(attrs)): - data = testData[i] - attr = attrs[i] - (QName, name, type, readonly) = data - checkAttr(attr, QName % "NullableArray", name, type % "ArrayOrNull", readonly) - - iface = results[4] - harness.ok(isinstance(iface, WebIDL.IDLInterface), - "Should be an IDLInterface") - harness.check(iface.identifier.QName(), "::TestAttrArrayOfNullableTypes", "Interface has the right QName") - harness.check(iface.identifier.name, "TestAttrArrayOfNullableTypes", "Interface has the right name") - harness.check(len(iface.members), len(testData), "Expect %s members" % len(testData)) - - attrs = iface.members - - for i in range(len(attrs)): - data = testData[i] - attr = attrs[i] - (QName, name, type, readonly) = data - checkAttr(attr, QName % "ArrayOfNullableTypes", name, type % "OrNullArray", readonly) - - iface = results[5] - harness.ok(isinstance(iface, WebIDL.IDLInterface), - "Should be an IDLInterface") - harness.check(iface.identifier.QName(), "::TestAttrNullableArrayOfNullableTypes", "Interface has the right QName") - harness.check(iface.identifier.name, "TestAttrNullableArrayOfNullableTypes", "Interface has the right name") - harness.check(len(iface.members), len(testData), "Expect %s members" % len(testData)) - - attrs = iface.members - - for i in range(len(attrs)): - data = testData[i] - attr = attrs[i] - (QName, name, type, readonly) = data - checkAttr(attr, QName % "NullableArrayOfNullableTypes", name, type % "OrNullArrayOrNull", readonly) - parser = parser.reset() threw = False try: diff --git a/components/script/dom/bindings/codegen/parser/tests/test_bytestring.py b/components/script/dom/bindings/codegen/parser/tests/test_bytestring.py index d73455f8812..fa83e9e2d57 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_bytestring.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_bytestring.py @@ -13,7 +13,7 @@ def WebIDLTest(parser, harness): results = parser.finish(); harness.ok(True, "TestByteString interface parsed without error.") - + harness.check(len(results), 1, "Should be one production") harness.ok(isinstance(results[0], WebIDL.IDLInterface), "Should be an IDLInterface") @@ -54,10 +54,9 @@ def WebIDLTest(parser, harness): """) except WebIDL.WebIDLError: threw = True - harness.ok(threw, "Should have thrown a WebIDL error") + harness.ok(threw, "Should have thrown a WebIDL error for ByteString default in interface") - # Cannot have optional ByteStrings with default values - threw = False + # Can have optional ByteStrings with default values try: parser.parse(""" interface OptionalByteString { @@ -65,8 +64,36 @@ def WebIDLTest(parser, harness): }; """) results2 = parser.finish(); - except WebIDL.WebIDLError: - threw = True + except WebIDL.WebIDLError as e: + harness.ok(False, + "Should not have thrown a WebIDL error for ByteString " + "default in dictionary. " + str(e)) - harness.ok(threw, "Should have thrown a WebIDL error") + # Can have a default ByteString value in a dictionary + try: + parser.parse(""" + dictionary OptionalByteStringDict { + ByteString item = "some string"; + }; + """) + results3 = parser.finish(); + except WebIDL.WebIDLError as e: + harness.ok(False, + "Should not have thrown a WebIDL error for ByteString " + "default in dictionary. " + str(e)) + + # Don't allow control characters in ByteString literals + threw = False + try: + parser.parse(""" + dictionary OptionalByteStringDict2 { + ByteString item = "\x03"; + }; + """) + results4 = parser.finish() + except WebIDL.WebIDLError as e: + threw = True + harness.ok(threw, + "Should have thrown a WebIDL error for invalid ByteString " + "default in dictionary") 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 866816f2e0c..d7780c1ffa1 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_distinguishability.py @@ -159,7 +159,7 @@ def WebIDLTest(parser, harness): "object", "Callback", "Callback2", "optional Dict", "optional Dict2", "sequence<long>", "sequence<short>", "MozMap<object>", "MozMap<Dict>", "MozMap<long>", - "long[]", "short[]", "Date", "Date?", "any", + "Date", "Date?", "any", "Promise<any>", "Promise<any>?", "USVString", "ArrayBuffer", "ArrayBufferView", "SharedArrayBuffer", "Uint8Array", "Uint16Array" ] @@ -187,7 +187,6 @@ def WebIDLTest(parser, harness): "Date?", "any", "Promise<any>?"] dates = [ "Date", "Date?" ] sequences = [ "sequence<long>", "sequence<short>" ] - arrays = [ "long[]", "short[]" ] nonUserObjects = nonObjects + interfaces + dates + sequences otherObjects = allBut(argTypes, nonUserObjects + ["object"]) notRelatedInterfaces = (nonObjects + ["UnrelatedInterface"] + @@ -229,14 +228,12 @@ def WebIDLTest(parser, harness): setDistinguishable("optional Dict", allBut(nonUserObjects, nullables)) setDistinguishable("optional Dict2", allBut(nonUserObjects, nullables)) setDistinguishable("sequence<long>", - allBut(argTypes, sequences + arrays + ["object"])) + allBut(argTypes, sequences + ["object"])) setDistinguishable("sequence<short>", - allBut(argTypes, sequences + arrays + ["object"])) + allBut(argTypes, sequences + ["object"])) setDistinguishable("MozMap<object>", nonUserObjects) setDistinguishable("MozMap<Dict>", nonUserObjects) setDistinguishable("MozMap<long>", nonUserObjects) - setDistinguishable("long[]", allBut(nonUserObjects, sequences)) - setDistinguishable("short[]", allBut(nonUserObjects, sequences)) setDistinguishable("Date", allBut(argTypes, dates + ["object"])) setDistinguishable("Date?", allBut(argTypes, dates + nullables + ["object"])) setDistinguishable("any", []) diff --git a/components/script/dom/bindings/codegen/parser/tests/test_method.py b/components/script/dom/bindings/codegen/parser/tests/test_method.py index f6f54c33ab6..cf7f1b40d76 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_method.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_method.py @@ -11,7 +11,6 @@ def WebIDLTest(parser, harness): boolean basicBooleanWithSimpleArgs(boolean arg1, byte arg2, unsigned long arg3); void optionalArg(optional byte? arg1, optional sequence<byte> arg2); void variadicArg(byte?... arg1); - void crazyTypes(sequence<long?[]>? arg1, boolean?[][]? arg2); object getObject(); void setObject(object arg1); void setAny(any arg1); @@ -28,7 +27,7 @@ def WebIDLTest(parser, harness): "Should be an IDLInterface") harness.check(iface.identifier.QName(), "::TestMethods", "Interface has the right QName") harness.check(iface.identifier.name, "TestMethods", "Interface has the right name") - harness.check(len(iface.members), 13, "Expect 13 members") + harness.check(len(iface.members), 12, "Expect 12 members") methods = iface.members @@ -98,22 +97,17 @@ def WebIDLTest(parser, harness): "variadicArg", [("Void", [("::TestMethods::variadicArg::arg1", "arg1", "ByteOrNull", True, True)])]) - checkMethod(methods[8], "::TestMethods::crazyTypes", - "crazyTypes", - [("Void", - [("::TestMethods::crazyTypes::arg1", "arg1", "LongOrNullArraySequenceOrNull", False, False), - ("::TestMethods::crazyTypes::arg2", "arg2", "BooleanOrNullArrayArrayOrNull", False, False)])]) - checkMethod(methods[9], "::TestMethods::getObject", + checkMethod(methods[8], "::TestMethods::getObject", "getObject", [("Object", [])]) - checkMethod(methods[10], "::TestMethods::setObject", + checkMethod(methods[9], "::TestMethods::setObject", "setObject", [("Void", [("::TestMethods::setObject::arg1", "arg1", "Object", False, False)])]) - checkMethod(methods[11], "::TestMethods::setAny", + checkMethod(methods[10], "::TestMethods::setAny", "setAny", [("Void", [("::TestMethods::setAny::arg1", "arg1", "Any", False, False)])]) - checkMethod(methods[12], "::TestMethods::doFloats", + checkMethod(methods[11], "::TestMethods::doFloats", "doFloats", [("Float", [("::TestMethods::doFloats::arg1", "arg1", "Float", False, False)])]) diff --git a/components/script/dom/bindings/codegen/parser/tests/test_nullable_equivalency.py b/components/script/dom/bindings/codegen/parser/tests/test_nullable_equivalency.py index 1f72b2c6e67..2b48b615dd4 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_nullable_equivalency.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_nullable_equivalency.py @@ -53,16 +53,6 @@ def WebIDLTest(parser, harness): attribute object a; attribute object? b; }; - - interface TestNullableEquivalency11 { - attribute double[] a; - attribute double[]? b; - }; - - interface TestNullableEquivalency12 { - attribute TestNullableEquivalency9[] a; - attribute TestNullableEquivalency9[]? b; - }; """) for decl in parser.finish(): diff --git a/components/script/dom/bindings/codegen/parser/tests/test_union.py b/components/script/dom/bindings/codegen/parser/tests/test_union.py index 36cacf3ccf4..9c4f2a56ab6 100644 --- a/components/script/dom/bindings/codegen/parser/tests/test_union.py +++ b/components/script/dom/bindings/codegen/parser/tests/test_union.py @@ -139,9 +139,6 @@ def WebIDLTest(parser, harness): void method${i}(${type} arg); ${type} returnMethod${i}(); attribute ${type} attr${i}; - void arrayMethod${i}(${type}[] arg); - ${type}[] arrayReturnMethod${i}(); - attribute ${type}[] arrayAttr${i}; void optionalMethod${i}(${type}? arg); """).substitute(i=i, type=type) interface += """ diff --git a/components/script/dom/bindings/codegen/parser/update.sh b/components/script/dom/bindings/codegen/parser/update.sh index e762ca294f6..6bf56cead30 100755 --- a/components/script/dom/bindings/codegen/parser/update.sh +++ b/components/script/dom/bindings/codegen/parser/update.sh @@ -3,7 +3,6 @@ patch < abstract.patch patch < debug.patch patch < pref-main-thread.patch patch < callback-location.patch -patch < bytestring.patch patch < union-typedef.patch wget https://hg.mozilla.org/mozilla-central/archive/tip.tar.gz/dom/bindings/parser/tests/ -O tests.tar.gz |