Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/html/dom/reflection.js |
diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/dom/reflection.js b/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/dom/reflection.js |
deleted file mode 100644 |
index b9adb4cfb3c14c3bf17de9fac4605f3f3c586db8..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/html/dom/reflection.js |
+++ /dev/null |
@@ -1,831 +0,0 @@ |
-ReflectionTests = {}; |
- |
-ReflectionTests.start = new Date().getTime(); |
- |
-/** |
- * Resolve the given URL to an absolute URL, relative to the current document's |
- * address. There's no API that I know of that exposes this directly, so we |
- * actually just create an <a> element, set its href, and stitch together the |
- * various properties. Seems to work. We don't try to reimplement the |
- * algorithm here, because we're not concerned with its correctness -- we're |
- * only testing HTML reflection, not Web Addresses. |
- * |
- * Return "" if the URL couldn't be resolved, since this is really for |
- * reflected URL attributes, and those are supposed to return "" if the URL |
- * couldn't be resolved. |
- * |
- * It seems like IE9 doesn't implement URL decomposition attributes correctly |
- * for <a>, which causes all these tests to fail. Ideally I'd do this in some |
- * other way, but the failure does stem from an incorrect implementation of |
- * HTML, so I'll leave it alone for now. |
- * |
- * TODO: This relies on reflection to test reflection, so it could mask bugs. |
- * Either get a JS implementation of the "resolve a URL" algorithm, or just |
- * specify expected values manually here. It shouldn't be too hard to write |
- * special cases for all the values we test. |
- */ |
-ReflectionTests.resolveUrl = function(url) { |
- var el = document.createElement("a"); |
- el.href = String(url); |
- var ret = el.protocol + "//" + el.host + el.pathname + el.search + el.hash; |
- if (ret == "//") { |
- return ""; |
- } else { |
- return ret; |
- } |
-}; |
- |
-/** |
- * Given some input, convert to a multi-URL value for IDL get per the spec. |
- */ |
-ReflectionTests.urlsExpected = function(urls) { |
- var expected = ""; |
- // TODO: Test other whitespace? |
- urls = urls + ""; |
- var split = urls.split(" "); |
- for (var j = 0; j < split.length; j++) { |
- if (split[j] == "") { |
- continue; |
- } |
- var append = ReflectionTests.resolveUrl(split[j]); |
- if (append == "") { |
- continue; |
- } |
- if (expected == "") { |
- expected = append; |
- } else { |
- expected += " " + append; |
- } |
- } |
- return expected; |
-}; |
- |
-/** |
- * The "rules for parsing non-negative integers" from the HTML spec. They're |
- * mostly used for reflection, so here seems like as good a place to test them |
- * as any. Returns false on error. |
- */ |
-ReflectionTests.parseNonneg = function(input) { |
- var value = this.parseInt(input); |
- if (value === false || value < 0) { |
- return false; |
- } |
- return value; |
-}; |
- |
-/** |
- * The "rules for parsing integers" from the HTML spec. Returns false on |
- * error. |
- */ |
-ReflectionTests.parseInt = function(input) { |
- var position = 0; |
- var sign = 1; |
- // Skip whitespace |
- while (input.length > position && /^[ \t\n\f\r]$/.test(input[position])) { |
- position++; |
- } |
- if (position >= input.length) { |
- return false; |
- } |
- if (input[position] == "-") { |
- sign = -1; |
- position++; |
- } else if (input[position] == "+") { |
- position++; |
- } |
- if (position >= input.length) { |
- return false; |
- } |
- if (!/^[0-9]$/.test(input[position])) { |
- return false; |
- } |
- var value = 0; |
- while (input.length > position && /^[0-9]$/.test(input[position])) { |
- value *= 10; |
- // Don't use parseInt even for single-digit strings . . . |
- value += input.charCodeAt(position) - "0".charCodeAt(0); |
- position++; |
- } |
- if (value === 0) { |
- return 0; |
- } |
- return sign * value; |
-}; |
- |
-// Used in initializing typeMap |
-var binaryString = "\x00\x01\x02\x03\x04\x05\x06\x07 " |
- + "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f " |
- + "\x10\x11\x12\x13\x14\x15\x16\x17 " |
- + "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f "; |
-var maxInt = 2147483647; |
-var minInt = -2147483648; |
-var maxUnsigned = 4294967295; |
- |
-/** |
- * Array containing the tests and other information for each type of reflected |
- * attribute. Meaning of keys: |
- * |
- * "jsType": What typeof idlObj[idlName] is supposed to be. |
- * "defaultVal": The default value to be returned if the attribute is not |
- * present and no default is specifically set for this attribute. |
- * "domTests": What values to test with setAttribute(). |
- * "domExpected": What values to expect with IDL get after setAttribute(). |
- * Defaults to the same as domTests. |
- * "idlTests": What values to test with IDL set. Defaults to domTests. |
- * "idlDomExpected": What to expect from getAttribute() after IDL set. |
- * Defaults to idlTests. |
- * "idlIdlExpected": What to expect from IDL get after IDL set. Defaults to |
- * idlDomExpected. |
- * |
- * Note that all tests/expected values are only baselines, and can be expanded |
- * with additional tests hardcoded into the function for particular types if |
- * necessary. For example, a special codepath is used for enums, and for |
- * IDL setters which throw an exception. null means "defaultVal" is the |
- * expected value. Expected DOM values are cast to strings by adding "". |
- * |
- * TODO: Test strings that aren't valid UTF-16. Desired behavior is not clear |
- * here at the time of writing, see |
- * http://www.w3.org/Bugs/Public/show_bug.cgi?id=12100 |
- * |
- * TODO: Test deleting an IDL attribute, and maybe doing other fun stuff to it. |
- * |
- * TODO: Test IDL sets of integer types to out-of-range or other weird values. |
- * WebIDL says to wrap, but I'm not sure offhand if that's what we want. |
- * |
- * TODO: tokenlist, settable tokenlist, limited |
- */ |
- |
- |
-ReflectionTests.typeMap = { |
- /** |
- * "If a reflecting IDL attribute is a DOMString but doesn't fall into any |
- * of the above categories, then the getting and setting must be done in a |
- * transparent, case-preserving manner." |
- * |
- * The data object passed to reflects() can contain an optional key |
- * treatNullAsEmptyString, whose value is ignored. If it does contain the |
- * key, null will be cast to "" instead of "null", per WebIDL |
- * [TreatNullAs=EmptyString]. |
- */ |
- "string": { |
- "jsType": "string", |
- "defaultVal": "", |
- "domTests": ["", " " + binaryString + " foo ", undefined, 7, 1.5, true, |
- false, {"test": 6}, NaN, +Infinity, -Infinity, "\0", null, |
- {"toString":function(){return "test-toString";}}, |
- {"valueOf":function(){return "test-valueOf";}, toString:null} |
- ] |
- }, |
- /** |
- * "If a reflecting IDL attribute is a DOMString attribute whose content |
- * attribute is defined to contain a URL, then on getting, the IDL |
- * attribute must resolve the value of the content attribute relative to |
- * the element and return the resulting absolute URL if that was |
- * successful, or the empty string otherwise; and on setting, must set the |
- * content attribute to the specified literal value. If the content |
- * attribute is absent, the IDL attribute must return the default value, if |
- * the content attribute has one, or else the empty string." |
- */ |
- "url": { |
- "jsType": "string", |
- "defaultVal": "", |
- "domTests": ["", " foo ", "http://site.example/", |
- "//site.example/path???@#l", binaryString, undefined, 7, 1.5, true, |
- false, {"test": 6}, NaN, +Infinity, -Infinity, "\0", null, |
- {"toString":function(){return "test-toString";}}, |
- {"valueOf":function(){return "test-valueOf";}, toString:null}], |
- "domExpected": ReflectionTests.resolveUrl, |
- "idlIdlExpected": ReflectionTests.resolveUrl |
- }, |
- /** |
- * "If a reflecting IDL attribute is a DOMString attribute whose content |
- * attribute is defined to contain one or more URLs, then on getting, the |
- * IDL attribute must split the content attribute on spaces and return the |
- * concatenation of resolving each token URL to an absolute URL relative to |
- * the element, with a single U+0020 SPACE character between each URL, |
- * ignoring any tokens that did not resolve successfully. If the content |
- * attribute is absent, the IDL attribute must return the default value, if |
- * the content attribute has one, or else the empty string. On setting, the |
- * IDL attribute must set the content attribute to the specified literal |
- * value." |
- * |
- * Seems to only be used for ping. |
- */ |
- "urls": { |
- "jsType": "string", |
- "defaultVal": "", |
- "domTests": ["", " foo ", "http://site.example/ foo bar baz", |
- "//site.example/path???@#l", binaryString, undefined, 7, 1.5, true, |
- false, {"test": 6}, NaN, +Infinity, -Infinity, "\0", null, |
- {"toString":function(){return "test-toString";}}, |
- {"valueOf":function(){return "test-valueOf";}, toString:null}], |
- "domExpected": ReflectionTests.urlsExpected, |
- "idlIdlExpected": ReflectionTests.urlsExpected |
- }, |
- /** |
- * "If a reflecting IDL attribute is a DOMString whose content attribute is |
- * an enumerated attribute, and the IDL attribute is limited to only known |
- * values, then, on getting, the IDL attribute must return the conforming |
- * value associated with the state the attribute is in (in its canonical |
- * case), or the empty string if the attribute is in a state that has no |
- * associated keyword value; and on setting, if the new value is an ASCII |
- * case-insensitive match for one of the keywords given for that attribute, |
- * then the content attribute must be set to the conforming value |
- * associated with the state that the attribute would be in if set to the |
- * given new value, otherwise, if the new value is the empty string, then |
- * the content attribute must be removed, otherwise, the content attribute |
- * must be set to the given new value." |
- * |
- * "Some attributes are defined as taking one of a finite set of keywords. |
- * Such attributes are called enumerated attributes. The keywords are each |
- * defined to map to a particular state (several keywords might map to the |
- * same state, in which case some of the keywords are synonyms of each |
- * other; additionally, some of the keywords can be said to be |
- * non-conforming, and are only in the specification for historical |
- * reasons). In addition, two default states can be given. The first is the |
- * invalid value default, the second is the missing value default. |
- * |
- * . . . |
- * |
- * When the attribute is specified, if its value is an ASCII |
- * case-insensitive match for one of the given keywords then that keyword's |
- * state is the state that the attribute represents. If the attribute value |
- * matches none of the given keywords, but the attribute has an invalid |
- * value default, then the attribute represents that state. Otherwise, if |
- * the attribute value matches none of the keywords but there is a missing |
- * value default state defined, then that is the state represented by the |
- * attribute. Otherwise, there is no default, and invalid values must be |
- * ignored. |
- * |
- * When the attribute is not specified, if there is a missing value default |
- * state defined, then that is the state represented by the (missing) |
- * attribute. Otherwise, the absence of the attribute means that there is |
- * no state represented." |
- * |
- * This is only used for enums that are limited to known values, not other |
- * enums (those are treated as generic strings by the spec). The data |
- * object passed to reflects() can contain these keys: |
- * |
- * "defaultVal": missing value default (defaults to "") |
- * "invalidVal": invalid value default (defaults to defaultVal) |
- * "keywords": array of keywords as given by the spec (required) |
- * "nonCanon": dictionary mapping non-canonical values to their |
- * canonical equivalents (defaults to {}) |
- * "isNullable": Indicates if attribute is nullable (defaults to false) |
- * |
- * Tests are mostly hardcoded into reflects(), since they depend on the |
- * keywords. All expected values are computed in reflects() using a helper |
- * function. |
- */ |
- "enum": { |
- "jsType": "string", |
- "defaultVal": "", |
- "domTests": ["", " " + binaryString + " foo ", undefined, 7, 1.5, true, |
- false, {"test": 6}, NaN, +Infinity, -Infinity, "\0", null, |
- {"toString":function(){return "test-toString";}}, |
- {"valueOf":function(){return "test-valueOf";}, toString:null}] |
- }, |
- /** |
- * "If a reflecting IDL attribute is a boolean attribute, then on getting |
- * the IDL attribute must return true if the content attribute is set, and |
- * false if it is absent. On setting, the content attribute must be removed |
- * if the IDL attribute is set to false, and must be set to the empty |
- * string if the IDL attribute is set to true. (This corresponds to the |
- * rules for boolean content attributes.)" |
- */ |
- "boolean": { |
- "jsType": "boolean", |
- "defaultVal": false, |
- "domTests": ["", " foo ", undefined, null, 7, 1.5, true, false, |
- {"test": 6}, NaN, +Infinity, -Infinity, "\0", |
- {"toString":function(){return "test-toString";}}, |
- {"valueOf":function(){return "test-valueOf";}, toString:null}], |
- "domExpected": function(val) { |
- return true; |
- } |
- }, |
- /** |
- * "If a reflecting IDL attribute is a signed integer type (long) then, on |
- * getting, the content attribute must be parsed according to the rules for |
- * parsing signed integers, and if that is successful, and the value is in |
- * the range of the IDL attribute's type, the resulting value must be |
- * returned. If, on the other hand, it fails or returns an out of range |
- * value, or if the attribute is absent, then the default value must be |
- * returned instead, or 0 if there is no default value. On setting, the |
- * given value must be converted to the shortest possible string |
- * representing the number as a valid integer and then that string must be |
- * used as the new content attribute value." |
- */ |
- "long": { |
- "jsType": "number", |
- "defaultVal": 0, |
- "domTests": [-36, -1, 0, 1, maxInt, minInt, maxInt + 1, minInt - 1, |
- maxUnsigned, maxUnsigned + 1, "", "-1", "-0", "0", "1", |
- " " + binaryString + " foo ", |
- // Test various different whitespace. Only 20, 9, A, C, |
- // and D are whitespace. |
- "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", |
- "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", |
- "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", |
- "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", |
- "\u30007", |
- undefined, 1.5, true, false, {"test": 6}, NaN, +Infinity, |
- -Infinity, "\0", |
- {toString:function() {return 2;}, valueOf: null}, |
- {valueOf:function() {return 3;}}], |
- "domExpected": function(val) { |
- var parsed = ReflectionTests.parseInt(String(val)); |
- if (parsed === false || parsed > maxInt || parsed < minInt) { |
- return null; |
- } |
- return parsed; |
- }, |
- "idlTests": [-36, -1, 0, 1, 2147483647, -2147483648], |
- "idlDomExpected": [-36, -1, 0, 1, 2147483647, -2147483648] |
- }, |
- /** |
- * "If a reflecting IDL attribute is a signed integer type (long) that is |
- * limited to only non-negative numbers then, on getting, the content |
- * attribute must be parsed according to the rules for parsing non-negative |
- * integers, and if that is successful, and the value is in the range of |
- * the IDL attribute's type, the resulting value must be returned. If, on |
- * the other hand, it fails or returns an out of range value, or if the |
- * attribute is absent, the default value must be returned instead, or −1 |
- * if there is no default value. On setting, if the value is negative, the |
- * user agent must fire an INDEX_SIZE_ERR exception. Otherwise, the given |
- * value must be converted to the shortest possible string representing the |
- * number as a valid non-negative integer and then that string must be used |
- * as the new content attribute value." |
- */ |
- "limited long": { |
- "jsType": "number", |
- "defaultVal": -1, |
- "domTests": [minInt - 1, minInt, -36, -1, -0, 0, 1, maxInt, maxInt + 1, |
- maxUnsigned, maxUnsigned + 1, "", "-1", "-0", "0", "1", |
- " " + binaryString + " foo ", |
- "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", |
- "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", |
- "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", |
- "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", |
- "\u30007", |
- undefined, 1.5, true, false, {"test": 6}, NaN, +Infinity, |
- -Infinity, "\0", |
- {toString:function() {return 2;}, valueOf: null}, |
- {valueOf:function() {return 3;}}], |
- "domExpected": function(val) { |
- var parsed = ReflectionTests.parseNonneg(String(val)); |
- if (parsed === false || parsed > maxInt || parsed < minInt) { |
- return null; |
- } |
- return parsed; |
- }, |
- "idlTests": [minInt, -36, -1, 0, 1, maxInt], |
- "idlDomExpected": [null/*exception*/, null/*exception*/, null/*exception*/, 0, 1, maxInt] |
- }, |
- /** |
- * "If a reflecting IDL attribute is an unsigned integer type (unsigned |
- * long) then, on getting, the content attribute must be parsed according |
- * to the rules for parsing non-negative integers, and if that is |
- * successful, and the value is in the range 0 to 2147483647 inclusive, the |
- * resulting value must be returned. If, on the other hand, it fails or |
- * returns an out of range value, or if the attribute is absent, the |
- * default value must be returned instead, or 0 if there is no default |
- * value. On setting, the given value must be converted to the shortest |
- * possible string representing the number as a valid non-negative integer |
- * and then that string must be used as the new content attribute value." |
- */ |
- "unsigned long": { |
- "jsType": "number", |
- "defaultVal": 0, |
- "domTests": [minInt - 1, minInt, -36, -1, 0, 1, 257, maxInt, |
- maxInt + 1, maxUnsigned, maxUnsigned + 1, "", "-1", "-0", "0", "1", |
- "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", |
- "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", |
- "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", |
- "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", |
- "\u30007", |
- " " + binaryString + " foo ", undefined, 1.5, true, false, |
- {"test": 6}, NaN, +Infinity, -Infinity, "\0", |
- {toString:function() {return 2;}, valueOf: null}, |
- {valueOf:function() {return 3;}}], |
- "domExpected": function(val) { |
- var parsed = ReflectionTests.parseNonneg(String(val)); |
- // Note maxInt, not maxUnsigned. |
- if (parsed === false || parsed < 0 || parsed > maxInt) { |
- return null; |
- } |
- return parsed; |
- }, |
- "idlTests": [0, 1, 257, maxInt, "-0", maxInt + 1, maxUnsigned], |
- "idlIdlExpected": [0, 1, 257, maxInt, 0, null, null], |
- "idlDomExpected": [0, 1, 257, maxInt, 0, null, null], |
- }, |
- /** |
- * "If a reflecting IDL attribute is an unsigned integer type (unsigned |
- * long) that is limited to only non-negative numbers greater than zero, |
- * then the behavior is similar to the previous case, but zero is not |
- * allowed. On getting, the content attribute must first be parsed |
- * according to the rules for parsing non-negative integers, and if that is |
- * successful, and the value is in the range 1 to 2147483647 inclusive, the |
- * resulting value must be returned. If, on the other hand, it fails or |
- * returns an out of range value, or if the attribute is absent, the |
- * default value must be returned instead, or 1 if there is no default |
- * value. On setting, if the value is zero, the user agent must fire an |
- * INDEX_SIZE_ERR exception. Otherwise, the given value must be converted |
- * to the shortest possible string representing the number as a valid |
- * non-negative integer and then that string must be used as the new |
- * content attribute value." |
- */ |
- "limited unsigned long": { |
- "jsType": "number", |
- "defaultVal": 1, |
- "domTests": [minInt - 1, minInt, -36, -1, 0, 1, maxInt, |
- maxInt + 1, maxUnsigned, maxUnsigned + 1, "", "-1", "-0", "0", "1", |
- "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", |
- "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", |
- "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", |
- "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", |
- "\u30007", |
- " " + binaryString + " foo ", undefined, 1.5, true, false, |
- {"test": 6}, NaN, +Infinity, -Infinity, "\0", |
- {toString:function() {return 2;}, valueOf: null}, |
- {valueOf:function() {return 3;}}], |
- "domExpected": function(val) { |
- var parsed = ReflectionTests.parseNonneg(String(val)); |
- // Note maxInt, not maxUnsigned. |
- if (parsed === false || parsed < 1 || parsed > maxInt) { |
- return null; |
- } |
- return parsed; |
- }, |
- "idlTests": [0, 1, maxInt, maxInt + 1, maxUnsigned], |
- "idlDomExpected": [null/*exception*/, 1, maxInt, null, null] |
- }, |
- /** |
- * "If a reflecting IDL attribute is a floating point number type (double), |
- * then, on getting, the content attribute must be parsed according to the |
- * rules for parsing floating point number values, and if that is |
- * successful, the resulting value must be returned. If, on the other hand, |
- * it fails, or if the attribute is absent, the default value must be |
- * returned instead, or 0.0 if there is no default value. On setting, the |
- * given value must be converted to the best representation of the number |
- * as a floating point number and then that string must be used as the new |
- * content attribute value." |
- * |
- * TODO: Check this: |
- * |
- * "Except where otherwise specified, if an IDL attribute that is a |
- * floating point number type (double) is assigned an Infinity or |
- * Not-a-Number (NaN) value, a NOT_SUPPORTED_ERR exception must be raised." |
- * |
- * TODO: Implement the actual algorithm so we can run lots more tests. For |
- * now we're stuck with manually setting up expected values. Of course, |
- * a lot of care has to be taken in checking equality for floats . . . |
- * maybe we should have some tolerance for comparing them. I'm not even |
- * sure whether setting the content attribute to 0 should return 0.0 or |
- * -0.0 (the former, I hope). |
- */ |
- "double": { |
- "jsType": "number", |
- "defaultVal": 0.0, |
- "domTests": [minInt - 1, minInt, -36, -1, 0, 1, maxInt, |
- maxInt + 1, maxUnsigned, maxUnsigned + 1, "", |
- "\u00097", "\u000B7", "\u000C7", "\u00207", "\u00A07", "\uFEFF7", |
- "\u000A7", "\u000D7", "\u20287", "\u20297", "\u16807", "\u180E7", |
- "\u20007", "\u20017", "\u20027", "\u20037", "\u20047", "\u20057", |
- "\u20067", "\u20077", "\u20087", "\u20097", "\u200A7", "\u202F7", |
- "\u30007", |
- " " + binaryString + " foo ", undefined, 1.5, true, false, |
- {"test": 6}, NaN, +Infinity, -Infinity, "\0", |
- {toString:function() {return 2;}, valueOf: null}, |
- {valueOf:function() {return 3;}}], |
- "domExpected": [minInt - 1, minInt, -36, -1, 0, 1, maxInt, |
- maxInt + 1, maxUnsigned, maxUnsigned + 1, null, |
- // Leading whitespace tests |
- 7, null, 7, 7, null, null, |
- 7, 7, null, null, null, null, |
- null, null, null, null, null, null, |
- null, null, null, null, null, null, |
- null, |
- // End leading whitespace tests |
- null, null, 1.5, null, null, |
- null, null, null, null, null, |
- 2, 3], |
- // I checked that ES ToString is well-defined for all of these (I |
- // think). Yes, String(-0) == "0". |
- "idlTests": [ -10000000000, -1, -0, 0, 1, 10000000000], |
- "idlDomExpected": ["-10000000000", "-1", "0", "0", "1", "10000000000"], |
- "idlIdlExpected": [ -10000000000, -1, -0, 0, 1, 10000000000] |
- } |
-}; |
- |
-for (var type in ReflectionTests.typeMap) { |
- var props = ReflectionTests.typeMap[type]; |
- var cast = window[props.jsType[0].toUpperCase() + props.jsType.slice(1)]; |
- if (props.domExpected === undefined) { |
- props.domExpected = props.domTests.map(cast); |
- } else if (typeof props.domExpected == "function") { |
- props.domExpected = props.domTests.map(props.domExpected); |
- } |
- if (props.idlTests === undefined) { |
- props.idlTests = props.domTests; |
- } |
- if (props.idlDomExpected === undefined) { |
- props.idlDomExpected = props.idlTests.map(cast); |
- } else if (typeof props.idlDomExpected == "function") { |
- props.idlDomExpected = props.idlTests.map(props.idlDomExpected); |
- } |
- if (props.idlIdlExpected === undefined) { |
- props.idlIdlExpected = props.idlDomExpected; |
- } else if (typeof props.idlIdlExpected == "function") { |
- props.idlIdlExpected = props.idlTests.map(props.idlIdlExpected); |
- } |
-} |
- |
-/** |
- * Tests that the JavaScript attribute named idlName on the object idlObj |
- * reflects the DOM attribute named domName on domObj. The data argument is an |
- * object that must contain at least one key, "type", which contains the |
- * expected type of the IDL attribute ("string", "enum", etc.). The "comment" |
- * key will add a parenthesized comment in the type info if there's a test |
- * failure, to indicate that there's something special about the element you're |
- * testing (like it has an attribute set to some value). Other keys in the |
- * data object are type-specific, e.g., "defaultVal" for numeric types. If the |
- * data object is a string, it's converted to {"type": data}. If idlObj is a |
- * string, we set idlObj = domObj = document.createElement(idlObj). |
- */ |
-ReflectionTests.reflects = function(data, idlName, idlObj, domName, domObj) { |
- // Do some setup first so that getTypeDescription() works in testWrapper() |
- if (typeof data == "string") { |
- data = {type: data}; |
- } |
- if (domName === undefined) { |
- domName = idlName; |
- } |
- if (typeof idlObj == "string") { |
- idlObj = document.createElement(idlObj); |
- } |
- if (domObj === undefined) { |
- domObj = idlObj; |
- } |
- |
- // Note: probably a hack? This kind of assumes that the variables here |
- // won't change over the course of the tests, which is wrong, but it's |
- // probably safe enough. Just don't read stuff that will change. |
- ReflectionHarness.currentTestInfo = {data: data, idlName: idlName, idlObj: idlObj, domName: domName, domObj: domObj}; |
- |
- ReflectionHarness.testWrapper(function() { |
- ReflectionTests.doReflects(data, idlName, idlObj, domName, domObj); |
- }); |
-}; |
- |
-/** |
- * Actual implementation of the above. |
- */ |
-ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) { |
- // If we don't recognize the type, testing is impossible. |
- if (this.typeMap[data.type] === undefined) { |
- if (unimplemented.indexOf(data.type) == -1) { |
- unimplemented.push(data.type); |
- } |
- return; |
- } |
- |
- var typeInfo = this.typeMap[data.type]; |
- |
- if (typeof data.isNullable == "undefined") { |
- data.isNullable = false; |
- } |
- |
- // Test that typeof idlObj[idlName] is correct. If not, further tests are |
- // probably pointless, so bail out. |
- var isDefaultValueNull = data.isNullable && data.defaultVal === null; |
- if (!ReflectionHarness.test(typeof idlObj[idlName], isDefaultValueNull ? "object" : typeInfo.jsType, "typeof IDL attribute")) { |
- return; |
- } |
- |
- // Test default |
- var defaultVal = data.defaultVal; |
- if (defaultVal === undefined) { |
- defaultVal = typeInfo.defaultVal; |
- } |
- if (defaultVal !== null || data.isNullable) { |
- ReflectionHarness.test(idlObj[idlName], defaultVal, "IDL get with DOM attribute unset"); |
- } |
- |
- var domTests = typeInfo.domTests.slice(0); |
- var domExpected = typeInfo.domExpected.map(function(val) { return val === null ? defaultVal : val; }); |
- var idlTests = typeInfo.idlTests.slice(0); |
- var idlDomExpected = typeInfo.idlDomExpected.map(function(val) { return val === null ? defaultVal : val; }); |
- var idlIdlExpected = typeInfo.idlIdlExpected.map(function(val) { return val === null ? defaultVal : val; }); |
- switch (data.type) { |
- // Extra tests and other special-casing |
- case "boolean": |
- domTests.push(domName); |
- domExpected.push(true); |
- break; |
- |
- case "enum": |
- // Whee, enum is complicated. |
- if (typeof data.invalidVal == "undefined") { |
- data.invalidVal = defaultVal; |
- } |
- if (typeof data.nonCanon == "undefined") { |
- data.nonCanon = {}; |
- } |
- for (var i = 0; i < data.keywords.length; i++) { |
- if (data.keywords[i] != "") { |
- domTests.push(data.keywords[i], "x" + data.keywords[i], data.keywords[i] + "\0"); |
- idlTests.push(data.keywords[i], "x" + data.keywords[i], data.keywords[i] + "\0"); |
- } |
- |
- if (data.keywords[i].length > 1) { |
- domTests.push(data.keywords[i].slice(1)); |
- idlTests.push(data.keywords[i].slice(1)); |
- } |
- |
- if (data.keywords[i] != data.keywords[i].toLowerCase()) { |
- domTests.push(data.keywords[i].toLowerCase()); |
- idlTests.push(data.keywords[i].toLowerCase()); |
- } |
- if (data.keywords[i] != data.keywords[i].toUpperCase()) { |
- domTests.push(data.keywords[i].toUpperCase()); |
- idlTests.push(data.keywords[i].toUpperCase()); |
- } |
- } |
- |
- // Per spec, the expected DOM values are the same as the value we set |
- // it to. |
- if (!data.isNullable) { |
- idlDomExpected = idlTests.slice(0); |
- } else { |
- idlDomExpected = []; |
- for (var i = 0; i < idlTests.length; i++) { |
- idlDomExpected.push((idlTests[i] === null || idlTests[i] === undefined) ? null : idlTests[i]); |
- } |
- } |
- |
- // Now we have the fun of calculating what the expected IDL values are. |
- domExpected = []; |
- idlIdlExpected = []; |
- for (var i = 0; i < domTests.length; i++) { |
- domExpected.push(this.enumExpected(data.keywords, data.nonCanon, data.invalidVal, domTests[i])); |
- } |
- for (var i = 0; i < idlTests.length; i++) { |
- if (data.isNullable && (idlTests[i] === null || idlTests[i] === undefined)) { |
- idlIdlExpected.push(null); |
- } else { |
- idlIdlExpected.push(this.enumExpected(data.keywords, data.nonCanon, data.invalidVal, idlTests[i])); |
- } |
- } |
- break; |
- |
- case "string": |
- if ("treatNullAsEmptyString" in data) { |
- for (var i = 0; i < idlTests.length; i++) { |
- if (idlTests[i] === null) { |
- idlDomExpected[i] = idlIdlExpected[i] = ""; |
- } |
- } |
- } |
- break; |
- } |
- if (domObj.tagName.toLowerCase() == "canvas" && (domName == "width" || domName == "height")) { |
- // Opera tries to allocate a canvas with the given width and height, so |
- // it OOMs when given excessive sizes. This is permissible under the |
- // hardware-limitations clause, so cut out those checks. TODO: Must be |
- // a way to make this more succinct. |
- domTests = domTests.filter(function(element, index, array) { return domExpected[index] < 1000; }); |
- domExpected = domExpected.filter(function(element, index, array) { return element < 1000; }); |
- idlTests = idlTests.filter(function(element, index, array) { return idlIdlExpected[index] < 1000; }); |
- idlDomExpected = idlDomExpected.filter(function(element, index, array) { return idlIdlExpected[index] < 1000; }); |
- idlIdlExpected = idlIdlExpected.filter(function(element, index, array) { return idlIdlExpected[index] < 1000; }); |
- } |
- |
- if (!data.customGetter) { |
- for (var i = 0; i < domTests.length; i++) { |
- if (domExpected[i] === null && !data.isNullable) { |
- // If you follow all the complicated logic here, you'll find that |
- // this will only happen if there's no expected value at all (like |
- // for tabIndex, where the default is too complicated). So skip |
- // the test. |
- continue; |
- } |
- try { |
- domObj.setAttribute(domName, domTests[i]); |
- ReflectionHarness.test(domObj.getAttribute(domName), String(domTests[i]), "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by getAttribute()"); |
- ReflectionHarness.test(idlObj[idlName], domExpected[i], "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by IDL get"); |
- if (ReflectionHarness.catchUnexpectedExceptions) { |
- ReflectionHarness.success(); |
- } |
- } catch (err) { |
- if (ReflectionHarness.catchUnexpectedExceptions) { |
- ReflectionHarness.failure("Exception thrown during tests with setAttribute() to " + ReflectionHarness.stringRep(domTests[i])); |
- } else { |
- throw err; |
- } |
- } |
- } |
- } |
- |
- for (var i = 0; i < idlTests.length; i++) { |
- if ((data.type == "limited long" && idlTests[i] < 0) || |
- (data.type == "limited unsigned long" && idlTests[i] == 0)) { |
- ReflectionHarness.testException("INDEX_SIZE_ERR", function() { |
- idlObj[idlName] = idlTests[i]; |
- }, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " must throw INDEX_SIZE_ERR"); |
- } else { |
- ReflectionHarness.run(function() { |
- idlObj[idlName] = idlTests[i]; |
- if (data.type == "boolean") { |
- // Special case yay |
- ReflectionHarness.test(domObj.hasAttribute(domName), Boolean(idlTests[i]), "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by hasAttribute()"); |
- } else if (idlDomExpected[i] !== null || data.isNullable) { |
- var expected = idlDomExpected[i] + ""; |
- if (data.isNullable && idlDomExpected[i] === null) { |
- expected = null; |
- } |
- ReflectionHarness.test(domObj.getAttribute(domName), expected, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by getAttribute()"); |
- } |
- if (idlIdlExpected[i] !== null || data.isNullable) { |
- ReflectionHarness.test(idlObj[idlName], idlIdlExpected[i], "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by IDL get"); |
- } |
- if (ReflectionHarness.catchUnexpectedExceptions) { |
- ReflectionHarness.success(); |
- } |
- }, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " should not throw"); |
- } |
- } |
-}; |
- |
-/** |
- * If we have an enumerated attribute limited to the array of values in |
- * keywords, with nonCanon being a map of non-canonical values to their |
- * canonical equivalents, and invalidVal being the invalid value default (or "" |
- * for none), then what would we expect from an IDL get if the content |
- * attribute is equal to contentVal? |
- */ |
-ReflectionTests.enumExpected = function(keywords, nonCanon, invalidVal, contentVal) { |
- var ret = invalidVal; |
- for (var i = 0; i < keywords.length; i++) { |
- if (String(contentVal).toLowerCase() == keywords[i].toLowerCase()) { |
- ret = keywords[i]; |
- break; |
- } |
- } |
- if (typeof nonCanon[ret] != "undefined") { |
- return nonCanon[ret]; |
- } |
- return ret; |
-}; |
- |
-/** |
- * Now we have the data structures that tell us which elements have which |
- * attributes. |
- * |
- * The elements object (which must have been defined in earlier files) is a map |
- * from element name to an object whose keys are IDL attribute names and whose |
- * values are types. A type is of the same format as |
- * ReflectionTests.reflects() accepts, except that there's an extra optional |
- * domAttrName key that gets passed as the fourth argument to reflects() if |
- * it's provided. (TODO: drop the fourth and fifth reflects() arguments and |
- * make it take them from the dictionary instead?) |
- */ |
- |
-// Now we actually run all the tests. |
-var unimplemented = []; |
-for (var element in elements) { |
- ReflectionTests.reflects("string", "title", element); |
- ReflectionTests.reflects("string", "lang", element); |
- ReflectionTests.reflects({type: "enum", keywords: ["ltr", "rtl", "auto"]}, "dir", element); |
- ReflectionTests.reflects("string", "className", element, "class"); |
- ReflectionTests.reflects("tokenlist", "classList", element, "class"); |
- ReflectionTests.reflects("boolean", "hidden", element); |
- ReflectionTests.reflects("string", "accessKey", element); |
- // Don't try to test the defaultVal -- it should be either 0 or -1, but the |
- // rules are complicated, and a lot of them are SHOULDs. |
- ReflectionTests.reflects({type: "long", defaultVal: null}, "tabIndex", element); |
- // TODO: classList, contextMenu, itemProp, itemRef, dropzone (require |
- // tokenlist support) |
- |
- for (var idlAttrName in elements[element]) { |
- var type = elements[element][idlAttrName]; |
- ReflectionTests.reflects(type, idlAttrName, element, |
- typeof type == "object" && "domAttrName" in type ? type.domAttrName : idlAttrName); |
- } |
-} |
- |
-for (var i = 0; i < extraTests.length; i++) { |
- extraTests[i](); |
-} |
- |
-var time = document.getElementById("time"); |
-if (time) { |
- time.innerHTML = (new Date().getTime() - ReflectionTests.start)/1000; |
-} |
- |
-if (unimplemented.length) { |
- var p = document.createElement("p"); |
- p.textContent = "(Note: missing tests for types " + unimplemented.join(", ") + ".)"; |
- document.body.appendChild(p); |
-} |