From b9ba89999acaa861fa65dbe872470b71568c75f7 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sun, 17 Jun 2012 09:51:22 +0200 Subject: [PATCH] Bug 763169 - Part a: Update resources from upstream and update test names in the expected failures for Selection tests; r=jhammel --- dom/imptests/WebIDLParser.js | 1206 +++++++++++++++-- .../selecttest/test_interfaces.html.json | 12 +- dom/imptests/idlharness.js | 70 +- dom/imptests/testharness.css | 22 + dom/imptests/testharness.js | 241 +++- 5 files changed, 1332 insertions(+), 219 deletions(-) diff --git a/dom/imptests/WebIDLParser.js b/dom/imptests/WebIDLParser.js index 98ea36a74069..61e942bb735a 100644 --- a/dom/imptests/WebIDLParser.js +++ b/dom/imptests/WebIDLParser.js @@ -1,5 +1,4 @@ // From https://github.com/darobin/webidl.js/tree/, under MIT license -// Forked at https://github.com/ayg/webidl.js window.WebIDLParser = (function(){ /* Generated by PEG.js 0.6.2 (http://pegjs.majda.cz/). */ @@ -19,6 +18,8 @@ window.WebIDLParser = (function(){ "ArrayType": parse_ArrayType, "Attribute": parse_Attribute, "BooleanLiteral": parse_BooleanLiteral, + "EnumValues": parse_EnumValues, + "EnumValuesRest": parse_EnumValuesRest, "ExtAttr": parse_ExtAttr, "ExtAttrArgList": parse_ExtAttrArgList, "ExtAttrNameValue": parse_ExtAttrNameValue, @@ -26,6 +27,7 @@ window.WebIDLParser = (function(){ "ExtAttrNoArg": parse_ExtAttrNoArg, "ExtAttrs": parse_ExtAttrs, "ExtAttrsRest": parse_ExtAttrsRest, + "FloatType": parse_FloatType, "GetRaises": parse_GetRaises, "Nullable": parse_Nullable, "Operation": parse_Operation, @@ -45,8 +47,13 @@ window.WebIDLParser = (function(){ "Special": parse_Special, "Stringifier": parse_Stringifier, "TypeDesc": parse_TypeDesc, + "TypeList": parse_TypeList, + "TypeListRest": parse_TypeListRest, + "UnionType": parse_UnionType, "UnsignedIntegerType": parse_UnsignedIntegerType, "attrOrOp": parse_attrOrOp, + "callback": parse_callback, + "callbackinterface": parse_callbackinterface, "const": parse_const, "constExpr": parse_constExpr, "decimal": parse_decimal, @@ -56,6 +63,7 @@ window.WebIDLParser = (function(){ "dictionary": parse_dictionary, "dictionaryMember": parse_dictionaryMember, "dotFloat": parse_dotFloat, + "enum": parse_enum, "exMember": parse_exMember, "exception": parse_exception, "expFloat": parse_expFloat, @@ -1270,29 +1278,42 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; var savedPos1 = pos; if (input.substr(pos, 1) === "-") { - var result8 = "-"; + var result9 = "-"; pos += 1; } else { - var result8 = null; + var result9 = null; if (reportMatchFailures) { matchFailed("\"-\""); } } - var result3 = result8 !== null ? result8 : ''; + var result3 = result9 !== null ? result9 : ''; if (result3 !== null) { - var result7 = parse_leadFloat(); - if (result7 !== null) { - var result4 = result7; + var result8 = parse_leadFloat(); + if (result8 !== null) { + var result4 = result8; } else { - var result6 = parse_dotFloat(); - if (result6 !== null) { - var result4 = result6; + var result7 = parse_dotFloat(); + if (result7 !== null) { + var result4 = result7; } else { - var result5 = parse_expFloat(); - if (result5 !== null) { - var result4 = result5; + var result6 = parse_expFloat(); + if (result6 !== null) { + var result4 = result6; } else { - var result4 = null;; + if (input.substr(pos, 8) === "Infinity") { + var result5 = "Infinity"; + pos += 8; + } else { + var result5 = null; + if (reportMatchFailures) { + matchFailed("\"Infinity\""); + } + } + if (result5 !== null) { + var result4 = result5; + } else { + var result4 = null;; + }; }; }; } @@ -1522,19 +1543,24 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; - var result5 = parse_Sequence(); - if (result5 !== null) { - var result1 = result5; + var result6 = parse_Sequence(); + if (result6 !== null) { + var result1 = result6; } else { - var result4 = parse_ArrayType(); - if (result4 !== null) { - var result1 = result4; + var result5 = parse_ArrayType(); + if (result5 !== null) { + var result1 = result5; } else { - var result3 = parse_SimpleType(); - if (result3 !== null) { - var result1 = result3; + var result4 = parse_SimpleType(); + if (result4 !== null) { + var result1 = result4; } else { - var result1 = null;; + var result3 = parse_UnionType(); + if (result3 !== null) { + var result1 = result3; + } else { + var result1 = null;; + }; }; }; } @@ -1604,7 +1630,7 @@ window.WebIDLParser = (function(){ pos = savedPos1; } var result2 = result1 !== null - ? (function(type) { return { sequence: true, array: false, idlType: type }; })(result1[1]) + ? (function(type) { return { sequence: true, array: false, idlType: type, members: [] }; })(result1[1]) : null; if (result2 !== null) { var result0 = result2; @@ -1669,6 +1695,228 @@ window.WebIDLParser = (function(){ + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_UnionType() { + var cacheKey = 'UnionType@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + if (input.substr(pos, 1) === "(") { + var result3 = "("; + pos += 1; + } else { + var result3 = null; + if (reportMatchFailures) { + matchFailed("\"(\""); + } + } + if (result3 !== null) { + var result4 = parse_w(); + if (result4 !== null) { + var result5 = parse_TypeList(); + if (result5 !== null) { + var result6 = parse_w(); + if (result6 !== null) { + if (input.substr(pos, 1) === ")") { + var result7 = ")"; + pos += 1; + } else { + var result7 = null; + if (reportMatchFailures) { + matchFailed("\")\""); + } + } + if (result7 !== null) { + var result1 = [result3, result4, result5, result6, result7]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(members) { return { idlType: "union", members: members, sequence: false, array: false }; })(result1[2]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_TypeList() { + var cacheKey = 'TypeList@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result3 = parse_type(); + if (result3 !== null) { + var result4 = parse_s(); + if (result4 !== null) { + if (input.substr(pos, 2) === "or") { + var result5 = "or"; + pos += 2; + } else { + var result5 = null; + if (reportMatchFailures) { + matchFailed("\"or\""); + } + } + if (result5 !== null) { + var result6 = parse_s(); + if (result6 !== null) { + var result7 = parse_type(); + if (result7 !== null) { + var result8 = []; + var result9 = parse_TypeListRest(); + while (result9 !== null) { + result8.push(result9); + var result9 = parse_TypeListRest(); + } + if (result8 !== null) { + var result1 = [result3, result4, result5, result6, result7, result8]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(first, second, others) { var ret = [first, second]; + for (var i = 0, n = others.length; i < n; i++) { ret.push(others[i]); } + return ret; })(result1[0], result1[4], result1[5]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_TypeListRest() { + var cacheKey = 'TypeListRest@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result3 = parse_s(); + if (result3 !== null) { + if (input.substr(pos, 2) === "or") { + var result4 = "or"; + pos += 2; + } else { + var result4 = null; + if (reportMatchFailures) { + matchFailed("\"or\""); + } + } + if (result4 !== null) { + var result5 = parse_s(); + if (result5 !== null) { + var result6 = parse_type(); + if (result6 !== null) { + var result1 = [result3, result4, result5, result6]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(rest) { return rest; })(result1[3]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + cache[cacheKey] = { nextPos: pos, result: result0 @@ -1686,24 +1934,29 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; - var result5 = parse_PrimitiveType(); - if (result5 !== null) { - var result1 = result5; + var result6 = parse_PrimitiveType(); + if (result6 !== null) { + var result1 = result6; } else { - var result4 = parse_UnsignedIntegerType(); - if (result4 !== null) { - var result1 = result4; + var result5 = parse_UnsignedIntegerType(); + if (result5 !== null) { + var result1 = result5; } else { - var result3 = parse_ScopedName(); - if (result3 !== null) { - var result1 = result3; + var result4 = parse_FloatType(); + if (result4 !== null) { + var result1 = result4; } else { - var result1 = null;; + var result3 = parse_ScopedName(); + if (result3 !== null) { + var result1 = result3; + } else { + var result1 = null;; + }; }; }; } var result2 = result1 !== null - ? (function(type) { return { sequence: false, array: false, idlType: type }; })(result1) + ? (function(type) { return { sequence: false, array: false, idlType: type, members: [] }; })(result1) : null; if (result2 !== null) { var result0 = result2; @@ -1733,92 +1986,66 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; var savedPos1 = pos; if (input.substr(pos, 3) === "any") { - var result12 = "any"; + var result10 = "any"; pos += 3; } else { - var result12 = null; + var result10 = null; if (reportMatchFailures) { matchFailed("\"any\""); } } - if (result12 !== null) { - var result3 = result12; + if (result10 !== null) { + var result3 = result10; } else { if (input.substr(pos, 6) === "object") { - var result11 = "object"; + var result9 = "object"; pos += 6; } else { - var result11 = null; + var result9 = null; if (reportMatchFailures) { matchFailed("\"object\""); } } - if (result11 !== null) { - var result3 = result11; + if (result9 !== null) { + var result3 = result9; } else { if (input.substr(pos, 7) === "boolean") { - var result10 = "boolean"; + var result8 = "boolean"; pos += 7; } else { - var result10 = null; + var result8 = null; if (reportMatchFailures) { matchFailed("\"boolean\""); } } - if (result10 !== null) { - var result3 = result10; + if (result8 !== null) { + var result3 = result8; } else { if (input.substr(pos, 5) === "octet") { - var result9 = "octet"; + var result7 = "octet"; pos += 5; } else { - var result9 = null; + var result7 = null; if (reportMatchFailures) { matchFailed("\"octet\""); } } - if (result9 !== null) { - var result3 = result9; + if (result7 !== null) { + var result3 = result7; } else { - if (input.substr(pos, 5) === "float") { - var result8 = "float"; - pos += 5; + if (input.substr(pos, 9) === "DOMString") { + var result6 = "DOMString"; + pos += 9; } else { - var result8 = null; + var result6 = null; if (reportMatchFailures) { - matchFailed("\"float\""); + matchFailed("\"DOMString\""); } } - if (result8 !== null) { - var result3 = result8; + if (result6 !== null) { + var result3 = result6; } else { - if (input.substr(pos, 6) === "double") { - var result7 = "double"; - pos += 6; - } else { - var result7 = null; - if (reportMatchFailures) { - matchFailed("\"double\""); - } - } - if (result7 !== null) { - var result3 = result7; - } else { - if (input.substr(pos, 9) === "DOMString") { - var result6 = "DOMString"; - pos += 9; - } else { - var result6 = null; - if (reportMatchFailures) { - matchFailed("\"DOMString\""); - } - } - if (result6 !== null) { - var result3 = result6; - } else { - var result3 = null;; - }; - }; + var result3 = null;; }; }; }; @@ -1866,6 +2093,90 @@ window.WebIDLParser = (function(){ + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_FloatType() { + var cacheKey = 'FloatType@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + if (input.substr(pos, 12) === "unrestricted") { + var result8 = "unrestricted"; + pos += 12; + } else { + var result8 = null; + if (reportMatchFailures) { + matchFailed("\"unrestricted\""); + } + } + var result3 = result8 !== null ? result8 : ''; + if (result3 !== null) { + var result4 = parse_s(); + if (result4 !== null) { + if (input.substr(pos, 5) === "float") { + var result7 = "float"; + pos += 5; + } else { + var result7 = null; + if (reportMatchFailures) { + matchFailed("\"float\""); + } + } + if (result7 !== null) { + var result5 = result7; + } else { + if (input.substr(pos, 6) === "double") { + var result6 = "double"; + pos += 6; + } else { + var result6 = null; + if (reportMatchFailures) { + matchFailed("\"double\""); + } + } + if (result6 !== null) { + var result5 = result6; + } else { + var result5 = null;; + }; + } + if (result5 !== null) { + var result1 = [result3, result4, result5]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(unr, kind) { return (unr ? "unrestricted " : "") + (kind); })(result1[0], result1[2]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + cache[cacheKey] = { nextPos: pos, result: result0 @@ -2514,35 +2825,50 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; - var result9 = parse_partialinterface(); - if (result9 !== null) { - var result1 = result9; + var result12 = parse_partialinterface(); + if (result12 !== null) { + var result1 = result12; } else { - var result8 = parse_module(); - if (result8 !== null) { - var result1 = result8; + var result11 = parse_callbackinterface(); + if (result11 !== null) { + var result1 = result11; } else { - var result7 = parse_interface(); - if (result7 !== null) { - var result1 = result7; + var result10 = parse_module(); + if (result10 !== null) { + var result1 = result10; } else { - var result6 = parse_dictionary(); - if (result6 !== null) { - var result1 = result6; + var result9 = parse_interface(); + if (result9 !== null) { + var result1 = result9; } else { - var result5 = parse_typedef(); - if (result5 !== null) { - var result1 = result5; + var result8 = parse_dictionary(); + if (result8 !== null) { + var result1 = result8; } else { - var result4 = parse_exception(); - if (result4 !== null) { - var result1 = result4; + var result7 = parse_typedef(); + if (result7 !== null) { + var result1 = result7; } else { - var result3 = parse_implements(); - if (result3 !== null) { - var result1 = result3; + var result6 = parse_exception(); + if (result6 !== null) { + var result1 = result6; } else { - var result1 = null;; + var result5 = parse_implements(); + if (result5 !== null) { + var result1 = result5; + } else { + var result4 = parse_enum(); + if (result4 !== null) { + var result1 = result4; + } else { + var result3 = parse_callback(); + if (result3 !== null) { + var result1 = result3; + } else { + var result1 = null;; + }; + }; + }; }; }; }; @@ -2736,6 +3062,180 @@ window.WebIDLParser = (function(){ + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_callbackinterface() { + var cacheKey = 'callbackinterface@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result21 = parse_extendedAttributeList(); + var result3 = result21 !== null ? result21 : ''; + if (result3 !== null) { + var result20 = parse_s(); + var result4 = result20 !== null ? result20 : ''; + if (result4 !== null) { + if (input.substr(pos, 8) === "callback") { + var result5 = "callback"; + pos += 8; + } else { + var result5 = null; + if (reportMatchFailures) { + matchFailed("\"callback\""); + } + } + if (result5 !== null) { + var result6 = parse_s(); + if (result6 !== null) { + if (input.substr(pos, 9) === "interface") { + var result7 = "interface"; + pos += 9; + } else { + var result7 = null; + if (reportMatchFailures) { + matchFailed("\"interface\""); + } + } + if (result7 !== null) { + var result8 = parse_s(); + if (result8 !== null) { + var result9 = parse_identifier(); + if (result9 !== null) { + var result10 = parse_w(); + if (result10 !== null) { + if (input.substr(pos, 1) === "{") { + var result11 = "{"; + pos += 1; + } else { + var result11 = null; + if (reportMatchFailures) { + matchFailed("\"{\""); + } + } + if (result11 !== null) { + var result12 = parse_w(); + if (result12 !== null) { + var result13 = []; + var result19 = parse_ifMember(); + while (result19 !== null) { + result13.push(result19); + var result19 = parse_ifMember(); + } + if (result13 !== null) { + var result14 = parse_w(); + if (result14 !== null) { + if (input.substr(pos, 1) === "}") { + var result15 = "}"; + pos += 1; + } else { + var result15 = null; + if (reportMatchFailures) { + matchFailed("\"}\""); + } + } + if (result15 !== null) { + var result16 = parse_w(); + if (result16 !== null) { + if (input.substr(pos, 1) === ";") { + var result17 = ";"; + pos += 1; + } else { + var result17 = null; + if (reportMatchFailures) { + matchFailed("\";\""); + } + } + if (result17 !== null) { + var result18 = parse_w(); + if (result18 !== null) { + var result1 = [result3, result4, result5, result6, result7, result8, result9, result10, result11, result12, result13, result14, result15, result16, result17, result18]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(extAttrs, name, mem) { return { type: "callbackinterface", name: name, members: mem, extAttrs: extAttrs }; })(result1[0], result1[6], result1[10]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + cache[cacheKey] = { nextPos: pos, result: result0 @@ -3161,6 +3661,449 @@ window.WebIDLParser = (function(){ + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_enum() { + var cacheKey = 'enum@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result18 = parse_extendedAttributeList(); + var result3 = result18 !== null ? result18 : ''; + if (result3 !== null) { + var result17 = parse_s(); + var result4 = result17 !== null ? result17 : ''; + if (result4 !== null) { + if (input.substr(pos, 4) === "enum") { + var result5 = "enum"; + pos += 4; + } else { + var result5 = null; + if (reportMatchFailures) { + matchFailed("\"enum\""); + } + } + if (result5 !== null) { + var result6 = parse_s(); + if (result6 !== null) { + var result7 = parse_identifier(); + if (result7 !== null) { + var result8 = parse_w(); + if (result8 !== null) { + if (input.substr(pos, 1) === "{") { + var result9 = "{"; + pos += 1; + } else { + var result9 = null; + if (reportMatchFailures) { + matchFailed("\"{\""); + } + } + if (result9 !== null) { + var result10 = parse_w(); + if (result10 !== null) { + var result11 = parse_EnumValues(); + if (result11 !== null) { + var result12 = parse_w(); + if (result12 !== null) { + if (input.substr(pos, 1) === "}") { + var result13 = "}"; + pos += 1; + } else { + var result13 = null; + if (reportMatchFailures) { + matchFailed("\"}\""); + } + } + if (result13 !== null) { + var result14 = parse_w(); + if (result14 !== null) { + if (input.substr(pos, 1) === ";") { + var result15 = ";"; + pos += 1; + } else { + var result15 = null; + if (reportMatchFailures) { + matchFailed("\";\""); + } + } + if (result15 !== null) { + var result16 = parse_w(); + if (result16 !== null) { + var result1 = [result3, result4, result5, result6, result7, result8, result9, result10, result11, result12, result13, result14, result15, result16]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(extAttrs, name, values) { return { type: "enum", name: name, values: values, extAttrs: extAttrs }; })(result1[0], result1[4], result1[8]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_callback() { + var cacheKey = 'callback@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result22 = parse_extendedAttributeList(); + var result3 = result22 !== null ? result22 : ''; + if (result3 !== null) { + var result21 = parse_s(); + var result4 = result21 !== null ? result21 : ''; + if (result4 !== null) { + if (input.substr(pos, 8) === "callback") { + var result5 = "callback"; + pos += 8; + } else { + var result5 = null; + if (reportMatchFailures) { + matchFailed("\"callback\""); + } + } + if (result5 !== null) { + var result6 = parse_s(); + if (result6 !== null) { + var result7 = parse_identifier(); + if (result7 !== null) { + var result8 = parse_w(); + if (result8 !== null) { + if (input.substr(pos, 1) === "=") { + var result9 = "="; + pos += 1; + } else { + var result9 = null; + if (reportMatchFailures) { + matchFailed("\"=\""); + } + } + if (result9 !== null) { + var result10 = parse_w(); + if (result10 !== null) { + var result11 = parse_ReturnType(); + if (result11 !== null) { + var result12 = parse_s(); + if (result12 !== null) { + if (input.substr(pos, 1) === "(") { + var result13 = "("; + pos += 1; + } else { + var result13 = null; + if (reportMatchFailures) { + matchFailed("\"(\""); + } + } + if (result13 !== null) { + var result14 = parse_w(); + if (result14 !== null) { + var result15 = parse_Arguments(); + if (result15 !== null) { + var result16 = parse_w(); + if (result16 !== null) { + if (input.substr(pos, 1) === ")") { + var result17 = ")"; + pos += 1; + } else { + var result17 = null; + if (reportMatchFailures) { + matchFailed("\")\""); + } + } + if (result17 !== null) { + var result18 = parse_w(); + if (result18 !== null) { + if (input.substr(pos, 1) === ";") { + var result19 = ";"; + pos += 1; + } else { + var result19 = null; + if (reportMatchFailures) { + matchFailed("\";\""); + } + } + if (result19 !== null) { + var result20 = parse_w(); + if (result20 !== null) { + var result1 = [result3, result4, result5, result6, result7, result8, result9, result10, result11, result12, result13, result14, result15, result16, result17, result18, result19, result20]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(extAttrs, name, ret, args) { return { type: "callback", idlType: ret, name: name, args: args, extAttrs: extAttrs }; })(result1[0], result1[4], result1[8], result1[12]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_EnumValues() { + var cacheKey = 'EnumValues@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result3 = parse_string(); + if (result3 !== null) { + var result4 = []; + var result5 = parse_EnumValuesRest(); + while (result5 !== null) { + result4.push(result5); + var result5 = parse_EnumValuesRest(); + } + if (result4 !== null) { + var result1 = [result3, result4]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(first, others) { var ret = [first]; + for (var i = 0, n = others.length; i < n; i++) { ret.push(others[i]); } + return ret; })(result1[0], result1[1]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + + cache[cacheKey] = { + nextPos: pos, + result: result0 + }; + return result0; + } + + function parse_EnumValuesRest() { + var cacheKey = 'EnumValuesRest@' + pos; + var cachedResult = cache[cacheKey]; + if (cachedResult) { + pos = cachedResult.nextPos; + return cachedResult.result; + } + + + var savedPos0 = pos; + var savedPos1 = pos; + var result3 = parse_w(); + if (result3 !== null) { + if (input.substr(pos, 1) === ",") { + var result4 = ","; + pos += 1; + } else { + var result4 = null; + if (reportMatchFailures) { + matchFailed("\",\""); + } + } + if (result4 !== null) { + var result5 = parse_w(); + if (result5 !== null) { + var result6 = parse_string(); + if (result6 !== null) { + var result1 = [result3, result4, result5, result6]; + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + } else { + var result1 = null; + pos = savedPos1; + } + var result2 = result1 !== null + ? (function(rest) { return rest; })(result1[3]) + : null; + if (result2 !== null) { + var result0 = result2; + } else { + var result0 = null; + pos = savedPos0; + } + + + cache[cacheKey] = { nextPos: pos, result: result0 @@ -3416,19 +4359,32 @@ window.WebIDLParser = (function(){ var savedPos0 = pos; - var result5 = parse_BooleanLiteral(); - if (result5 !== null) { - var result1 = result5; + var result6 = parse_BooleanLiteral(); + if (result6 !== null) { + var result1 = result6; } else { - var result4 = parse_float(); - if (result4 !== null) { - var result1 = result4; + var result5 = parse_float(); + if (result5 !== null) { + var result1 = result5; } else { - var result3 = parse_integer(); - if (result3 !== null) { - var result1 = result3; + var result4 = parse_integer(); + if (result4 !== null) { + var result1 = result4; } else { - var result1 = null;; + if (input.substr(pos, 3) === "NaN") { + var result3 = "NaN"; + pos += 3; + } else { + var result3 = null; + if (reportMatchFailures) { + matchFailed("\"NaN\""); + } + } + if (result3 !== null) { + var result1 = result3; + } else { + var result1 = null;; + }; }; }; } @@ -4922,7 +5878,17 @@ window.WebIDLParser = (function(){ if (result3 !== null) { var result4 = parse_w(); if (result4 !== null) { - var result5 = parse_constExpr(); + var result7 = parse_constExpr(); + if (result7 !== null) { + var result5 = result7; + } else { + var result6 = parse_string(); + if (result6 !== null) { + var result5 = result6; + } else { + var result5 = null;; + }; + } if (result5 !== null) { var result1 = [result3, result4, result5]; } else { @@ -4938,7 +5904,7 @@ window.WebIDLParser = (function(){ pos = savedPos1; } var result2 = result1 !== null - ? (function(value) { return value; })(result1[2]) + ? (function() { return value; })() : null; if (result2 !== null) { var result0 = result2; diff --git a/dom/imptests/failures/editing/selecttest/test_interfaces.html.json b/dom/imptests/failures/editing/selecttest/test_interfaces.html.json index 9521da152f1d..a65bfac75cd2 100644 --- a/dom/imptests/failures/editing/selecttest/test_interfaces.html.json +++ b/dom/imptests/failures/editing/selecttest/test_interfaces.html.json @@ -2,10 +2,10 @@ "Selection interface: existence and properties of interface object":true, "Selection interface: existence and properties of interface prototype object":true, "Selection interface: existence and properties of interface prototype object's \"constructor\" property":true, - "Selection interface: calling collapse() on getSelection() with too few arguments must throw TypeError":true, - "Selection interface: calling extend() on getSelection() with too few arguments must throw TypeError":true, - "Selection interface: calling selectAllChildren() on getSelection() with too few arguments must throw TypeError":true, - "Selection interface: calling getRangeAt() on getSelection() with too few arguments must throw TypeError":true, - "Selection interface: calling addRange() on getSelection() with too few arguments must throw TypeError":true, - "Selection interface: calling removeRange() on getSelection() with too few arguments must throw TypeError":true + "Selection interface: calling collapse(Node,unsigned long) on getSelection() with too few arguments must throw TypeError":true, + "Selection interface: calling extend(Node,unsigned long) on getSelection() with too few arguments must throw TypeError":true, + "Selection interface: calling selectAllChildren(Node) on getSelection() with too few arguments must throw TypeError":true, + "Selection interface: calling getRangeAt(unsigned long) on getSelection() with too few arguments must throw TypeError":true, + "Selection interface: calling addRange(Range) on getSelection() with too few arguments must throw TypeError":true, + "Selection interface: calling removeRange(Range) on getSelection() with too few arguments must throw TypeError":true } diff --git a/dom/imptests/idlharness.js b/dom/imptests/idlharness.js index 693e8c2302f8..ac9fd008ca63 100644 --- a/dom/imptests/idlharness.js +++ b/dom/imptests/idlharness.js @@ -135,6 +135,8 @@ policies and contribution forms [3]. */ "use strict"; (function(){ +var interfaces = {}; + /// IdlArray /// //Entry point window.IdlArray = function() @@ -223,6 +225,10 @@ IdlArray.prototype.internal_add_idls = function(parsed_idls) //TODO break; + case "enum": + //TODO + break; + default: throw parsed_idl.name + ": " + parsed_idl.type + " not yet supported"; } @@ -569,12 +575,10 @@ IdlException.prototype.test_self = function() //ECMA-262 section 15.3.5.3, unless otherwise specified." //TODO //"Its [[Class]] internal property is “Function”." - //String() and {}.toString.call() should be equivalent, since nothing - //defines a stringifier. + //String() returns something implementation-dependent, because it calls + //Function#toString. assert_equals({}.toString.call(window[this.name]), "[object Function]", "{}.toString.call(" + this.name + ")"); - assert_equals(String(window[this.name]), "[object Function]", - "String(" + this.name + ")"); //TODO: Test 4.9.1.1. Exception interface object [[Call]] method (which //does not match browsers: //http://www.w3.org/Bugs/Public/show_bug.cgi?id=14885) @@ -862,6 +866,7 @@ function IdlInterface(obj) this.extAttrs = obj.extAttrs ? obj.extAttrs : []; this.members = obj.members ? obj.members.map(function(m){return new IdlInterfaceMember(m)}) : []; this.inheritance = obj.inheritance ? obj.inheritance : []; + interfaces[this.name] = this; } //@} @@ -926,12 +931,10 @@ IdlInterface.prototype.test_self = function() //ECMA-262 section 15.3.5.3, unless otherwise specified." //TODO //"Its [[Class]] internal property is “Function”." - //String() and {}.toString.call() should be equivalent, since nothing - //defines a stringifier. + //String() returns something implementation-dependent, because it calls + //Function#toString. assert_equals({}.toString.call(window[this.name]), "[object Function]", "{}.toString.call(" + this.name + ")"); - assert_equals(String(window[this.name]), "[object Function]", - "String(" + this.name + ")"); if (!this.has_extended_attribute("Constructor")) { @@ -970,7 +973,7 @@ IdlInterface.prototype.test_self = function() //support multiple operations with the same identifier). var expected_length = this.extAttrs .filter(function(attr) { return attr.name == "Constructor" }) - .map(function(attr) { return attr.arguments.length }) + .map(function(attr) { return attr.arguments ? attr.arguments.length : 0 }) .reduce(function(m, n) { return Math.max(m, n) }); assert_own_property(window[this.name], "length"); assert_equals(window[this.name].length, expected_length, "wrong value for " + this.name + ".length"); @@ -1015,19 +1018,21 @@ IdlInterface.prototype.test_self = function() //"Otherwise, A does inherit from another interface. The value of //the internal [[Prototype]] property of A is the interface //prototype object for the inherited interface." - var inherit_interface; - if (this.inheritance.length) + var inherit_interface = (function() { - inherit_interface = this.inheritance[0]; - } - else if (this.has_extended_attribute("ArrayClass")) - { - inherit_interface = "Array"; - } - else - { - inherit_interface = "Object"; - } + for (var i = 0; i < this.inheritance.length; ++i) + { + if (!interfaces[this.inheritance[i]].has_extended_attribute("NoInterfaceObject")) + { + return this.inheritance[i]; + } + } + if (this.has_extended_attribute("ArrayClass")) + { + return "Array"; + } + return "Object"; + }).bind(this)(); assert_own_property(window, inherit_interface, 'should inherit from ' + inherit_interface + ', but window has no such property'); assert_own_property(window[inherit_interface], "prototype", @@ -1041,9 +1046,9 @@ IdlInterface.prototype.test_self = function() //String() and {}.toString.call() should be equivalent, since nothing //defines a stringifier. assert_equals({}.toString.call(window[this.name].prototype), "[object " + this.name + "Prototype]", - "{}.toString.call(" + this.name + ")"); + "{}.toString.call(" + this.name + ".prototype)"); assert_equals(String(window[this.name].prototype), "[object " + this.name + "Prototype]", - "String(" + this.name + ")"); + "String(" + this.name + ".prototype)"); }.bind(this), this.name + " interface: existence and properties of interface prototype object"); test(function() @@ -1189,9 +1194,12 @@ IdlInterface.prototype.test_members = function() //". . . //"Return the maximum argument list length of the functions //in the entries of S." + //TODO: Does this work for overloads? assert_equals(window[this.name].prototype[member.name].length, member.arguments.length, "property has wrong .length"); - }.bind(this), this.name + " interface: operation " + member.name); + }.bind(this), this.name + " interface: operation " + member.name + + "(" + member.arguments.map(function(m) { return m.type.idlType; }) + + ")"); } //TODO: check more member types, like stringifier } @@ -1319,19 +1327,25 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect // Attributes are accessor properties, so they might // legitimately throw an exception rather than returning // anything. + var property, thrown = false; try { - this.array.assert_type_is(obj[member.name], member.idlType); + property = obj[member.name]; } catch (e) { + thrown = true; + } + if (!thrown) + { + this.array.assert_type_is(property, member.idlType); } } if (member.type == "operation") { assert_equals(typeof obj[member.name], "function"); } - }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type'); + }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')'); } //TODO: This is wrong if there are multiple operations with the same //identifier. @@ -1357,7 +1371,9 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect args.push(create_suitable_object(member.arguments[i].type)); } - }.bind(this), this.name + " interface: calling " + member.name + "() on " + desc + " with too few arguments must throw TypeError"); + }.bind(this), this.name + " interface: calling " + member.name + + "(" + member.arguments.map(function(m) { return m.type.idlType; }) + + ") on " + desc + " with too few arguments must throw TypeError"); } } } diff --git a/dom/imptests/testharness.css b/dom/imptests/testharness.css index 15d2ede56a55..341386dde0bb 100644 --- a/dom/imptests/testharness.css +++ b/dom/imptests/testharness.css @@ -2,6 +2,23 @@ html { font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans; } +#log .warning, +#log .warning a { + color: black; + background: yellow; +} + +#log .error, +#log .error a { + color: white; + background: red; +} + +#log pre { + border: 1px solid black; + padding: 1em; +} + section#summary { margin-bottom:1em; } @@ -22,6 +39,11 @@ table#results td:last-child { width:50%; } +table#results.assertions th:last-child, +table#results.assertions td:last-child { + width:35%; +} + table#results th { padding:0; padding-bottom:0.5em; diff --git a/dom/imptests/testharness.js b/dom/imptests/testharness.js index 091a146060e1..825f040e7ed4 100644 --- a/dom/imptests/testharness.js +++ b/dom/imptests/testharness.js @@ -33,8 +33,8 @@ policies and contribution forms [3]. * the tests have run. * * NOTE: By default tests must be created before the load event fires. For ways - * to create tests after the load event, see "Determining when all tests are - * complete", below + * to create tests after the load event, see "Determining when all tests + * are complete", below * * == Synchronous Tests == * @@ -49,8 +49,8 @@ policies and contribution forms [3]. * * The function passed in is run in the test() call. * - * properties is an object that overrides default test properties. The recognised properties - * are: + * properties is an object that overrides default test properties. The + * recognised properties are: * timeout - the test timeout in ms * * e.g. @@ -58,6 +58,19 @@ policies and contribution forms [3]. * * would run test_function with a timeout of 1s. * + * Additionally, test-specific metadata can be passed in the properties. These + * are used when the individual test has different metadata from that stored + * in the . + * The recognized metadata properties are: + * + * help - The url of the part of the specification being tested + * + * assert - A human readable description of what the test is attempting + * to prove + * + * author - Name and contact information for the author of the test in the + * format: "Name " or "Name http://contact/url" + * * == Asynchronous Tests == * * Testing asynchronous features is somewhat more complex since the result of @@ -124,12 +137,18 @@ policies and contribution forms [3]. * tests to complete (this is different to the per-test timeout * because async tests do not start their timer until .step is called) * - * explicit_done - Wait for an explicit call to done() before declaring all tests - * complete (see below) + * explicit_done - Wait for an explicit call to done() before declaring all + * tests complete (see below) * - * output_document - The document to which results should be logged. By default this is - * the current document but could be an ancestor document in some cases - * e.g. a SVG test loaded in an HTML wrapper + * output_document - The document to which results should be logged. By default + * this is the current document but could be an ancestor + * document in some cases e.g. a SVG test loaded in an HTML + * wrapper + * + * explicit_timeout - disable file timeout; only stop waiting for results + * when the timeout() function is called (typically for + * use when integrating with some existing test framework + * that has its own timeout mechanism). * * == Determining when all tests are complete == * @@ -138,10 +157,10 @@ policies and contribution forms [3]. * 1) There are no Test objects that have been created but not completed * 2) The load event on the document has fired * - * This behaviour can be overridden by setting the explicit_done property to true - * in a call to setup(). If explicit_done is true, the test harness will not assume - * it is done until the global done() function is called. Once done() is called, the - * two conditions above apply like normal. + * This behaviour can be overridden by setting the explicit_done property to + * true in a call to setup(). If explicit_done is true, the test harness will + * not assume it is done until the global done() function is called. Once done() + * is called, the two conditions above apply like normal. * * == Generating tests == * @@ -152,7 +171,7 @@ policies and contribution forms [3]. * used. To make this easier, the generate_tests function allows a single * function to be called with each set of parameters in a list: * - * generate_tests(test_function, parameter_lists) + * generate_tests(test_function, parameter_lists, properties) * * For example: * @@ -169,6 +188,9 @@ policies and contribution forms [3]. * Note that the first item in each parameter list corresponds to the name of * the test. * + * The properties argument is identical to that for test(). This may be a + * single object (used for all generated tests) or an array. + * * == Callback API == * * The framework provides callbacks corresponding to 3 events: @@ -254,15 +276,16 @@ policies and contribution forms [3]. * assert that property property_name on object is readonly * * assert_throws(code, func, description) - * code - a DOMException/RangeException code as a string, e.g. "HIERARCHY_REQUEST_ERR" + * code - the expected exception: + * o string: the thrown exception must be a DOMException with the given + * name, e.g., "TimeoutError" (for compatibility with existing + * tests, a constant is also supported, e.g., "TIMEOUT_ERR") + * o object: the thrown exception must have a property called "name" that + * matches code.name + * o null: allow any exception (in general, one of the options above + * should be used) * func - a function that should throw * - * assert that func throws a DOMException or RangeException (as appropriate) - * with the given code. If an object is passed for code instead of a string, - * checks that the thrown exception has a property called "name" that matches - * the property of code called "name". Note, this function will probably be - * rewritten sometime to make more sense. - * * assert_unreached(description) * asserts if called. Used to ensure that some codepath is *not* taken e.g. * an event does not fire. @@ -369,14 +392,16 @@ policies and contribution forms [3]. tests.end_wait(); } - function generate_tests(func, args) { - forEach(args, function(x) + function generate_tests(func, args, properties) { + forEach(args, function(x, i) { var name = x[0]; test(function() { func.apply(this, x.slice(1)); - }, name); + }, + name, + Array.isArray(properties) ? properties[i] : properties); }); } @@ -751,6 +776,10 @@ policies and contribution forms [3]. if (e instanceof AssertionError) { throw(e); } + if (code === null) + { + return; + } if (typeof code === "object") { assert(typeof e == "object" && "name" in e && e.name == code.name, @@ -761,40 +790,78 @@ policies and contribution forms [3]. expected_name:code.name}); return; } - var required_props = {}; - required_props.code = { - INDEX_SIZE_ERR: 1, - HIERARCHY_REQUEST_ERR: 3, - WRONG_DOCUMENT_ERR: 4, - INVALID_CHARACTER_ERR: 5, - NO_MODIFICATION_ALLOWED_ERR: 7, - NOT_FOUND_ERR: 8, - NOT_SUPPORTED_ERR: 9, - INVALID_STATE_ERR: 11, - SYNTAX_ERR: 12, - INVALID_MODIFICATION_ERR: 13, - NAMESPACE_ERR: 14, - INVALID_ACCESS_ERR: 15, - TYPE_MISMATCH_ERR: 17, - SECURITY_ERR: 18, - NETWORK_ERR: 19, - ABORT_ERR: 20, - URL_MISMATCH_ERR: 21, - QUOTA_EXCEEDED_ERR: 22, - TIMEOUT_ERR: 23, - INVALID_NODE_TYPE_ERR: 24, - DATA_CLONE_ERR: 25, - }[code]; - if (required_props.code === undefined) + + var code_name_map = { + INDEX_SIZE_ERR: 'IndexSizeError', + HIERARCHY_REQUEST_ERR: 'HierarchyRequestError', + WRONG_DOCUMENT_ERR: 'WrongDocumentError', + INVALID_CHARACTER_ERR: 'InvalidCharacterError', + NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError', + NOT_FOUND_ERR: 'NotFoundError', + NOT_SUPPORTED_ERR: 'NotSupportedError', + INVALID_STATE_ERR: 'InvalidStateError', + SYNTAX_ERR: 'SyntaxError', + INVALID_MODIFICATION_ERR: 'InvalidModificationError', + NAMESPACE_ERR: 'NamespaceError', + INVALID_ACCESS_ERR: 'InvalidAccessError', + TYPE_MISMATCH_ERR: 'TypeMismatchError', + SECURITY_ERR: 'SecurityError', + NETWORK_ERR: 'NetworkError', + ABORT_ERR: 'AbortError', + URL_MISMATCH_ERR: 'URLMismatchError', + QUOTA_EXCEEDED_ERR: 'QuotaExceededError', + TIMEOUT_ERR: 'TimeoutError', + INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError', + DATA_CLONE_ERR: 'DataCloneError', + }; + + var name = code in code_name_map ? code_name_map[code] : code; + + var name_code_map = { + IndexSizeError: 1, + HierarchyRequestError: 3, + WrongDocumentError: 4, + InvalidCharacterError: 5, + NoModificationAllowedError: 7, + NotFoundError: 8, + NotSupportedError: 9, + InvalidStateError: 11, + SyntaxError: 12, + InvalidModificationError: 13, + NamespaceError: 14, + InvalidAccessError: 15, + TypeMismatchError: 17, + SecurityError: 18, + NetworkError: 19, + AbortError: 20, + URLMismatchError: 21, + QuotaExceededError: 22, + TimeoutError: 23, + InvalidNodeTypeError: 24, + DataCloneError: 25, + + UnknownError: 0, + ConstraintError: 0, + DataError: 0, + TransactionInactiveError: 0, + ReadOnlyError: 0, + VersionError: 0, + }; + + if (!(name in name_code_map)) { throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()'); } - required_props[code] = required_props.code; - //Uncomment this when the latest version of every browser - //actually implements the spec; otherwise it just creates - //zillions of failures. Also do required_props.type. - //required_props.name = code; - // + + var required_props = { code: name_code_map[name] }; + + if (required_props.code === 0 + || ("name" in e && e.name !== e.name.toUpperCase() && e.name !== "DOMException")) + { + // New style exception: also test the name property. + required_props.name = name; + } + //We'd like to test that e instanceof the appropriate interface, //but we can't, because we don't know what window it was created //in. It might be an instanceof the appropriate interface on some @@ -829,6 +896,7 @@ policies and contribution forms [3]. this.timeout_id = null; this.is_done = false; + this.properties = properties; this.timeout_length = properties.timeout ? properties.timeout : settings.test_timeout; this.message = null; @@ -881,7 +949,7 @@ policies and contribution forms [3]. return; } this.status = this.FAIL; - this.message = e.message; + this.message = (typeof e === "object" && e !== null) ? e.message : e; if (typeof e.stack != "undefined" && typeof e.message == "string") { //Try to make it more informative for some exceptions, at least //in Gecko and WebKit. This results in a stack dump instead of @@ -973,6 +1041,8 @@ policies and contribution forms [3]. }; this.phase = this.phases.INITIAL; + this.properties = {}; + //All tests can't be done until the load event fires this.all_loaded = false; this.wait_for_finish = false; @@ -980,7 +1050,6 @@ policies and contribution forms [3]. this.timeout_length = settings.timeout; this.timeout_id = null; - this.set_timeout(); this.start_callbacks = []; this.test_done_callbacks = []; @@ -999,7 +1068,8 @@ policies and contribution forms [3]. this_obj.complete(); } }); - this.properties = {}; + + this.set_timeout(); } Tests.prototype.setup = function(func, properties) @@ -1024,12 +1094,14 @@ policies and contribution forms [3]. if (properties.timeout) { this.timeout_length = properties.timeout; - this.set_timeout(); } if (properties.explicit_done) { this.wait_for_finish = true; } + if (properties.explicit_timeout) { + this.timeout_length = null; + } if (func) { @@ -1042,15 +1114,19 @@ policies and contribution forms [3]. this.status.message = e; }; } + this.set_timeout(); }; Tests.prototype.set_timeout = function() { var this_obj = this; clearTimeout(this.timeout_id); - this.timeout_id = setTimeout(function() { - this_obj.timeout(); - }, this.timeout_length); + if (this.timeout_length !== null) + { + this.timeout_id = setTimeout(function() { + this_obj.timeout(); + }, this.timeout_length); + } }; Tests.prototype.timeout = function() { @@ -1069,7 +1145,7 @@ policies and contribution forms [3]. Tests.prototype.push = function(test) { if (this.phase < this.phases.HAVE_TESTS) { - this.notify_start(); + this.start(); } this.num_pending++; this.tests.push(test); @@ -1201,6 +1277,14 @@ policies and contribution forms [3]. var tests = new Tests(); + function timeout() { + if (tests.timeout_length === null) + { + tests.timeout(); + } + } + expose(timeout, 'timeout'); + function add_start_callback(callback) { tests.start_callbacks.push(callback); } @@ -1415,9 +1499,33 @@ policies and contribution forms [3]. .replace(/'/g, "'"); } + function has_assertions() + { + for (var i = 0; i < tests.length; i++) { + if (tests[i].properties.hasOwnProperty("assert")) { + return true; + } + } + return false; + } + + function get_assertion(test) + { + if (test.properties.hasOwnProperty("assert")) { + if (Array.isArray(test.properties.assert)) { + return test.properties.assert.join(' '); + } + return test.properties.assert; + } + return ''; + } + log.appendChild(document.createElement("section")); - var html = "

Details

" - + "" + var assertions = has_assertions(); + var html = "

Details

ResultTest NameMessage
" + + "" + + (assertions ? "" : "") + + "" + ""; for (var i = 0; i < tests.length; i++) { html += '"; } @@ -1755,4 +1864,4 @@ policies and contribution forms [3]. } })(); -// vim: set expandtab shiftwidth=4 tabstop=4: +// vim: set expandtab shiftwidth=4 tabstop=4: \ No newline at end of file
ResultTest NameAssertionMessage
" + escape_html(tests[i].name) + "" + + (assertions ? escape_html(get_assertion(tests[i])) + "" : "") + escape_html(tests[i].message ? tests[i].message : " ") + "