diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /testing/web-platform/tests/html/webappapis | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'testing/web-platform/tests/html/webappapis')
110 files changed, 3330 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/webappapis/.gitkeep b/testing/web-platform/tests/html/webappapis/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/callback-exception.html b/testing/web-platform/tests/html/webappapis/animation-frames/callback-exception.html new file mode 100644 index 000000000..3867f0c41 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/callback-exception.html @@ -0,0 +1,27 @@ +<!doctype html> +<html> + <head> + <title>requestAnimationFrame callback exception reported to error handler</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <link rel="help" href="https://w3c.github.io/web-performance/specs/RequestAnimationFrame/Overview.html#dom-windowanimationtiming-requestanimationframe"/> + </head> + <body> + <div id="log"></div> + <script> + var custom_exception = 'requestAnimationFrameException'; + setup({allow_uncaught_exception : true}); + async_test(function (t) { + addEventListener("error",function(e) { + t.step(function() { + assert_equals(e.error.message, custom_exception); + t.done(); + }) + }); + window.requestAnimationFrame(function () { + throw new Error(custom_exception); + }); + }, "requestAnimationFrame callback exceptions are reported to error handler"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/callback-invoked.html b/testing/web-platform/tests/html/webappapis/animation-frames/callback-invoked.html new file mode 100644 index 000000000..ca34e455a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/callback-invoked.html @@ -0,0 +1,18 @@ +<!doctype html> +<html> + <head> + <title>requestAnimationFrame must be triggered once</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <link rel="help" href="https://w3c.github.io/web-performance/specs/RequestAnimationFrame/Overview.html#dom-windowanimationtiming-requestanimationframe"/> + </head> + <body> + <div id="log"></div> + <script> + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + window.requestAnimationFrame(t.step_func_done()); + }, "requestAnimationFrame callback is invoked at least once before the timeout"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/callback-multicalls.html b/testing/web-platform/tests/html/webappapis/animation-frames/callback-multicalls.html new file mode 100644 index 000000000..38f34171e --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/callback-multicalls.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>AnimationTiming Test: multiple calls to requestAnimationFrame with the same callback</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-window-requestanimationframe"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + + async_test(function(t) { + var counter = 0; + window.requestAnimationFrame(callback); + + function callback() { + ++counter; + if (counter == 2) { + t.done(); + } else { + window.requestAnimationFrame(callback); + } + }; + + }, "Check that multiple calls to requestAnimationFrame with the same callback will result in multiple entries being in the list with that same callback."); + +</script> diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/cancel-invoked.html b/testing/web-platform/tests/html/webappapis/animation-frames/cancel-invoked.html new file mode 100644 index 000000000..d075c0fda --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/cancel-invoked.html @@ -0,0 +1,18 @@ +<!doctype html> +<html> + <head> + <title>cancelAnimationFrame does nothing</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <link rel="help" href="https://w3c.github.io/web-performance/specs/RequestAnimationFrame/Overview.html#dom-windowanimationtiming-cancelanimationframe"/> + </head> + <body> + <div id="log"></div> + <script> + test(function (t) { + window.cancelAnimationFrame(42); + assert_true(true); + }, "cancelAnimationFrame does nothing if there is no callback with the given handle"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/idlharness.html b/testing/web-platform/tests/html/webappapis/animation-frames/idlharness.html new file mode 100644 index 000000000..acc6657fa --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/idlharness.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8" /> +<title>idlharness test</title> +<link rel="author" title="Kensaku Komatsu" href="mailto:kensaku.komatsu@gmail.com" /> +<link rel="help" href="http://www.w3.org/TR/animation-timing/#definitions"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> +</head> +<body> +<h1>idlharness test</h1> +<p>This test validates the WebIDL included in the Timing control for script-based animations specification.</p> + +<pre id='untested_idl' style='display:none'> +[PrimaryGlobal] +interface Window { +}; +</pre> + +<pre id='idl'> +partial interface Window { + long requestAnimationFrame(FrameRequestCallback callback); + void cancelAnimationFrame(long handle); +}; + +callback FrameRequestCallback = void (DOMHighResTimeStamp time); +</pre> + +<script> + +(function() { + var idl_array = new IdlArray(); + + idl_array.add_untested_idls(document.getElementById("untested_idl").textContent); + idl_array.add_idls(document.getElementById("idl").textContent); + + idl_array.add_objects({Window: ["window"]}); + + idl_array.test(); +})(); + +</script> + +<div id="log"></div> + +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/animation-frames/same-dispatch-time.html b/testing/web-platform/tests/html/webappapis/animation-frames/same-dispatch-time.html new file mode 100644 index 000000000..e92eb61e9 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/animation-frames/same-dispatch-time.html @@ -0,0 +1,31 @@ +<!doctype html> +<html> + <head> + <title>requestAnimationFrame in queue get the same timestamp</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <link rel="help" href="http://w3c.github.io/animation-timing/#dfn-invoke-callbacks-algorithm"/> + </head> + <body> + <div id="log"></div> + <script> + test(function (t) { + var a = 0, b = 0; + + /* REASONING: + * These two methods that will be called with a timestamp. Because + * they execute right after eachother, they're added to the same + * queue and SHOULD be timestamped with the same value. + */ + window.requestAnimationFrame(function() { a = arguments[0]; }); + window.requestAnimationFrame(function() { b = arguments[0]; }); + + setTimeout(function() { + assert_true(a != 0); + assert_true(b != 0); + assert_true(a == b); + }, 100); + }, "requestAnimationFrame will timestamp events in the same queue with the same time"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/atob/.gitkeep b/testing/web-platform/tests/html/webappapis/atob/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/atob/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/atob/base64.html b/testing/web-platform/tests/html/webappapis/atob/base64.html new file mode 100644 index 000000000..c33ab228f --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/atob/base64.html @@ -0,0 +1,306 @@ +<!doctype html> +<!-- Originally developed by Aryeh Gregor, funded by Google. Copyright belongs +to Google. --> +<title>atob()/btoa() tests</title> +<meta charset=utf-8> +<div id=log></div> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +/** + * btoa() as defined by the HTML5 spec, which mostly just references RFC4648. + */ +function mybtoa(s) { + // String conversion as required by WebIDL. + s = String(s); + + // "The btoa() method must throw an INVALID_CHARACTER_ERR exception if the + // method's first argument contains any character whose code point is + // greater than U+00FF." + for (var i = 0; i < s.length; i++) { + if (s.charCodeAt(i) > 255) { + return "INVALID_CHARACTER_ERR"; + } + } + + var out = ""; + for (var i = 0; i < s.length; i += 3) { + var groupsOfSix = [undefined, undefined, undefined, undefined]; + groupsOfSix[0] = s.charCodeAt(i) >> 2; + groupsOfSix[1] = (s.charCodeAt(i) & 0x03) << 4; + if (s.length > i + 1) { + groupsOfSix[1] |= s.charCodeAt(i + 1) >> 4; + groupsOfSix[2] = (s.charCodeAt(i + 1) & 0x0f) << 2; + } + if (s.length > i + 2) { + groupsOfSix[2] |= s.charCodeAt(i + 2) >> 6; + groupsOfSix[3] = s.charCodeAt(i + 2) & 0x3f; + } + for (var j = 0; j < groupsOfSix.length; j++) { + if (typeof groupsOfSix[j] == "undefined") { + out += "="; + } else { + out += btoaLookup(groupsOfSix[j]); + } + } + } + return out; +} + +/** + * Lookup table for mybtoa(), which converts a six-bit number into the + * corresponding ASCII character. + */ +function btoaLookup(idx) { + if (idx < 26) { + return String.fromCharCode(idx + 'A'.charCodeAt(0)); + } + if (idx < 52) { + return String.fromCharCode(idx - 26 + 'a'.charCodeAt(0)); + } + if (idx < 62) { + return String.fromCharCode(idx - 52 + '0'.charCodeAt(0)); + } + if (idx == 62) { + return '+'; + } + if (idx == 63) { + return '/'; + } + // Throw INVALID_CHARACTER_ERR exception here -- won't be hit in the tests. +} + +/** + * Implementation of atob() according to the HTML spec, except that instead of + * throwing INVALID_CHARACTER_ERR we return null. + */ +function myatob(input) { + // WebIDL requires DOMStrings to just be converted using ECMAScript + // ToString, which in our case amounts to calling String(). + input = String(input); + + // "Remove all space characters from input." + input = input.replace(/[ \t\n\f\r]/g, ""); + + // "If the length of input divides by 4 leaving no remainder, then: if + // input ends with one or two U+003D EQUALS SIGN (=) characters, remove + // them from input." + if (input.length % 4 == 0 && /==?$/.test(input)) { + input = input.replace(/==?$/, ""); + } + + // "If the length of input divides by 4 leaving a remainder of 1, throw an + // INVALID_CHARACTER_ERR exception and abort these steps." + // + // "If input contains a character that is not in the following list of + // characters and character ranges, throw an INVALID_CHARACTER_ERR + // exception and abort these steps: + // + // U+002B PLUS SIGN (+) + // U+002F SOLIDUS (/) + // U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9) + // U+0041 LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z + // U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z" + if (input.length % 4 == 1 + || !/^[+/0-9A-Za-z]*$/.test(input)) { + return null; + } + + // "Let output be a string, initially empty." + var output = ""; + + // "Let buffer be a buffer that can have bits appended to it, initially + // empty." + // + // We append bits via left-shift and or. accumulatedBits is used to track + // when we've gotten to 24 bits. + var buffer = 0; + var accumulatedBits = 0; + + // "While position does not point past the end of input, run these + // substeps:" + for (var i = 0; i < input.length; i++) { + // "Find the character pointed to by position in the first column of + // the following table. Let n be the number given in the second cell of + // the same row." + // + // "Append to buffer the six bits corresponding to number, most + // significant bit first." + // + // atobLookup() implements the table from the spec. + buffer <<= 6; + buffer |= atobLookup(input[i]); + + // "If buffer has accumulated 24 bits, interpret them as three 8-bit + // big-endian numbers. Append the three characters with code points + // equal to those numbers to output, in the same order, and then empty + // buffer." + accumulatedBits += 6; + if (accumulatedBits == 24) { + output += String.fromCharCode((buffer & 0xff0000) >> 16); + output += String.fromCharCode((buffer & 0xff00) >> 8); + output += String.fromCharCode(buffer & 0xff); + buffer = accumulatedBits = 0; + } + + // "Advance position by one character." + } + + // "If buffer is not empty, it contains either 12 or 18 bits. If it + // contains 12 bits, discard the last four and interpret the remaining + // eight as an 8-bit big-endian number. If it contains 18 bits, discard the + // last two and interpret the remaining 16 as two 8-bit big-endian numbers. + // Append the one or two characters with code points equal to those one or + // two numbers to output, in the same order." + if (accumulatedBits == 12) { + buffer >>= 4; + output += String.fromCharCode(buffer); + } else if (accumulatedBits == 18) { + buffer >>= 2; + output += String.fromCharCode((buffer & 0xff00) >> 8); + output += String.fromCharCode(buffer & 0xff); + } + + // "Return output." + return output; +} + +/** + * A lookup table for atob(), which converts an ASCII character to the + * corresponding six-bit number. + */ +function atobLookup(chr) { + if (/[A-Z]/.test(chr)) { + return chr.charCodeAt(0) - "A".charCodeAt(0); + } + if (/[a-z]/.test(chr)) { + return chr.charCodeAt(0) - "a".charCodeAt(0) + 26; + } + if (/[0-9]/.test(chr)) { + return chr.charCodeAt(0) - "0".charCodeAt(0) + 52; + } + if (chr == "+") { + return 62; + } + if (chr == "/") { + return 63; + } + // Throw exception; should not be hit in tests +} + +function btoaException(input) { + input = String(input); + for (var i = 0; i < input.length; i++) { + if (input.charCodeAt(i) > 255) { + return true; + } + } + return false; +} + +function testBtoa(input) { + // "The btoa() method must throw an INVALID_CHARACTER_ERR exception if the + // method's first argument contains any character whose code point is + // greater than U+00FF." + var normalizedInput = String(input); + for (var i = 0; i < normalizedInput.length; i++) { + if (normalizedInput.charCodeAt(i) > 255) { + assert_throws("InvalidCharacterError", function() { btoa(input); }, + "Code unit " + i + " has value " + normalizedInput.charCodeAt(i) + ", which is greater than 255"); + return; + } + } + assert_equals(btoa(input), mybtoa(input)); + assert_equals(atob(btoa(input)), String(input), "atob(btoa(input)) must be the same as String(input)"); +} + +var tests = ["עברית", "", "ab", "abc", "abcd", "abcde", + // This one is thrown in because IE9 seems to fail atob(btoa()) on it. Or + // possibly to fail btoa(). I actually can't tell what's happening here, + // but it doesn't hurt. + "\xff\xff\xc0", + // Is your DOM implementation binary-safe? + "\0a", "a\0b", + // WebIDL tests. + undefined, null, 7, 12, 1.5, true, false, NaN, +Infinity, -Infinity, 0, -0, + {toString: function() { return "foo" }}, +]; +for (var i = 0; i < 258; i++) { + tests.push(String.fromCharCode(i)); +} +tests.push(String.fromCharCode(10000)); +tests.push(String.fromCharCode(65534)); +tests.push(String.fromCharCode(65535)); + +// This is supposed to be U+10000. +tests.push(String.fromCharCode(0xd800, 0xdc00)); +tests = tests.map( + function(elem) { + var expected = mybtoa(elem); + if (expected === "INVALID_CHARACTER_ERR") { + return ["btoa(" + format_value(elem) + ") must raise INVALID_CHARACTER_ERR", elem]; + } + return ["btoa(" + format_value(elem) + ") == " + format_value(mybtoa(elem)), elem]; + } +); + +var everything = ""; +for (var i = 0; i < 256; i++) { + everything += String.fromCharCode(i); +} +tests.push(["btoa(first 256 code points concatenated)", everything]); + +generate_tests(testBtoa, tests); + +function testAtob(input) { + var expected = myatob(input); + if (expected === null) { + assert_throws("InvalidCharacterError", function() { atob(input) }); + return; + } + + assert_equals(atob(input), expected); +} + +var tests = ["", "abcd", " abcd", "abcd ", " abcd===", "abcd=== ", + "abcd ===", "a", "ab", "abc", "abcde", String.fromCharCode(0xd800, 0xdc00), + "=", "==", "===", "====", "=====", + "a=", "a==", "a===", "a====", "a=====", + "ab=", "ab==", "ab===", "ab====", "ab=====", + "abc=", "abc==", "abc===", "abc====", "abc=====", + "abcd=", "abcd==", "abcd===", "abcd====", "abcd=====", + "abcde=", "abcde==", "abcde===", "abcde====", "abcde=====", + "=a", "=a=", "a=b", "a=b=", "ab=c", "ab=c=", "abc=d", "abc=d=", + // With whitespace + "ab\tcd", "ab\ncd", "ab\fcd", "ab\rcd", "ab cd", "ab\u00a0cd", + "ab\t\n\f\r cd", " \t\n\f\r ab\t\n\f\r cd\t\n\f\r ", + "ab\t\n\f\r =\t\n\f\r =\t\n\f\r ", + // Test if any bits are set at the end. These should all be fine, since + // they end with A, which becomes 0: + "A", "/A", "//A", "///A", "////A", + // These are all bad, since they end in / (= 63, all bits set) but their + // length isn't a multiple of four characters, so they can't be output by + // btoa(). Thus one might expect some UAs to throw exceptions or otherwise + // object, since they could never be output by btoa(), so they're good to + // test. + "/", "A/", "AA/", "AAAA/", + // But this one is possible: + "AAA/", + // Binary-safety tests + "\0nonsense", "abcd\0nonsense", + // WebIDL tests + undefined, null, 7, 12, 1.5, true, false, NaN, +Infinity, -Infinity, 0, -0, + {toString: function() { return "foo" }}, + {toString: function() { return "abcd" }}, +]; +tests = tests.map( + function(elem) { + if (myatob(elem) === null) { + return ["atob(" + format_value(elem) + ") must raise InvalidCharacterError", elem]; + } + return ["atob(" + format_value(elem) + ") == " + format_value(myatob(elem)), elem]; + } +); + +generate_tests(testAtob, tests); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html new file mode 100644 index 000000000..fecda221d --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html @@ -0,0 +1,22 @@ +<!doctype html> +<meta charset=utf-8> +<title>requestIdleCallback callback exception reported to error handler</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<script> + var custom_exception = 'requestIdleCallbackException'; + setup({allow_uncaught_exception : true}); + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + addEventListener("error",function(e) { + t.step(function() { + assert_equals(e.error.message, custom_exception); + t.done(); + }) + }); + window.requestIdleCallback(function () { + throw new Error(custom_exception); + }); + }, "requestIdleCallback callback exceptions are reported to error handler"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html new file mode 100644 index 000000000..965941be1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html @@ -0,0 +1,17 @@ +<!doctype html> +<meta charset=utf-8> +<title></title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<iframe style="display:none" id="frame"></iframe> +<script> + async_test(function (t) { + let frame = document.getElementById("frame"); + frame.contentWindow.test = function() { + frame.contentWindow.requestIdleCallback(t.step_func_done()); + } + + frame.contentWindow.test(); + }); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html new file mode 100644 index 000000000..5e799cf39 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html @@ -0,0 +1,12 @@ +<!doctype html> +<meta charset=utf-8> +<title>requestIdleCallback callback must be called eventually</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<script> + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + window.requestIdleCallback(t.step_func_done()); + }, "requestIdleCallback callback is invoked at least once before the timeout"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html new file mode 100644 index 000000000..8584c71da --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html @@ -0,0 +1,41 @@ +<!doctype html> +<meta charset=utf-8> +<title>multiple calls to requestIdleCallback</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<script> + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + var counter = 0; + function f(c) { + assert_equals(counter, c); + if (counter === 99) { + t.done(); + } + + ++counter; + } + for (var i = 0; i < 100; ++i) { + let j = i; + window.requestIdleCallback(t.step_func(function () { f(j) })); + } + }, "requestIdleCallback callbacks should be invoked in order (called iteratively)"); + + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + var counter = 0; + + function f(c) { + assert_equals(counter, c); + if (counter === 99) { + t.done(); + } + + ++counter; + window.requestIdleCallback(t.step_func(function () { f(c + 1) })); + } + + window.requestIdleCallback(t.step_func(function () { f(0) })); + }, "requestIdleCallback callbacks should be invoked in order (called recursively)"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html new file mode 100644 index 000000000..823d5f5db --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html @@ -0,0 +1,28 @@ +<!doctype html> +<meta charset=utf-8> +<title>requestIdleCallback timeout callback must be called with didTimeout equal to true</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<script> + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + var counter = 0; + + function g(deadline) { + assert_true(deadline.didTimeout) + t.done(); + } + + function f(deadline) { + assert_false(deadline.didTimeout); + window.requestIdleCallback(t.step_func(g), {timeout:300}); + + var d = Date.now() + 500; + while (Date.now() < d) { + + } + } + window.requestIdleCallback(t.step_func(f)); + }, "requestIdleCallback callback should time out"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html new file mode 100644 index 000000000..8956b8709 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html @@ -0,0 +1,26 @@ +<!doctype html> +<meta charset=utf-8> +<title>cancelling idle requests</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<div id="log"></div> +<script> + test(function (t) { + window.cancelIdleCallback(42); + assert_true(true); + }, "cancelIdleCallback does nothing if there is no callback with the given handle"); + + async_test(function (t) { + assert_false(document.hidden, "document.hidden must exist and be false to run this test properly"); + var neverCalled = true; + var handle = window.requestIdleCallback(function () { + neverCalled = false; + }); + window.cancelIdleCallback(handle); + + t.step_timeout(function() { + assert_true(neverCalled); + t.done(); + }, 2000); + }, "A cancelled callback is never invoked"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html b/testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html new file mode 100644 index 000000000..6033535f3 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html @@ -0,0 +1,34 @@ +<!doctype html> +<meta charset=utf-8> +<title>idlharness test</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> + +<pre id='untested_idl' style='display:none'> +[PrimaryGlobal] +interface Window { +}; +</pre> + +<pre id='idl'> +partial interface Window { + unsigned long requestIdleCallback(IdleRequestCallback callback, + optional IdleRequestOptions options); + void cancelIdleCallback(unsigned long handle); +}; + +dictionary IdleRequestOptions { + unsigned long timeout; +}; + +callback IdleRequestCallback = void (IdleDeadline deadline); +</pre> +<script> + var idl_array = new IdlArray(); + idl_array.add_untested_idls(document.getElementById("untested_idl").textContent); + idl_array.add_idls(document.getElementById("idl").textContent); + idl_array.add_objects({Window: ["window"]}); + idl_array.test(); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/enabling-and-disabling-scripting/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/enabling-and-disabling-scripting/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/enabling-and-disabling-scripting/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/event-loops/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/contains.json b/testing/web-platform/tests/html/webappapis/scripting/event-loops/contains.json new file mode 100644 index 000000000..5d7e5e600 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/contains.json @@ -0,0 +1,14 @@ +[ + { + "id": "definitions-1", + "original_id": "definitions-1" + }, + { + "id": "processing-model-3", + "original_id": "processing-model-3" + }, + { + "id": "generic-task-sources", + "original_id": "generic-task-sources" + } +]
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_raf.html b/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_raf.html new file mode 100644 index 000000000..824dbc4b9 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_raf.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<head> +<link rel=author title="Aleks Totic" href="mailto:atotic@chromium.org"> +<link rel=help href="https://html.spec.whatwg.org/#clean-up-after-running-script"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/common.js"></script> +</head> +<body style="height:2000px;"> +<script> +/* +promise 1, promise 2 execute immediately after rAF +promise 1 child executes immediately after promise 2. + +Relevant specs: + +https://html.spec.whatwg.org/#clean-up-after-running-script +If the JavaScript execution context stack is now empty, perform a microtask checkpoint. + +https://html.spec.whatwg.org/#perform-a-microtask-checkpoint +"perform a microtask checkpoint" runs in a loop until all microtasks have been delivered. +*/ + +var test = async_test("Microtask execute immediately after script"); + +window.requestAnimationFrame( function() { + var events = []; + + Promise.resolve() + .then(function() { + events.push("promise 1"); + return Promise.resolve(); + }) + .then(function() { + test.step(function() { + events.push("promise 1 child"); + assert_array_equals(events, ["promise 1", "promise 2", "promise 1 child"]); + test.done(); + }); + }); + Promise.resolve() + .then(function() { + events.push("promise 2"); + }); + + // Set up events that must be executed after Promise. + window.setTimeout(function() { + events.push('timeout'); + }, 0); + window.addEventListener('scroll', function() { + events.push('scroll'); + }); + window.scrollBy(0,10); + +}); +</script> +</body> diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_script.html b/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_script.html new file mode 100644 index 000000000..799a0de60 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/microtask_after_script.html @@ -0,0 +1,55 @@ +<!DOCTYPE html> +<head> +<link rel=author title="Aleks Totic" href="mailto:atotic@chromium.org"> +<link rel=help href="https://html.spec.whatwg.org/#clean-up-after-running-script"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/common.js"></script> +</head> +<body style="height:2000px;"> +<script> +/* +promise 1, promise 2 execute immediately after script tag +promise 1 child executes immediately after promise 2. + +Relevant specs: + +https://html.spec.whatwg.org/#clean-up-after-running-script +If the JavaScript execution context stack is now empty, perform a microtask checkpoint. + +https://html.spec.whatwg.org/#perform-a-microtask-checkpoint +"perform a microtask checkpoint" runs in a loop until all microtasks have been delivered. +*/ + +var test = async_test("Microtask immediately after script"); + +var events = []; + +Promise.resolve() +.then(function() { + events.push("promise 1"); + return Promise.resolve(); +}) +.then(function() { + test.step(function() { + events.push("promise 1 child"); + assert_array_equals(events, ["promise 1", "promise 2", "promise 1 child"]); + test.done(); + }); +}); +Promise.resolve() +.then(function() { + events.push("promise 2"); +}); + +// Set up events that must be executed after Promise. +window.setTimeout(function() { + events.push('timeout'); +}, 0); +window.addEventListener('scroll', function() { + events.push('scroll'); +}); +window.scrollBy(0,10); + +</script> +</body> diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/resources/common.js b/testing/web-platform/tests/html/webappapis/scripting/event-loops/resources/common.js new file mode 100644 index 000000000..e2279f93d --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/resources/common.js @@ -0,0 +1,20 @@ +// Helper for tests that just want to verify the ordering of a series of events. +// Usage: +// log_test(function(t, log) { +// log('first'); +// log('second'); +// }, ['first', 'second'], 'Ordinal numbers are ordinal'); + +function log_test(func, expected, description) { + async_test(function(t) { + var actual = []; + function log(entry) { + actual.push(entry); + if (expected.length <= actual.length) { + assert_array_equals(actual, expected); + t.done(); + } + } + func(t, t.step_func(log)); + }, description); +} diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering-manual.html b/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering-manual.html new file mode 100644 index 000000000..ed2f70e19 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering-manual.html @@ -0,0 +1,64 @@ +<!DOCTYPE html> +<title>Task and Microtask Ordering </title> +<link rel=author title="Joshua Bell" href="mailto:jsbell@google.com"> +<link rel=help href="https://html.spec.whatwg.org/multipage/#event-loops"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/common.js"></script> +<style> +.inner { padding: 46px; width: 0; margin: 0 auto; background: #d4d4d4; } +.outer { padding: 25px; width: 92px; background: #f1f1f1; } +</style> + +<p>Click on the inner box:</p> +<div class="outer"> + <div class="inner"></div> +</div> + +<script> + +// Based on: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ + +log_test(function(t, log) { + // Let's get hold of those elements + var outer = document.querySelector('.outer'); + var inner = document.querySelector('.inner'); + + // Let's listen for attribute changes on the + // outer element + new MutationObserver(function() { + log('mutate'); + }).observe(outer, { + attributes: true + }); + + // Here's a click listener... + function onClick() { + log('click'); + + setTimeout(function() { + log('timeout'); + }, 0); + + Promise.resolve().then(function() { + log('promise'); + }); + + outer.setAttribute('data-random', Math.random()); + } + + // ...which we'll attach to both elements + inner.addEventListener('click', onClick); + outer.addEventListener('click', onClick); +}, [ + 'click', + 'promise', + 'mutate', + 'click', + 'promise', + 'mutate', + 'timeout', + 'timeout' +], 'Level 1 bossfight (manual click)'); + +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering.html b/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering.html new file mode 100644 index 000000000..c14a043b6 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/event-loops/task_microtask_ordering.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<title>Task and Microtask Ordering </title> +<link rel=author title="Joshua Bell" href="mailto:jsbell@google.com"> +<link rel=help href="https://html.spec.whatwg.org/multipage/#event-loops"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/common.js"></script> + +<div class="outer"> + <div class="inner"></div> +</div> + +<script> + +// Based on: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ + +log_test(function(t, log) { + log('script start'); + + setTimeout(function() { + log('setTimeout'); + }, 0); + + Promise.resolve().then(function() { + log('promise1'); + }).then(function() { + log('promise2'); + }); + + log('script end'); +}, [ + 'script start', + 'script end', + 'promise1', + 'promise2', + 'setTimeout' +], 'Basic task and microtask ordering'); + +log_test(function(t, log) { + // Let's get hold of those elements + var outer = document.querySelector('.outer'); + var inner = document.querySelector('.inner'); + + // Let's listen for attribute changes on the + // outer element + new MutationObserver(function() { + log('mutate'); + }).observe(outer, { + attributes: true + }); + + // Here's a click listener... + function onClick() { + log('click'); + + setTimeout(function() { + log('timeout'); + }, 0); + + Promise.resolve().then(function() { + log('promise'); + }); + + outer.setAttribute('data-random', Math.random()); + } + + // ...which we'll attach to both elements + inner.addEventListener('click', onClick); + outer.addEventListener('click', onClick); + + // Note that this will behave differently than a real click, + // since the dispatch is synchronous and microtasks will not + // run between event bubbling steps. + inner.click(); +}, [ + 'click', + 'click', + 'promise', + 'mutate', + 'promise', + 'timeout', + 'timeout' +], 'Level 1 bossfight (synthetic click)'); + +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/events/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/body-onload.html b/testing/web-platform/tests/html/webappapis/scripting/events/body-onload.html new file mode 100644 index 000000000..1e43d1ccd --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/body-onload.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>HTMLBodyElement.onload</title> +<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"> +<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#handler-window-onload"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test("body.onload should set the window.onload handler") +window.onload = t.step_func(function() { + assert_unreached("This handler should be overwritten.") +}) +var b = document.createElement("body") +b.onload = t.step_func(function(e) { + assert_equals(e.currentTarget, window, + "The event should be fired at the window.") + t.done() +}) +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/contains.json b/testing/web-platform/tests/html/webappapis/scripting/events/contains.json new file mode 100644 index 000000000..65f3062d2 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/contains.json @@ -0,0 +1,18 @@ +[ + { + "id": "event-handler-attributes", + "original_id": "event-handler-attributes" + }, + { + "id": "event-handlers-on-elements-document-objects-and-window-objects", + "original_id": "event-handlers-on-elements,-document-objects,-and-window-objects" + }, + { + "id": "event-firing", + "original_id": "event-firing" + }, + { + "id": "events-and-the-window-object", + "original_id": "events-and-the-window-object" + } +]
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html new file mode 100644 index 000000000..1c87892cb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<title>HTMLBodyElement event handlers</title> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<body> +<script> +function f() { + return 0; +} + +var handlers = ['blur','error','focus','load','resize','scroll', + 'afterprint','beforeprint','beforeunload','hashchange', + 'languagechange','message','offline','online','pagehide', + 'pageshow','popstate','storage','unload']; +handlers.forEach(function(handler) { + test(function() { + document.body['on' + handler] = f; + assert_equals(window['on' + handler], f); + }, handler); +}); + +handlers.forEach(function(handler) { + document.body['on' + handler] = null; +}); + +handlers.forEach(function(handler) { + test(function() { + assert_equals(document.body['on' + handler], null); + assert_equals(window['on' + handler], null); + }, handler + " removal"); +}); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-javascript.html b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-javascript.html new file mode 100644 index 000000000..657a37839 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-javascript.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>Event handler with labels</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body onload="javascript: + for (var i = 0; i < 2; ++i) { + for (var j = 0; j < 2; ++j) { + t.step(function() { + assert_equals(i, 0); + assert_equals(j, 0); + }); + break javascript; + } + } + t.done(); +"> +<div id="log"></div> +<script> +var t = async_test("Event handlers starting with 'javascript:' should treat that as a label."); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-onresize.html b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-onresize.html new file mode 100644 index 000000000..8686716e1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-onresize.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>HTMLBodyElement.onresize</title> +<link rel="author" title="His-Name-Is-Joof" href="mailto:jeffrharrison@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#handler-window-onresize"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test("body.onresize should set the window.onload handler") +window.onresize = t.step_func(function() { + assert_unreached("This handler should be overwritten.") +}) + +var body = document.createElement("body") +body.onresize = t.step_func(function(e) { + assert_equals(e.currentTarget, window, + "The event should be fired at the window.") + t.done() +}) +window.dispatchEvent(new Event('resize')); + +t = async_test("document.onresize should set the document.onresize handler"); +document.onresize = t.step_func(function(e) { + assert_equals(e.currentTarget, document, + "The event should be fired at the document") + t.done() +}) +document.dispatchEvent(new Event('resize')); + +t = async_test("meta.onresize should set the meta.onresize handler"); +var meta = document.createElement("meta") +meta.onresize = t.step_func(function(e) { + assert_equals(e.currentTarget, meta, + "The event should be fired at the <meta> object") + t.done() +}) +meta.dispatchEvent(new Event('resize')); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-processing-algorithm.html b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-processing-algorithm.html new file mode 100644 index 000000000..f3848b5ad --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-processing-algorithm.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<title>Event handlers processing algorithm</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + <body> + <div id="foo" style="width: 100px; height: 100px; background-color: black"></div> + <script> + async_test(function(t) { + var ev = new Event('mouseover', {cancelable: true}); + document.getElementById("foo").onmouseover = t.step_func(function() { return true }); + document.getElementById("foo").dispatchEvent(ev); + assert_equals(ev.defaultPrevented, true) + t.done(); + }, "mouseover listener returning true cancels event"); + + async_test(function(t) { + var ev = new Event('mouseover', {cancelable: true}); + document.getElementById("foo").onmouseover = t.step_func(function() { return false; }); + document.getElementById("foo").dispatchEvent(ev); + assert_equals(ev.defaultPrevented, false); + t.done(); + }, "mouseover listener returning false doesn't cancel event"); + + async_test(function(t) { + var ev = new Event('beforeunload', {cancelable: true}); + window.onbeforeunload = t.step_func(function() {return null}); + window.dispatchEvent(ev); + assert_equals(ev.defaultPrevented, true); + t.done(); + }, "beforeunload listener returning null cancels event"); + + async_test(function(t) { + var ev = new Event('beforeunload', {cancelable: true}); + window.onbeforeunload = t.step_func(function() {return true}); + window.dispatchEvent(ev); + assert_equals(ev.defaultPrevented, false); + t.done(); + }, "beforeunload listener returning non-null doesn't cancel event"); + + async_test(function(t) { + var ev = new Event("click", {cancelable: true}); + document.getElementById("foo").onclick = t.step_func(function() { return false; }); + document.getElementById("foo").dispatchEvent(ev); + assert_equals(ev.defaultPrevented, true); + t.done(); + }, "click listener returning false cancels event"); + + async_test(function(t) { + var ev = new Event("blur", {cancelable: true}); + document.getElementById("foo").onblur = t.step_func(function() { return false; }); + document.getElementById("foo").dispatchEvent(ev); + assert_equals(ev.defaultPrevented, true); + t.done(); + }, "blur listener returning false cancels event"); + + async_test(function(t) { + var ev = new Event("dblclick", {cancelable: true}); + document.getElementById("foo").ondblclick = t.step_func(function() { return false; }); + document.getElementById("foo").dispatchEvent(ev); + assert_equals(ev.defaultPrevented, true); + t.done(); + }, "dblclick listener returning false cancels event"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-spec-example.html b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-spec-example.html new file mode 100644 index 000000000..c06806e3c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/event-handler-spec-example.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<title>Event handler invocation order</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var objects = [{}, function() {}, new Number(42), new String()]; +var primitives = [42, null, undefined, ""]; +objects.forEach(function(object) { + var t = async_test("Event handler listeners should be registered when they " + + "are first set to an object value (" + + format_value(object) + ")."); + t.step(function() { + var i = 0; + var uncalled = "t.step(function() { assert_unreached('First event handler.') })" + var button = document.createElement('button'); + button.onclick = object; // event handler listener is registered here + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 2) }), false); + button.setAttribute('onclick', uncalled); + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false); + button.onclick = t.step_func(function () { assert_equals(++i, 1); }); + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false); + button.click() + assert_equals(button.getAttribute("onclick"), uncalled) + assert_equals(i, 4); + t.done() + }); +}); +primitives.forEach(function(primitive) { + var t = async_test("Event handler listeners should be registered when they " + + "are first set to an object value (" + + format_value(primitive) + ")."); + t.step(function() { + var i = 0; + var uncalled = "t.step(function() { assert_unreached('First event handler.') })" + var button = document.createElement('button'); + button.onclick = primitive; + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false); + button.setAttribute('onclick', uncalled); // event handler listener is registered here + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false); + button.onclick = t.step_func(function () { assert_equals(++i, 2); }); + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false); + button.click() + assert_equals(button.getAttribute("onclick"), uncalled) + assert_equals(i, 4); + t.done() + }); +}); +var t = async_test("Event handler listeners should be registered when they " + + "are first set to an object value."); +t.step(function() { + var i = 0; + var uncalled = "t.step(function() { assert_unreached('First event handler.') })" + var button = document.createElement('button'); + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 1) }), false); + button.setAttribute('onclick', uncalled); // event handler listener is registered here + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 3) }), false); + button.onclick = t.step_func(function () { assert_equals(++i, 2); }); + button.addEventListener('click', t.step_func(function () { assert_equals(++i, 4) }), false); + button.click() + assert_equals(button.getAttribute("onclick"), uncalled) + assert_equals(i, 4); + t.done() +}); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/inline-event-handler-ordering.html b/testing/web-platform/tests/html/webappapis/scripting/events/inline-event-handler-ordering.html new file mode 100644 index 000000000..90e29bfd1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/inline-event-handler-ordering.html @@ -0,0 +1,52 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Inline event handlers retain their ordering even when invalid</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +var events = []; + +test(function() { + events = []; + var e = document.createElement("div"); + document.body.appendChild(e); + e.addEventListener("click", function() { events.push("ONE") }); + e.setAttribute("onclick", "window.open("); + e.addEventListener("click", function() { events.push("THREE") }); + // Try to compile the event handler. + e.onclick; + e.setAttribute("onclick", "events.push('TWO')"); + e.dispatchEvent(new Event("click")); + var expected_events = ["ONE", "TWO", "THREE"]; + assert_array_equals(events, expected_events); +}, "Inline event handlers retain their ordering when invalid and force-compiled"); + +test(function() { + events = []; + var e = document.createElement("div"); + document.body.appendChild(e); + e.addEventListener("click", function() { events.push("ONE") }); + e.setAttribute("onclick", "window.open("); + e.addEventListener("click", function() { events.push("THREE") }); + e.dispatchEvent(new Event("click")); + e.setAttribute("onclick", "events.push('TWO')"); + e.dispatchEvent(new Event("click")); + var expected_events = ["ONE", "THREE", "ONE", "TWO", "THREE"]; + assert_array_equals(events, expected_events); +}, "Inline event handlers retain their ordering when invalid and force-compiled via dispatch"); + +test(function() { + events = []; + var e = document.createElement("div"); + document.body.appendChild(e); + e.addEventListener("click", function() { events.push("ONE") }); + e.setAttribute("onclick", "window.open("); + e.addEventListener("click", function() { events.push("THREE") }); + e.setAttribute("onclick", "events.push('TWO')"); + e.dispatchEvent(new Event("click")); + var expected_events = ["ONE", "TWO", "THREE"]; + assert_array_equals(events, expected_events); +}, "Inline event handlers retain their ordering when invalid and lazy-compiled"); +</script> +</body> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html b/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html new file mode 100644 index 000000000..a0e7bbcdd --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late.html @@ -0,0 +1,25 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Invalid uncompiled raw handlers should only be compiled when about to call them.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +setup({ allow_uncaught_exception: true }); + +test(function() { + var events = []; + window.onerror = function() { + events.push("Error"); + }; + + var div = document.createElement("div"); + div.addEventListener("click", function (e) { events.push("click 1") }); + div.setAttribute("onclick", "}"); + div.addEventListener("click", function (e) { events.push("click 2") }); + div.dispatchEvent(new Event("click")); + assert_equals(div.onclick, null); + assert_array_equals(events, ["click 1", "error", "click 2"]); +}); +</script> +</body> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html b/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html new file mode 100644 index 000000000..a67f66ead --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html @@ -0,0 +1,23 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Invalid uncompiled raw handlers should only be compiled once.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +setup({ allow_uncaught_exception: true }); + +var errors = 0; +window.onerror = function() { + errors++; +}; + +test(function() { + var e = document.body; + e.setAttribute("onclick", "window.open("); + assert_equals(e.onclick, null); + assert_equals(e.onclick, null); + assert_equals(errors, 1); +}); +</script> +</body> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler-frame.html b/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler-frame.html new file mode 100644 index 000000000..79e4af302 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler-frame.html @@ -0,0 +1,56 @@ +<body></body> +<script> +function check1(args, callee) { + parent.t.step(function() { + parent.assert_equals(callee.length, 5); + parent.assert_equals(args.length, 5); + parent.assert_equals(args[0], reference_error.message); + parent.assert_equals(args[1], reference_error.filename); + parent.assert_equals(args[2], reference_error.lineno); + parent.assert_equals(args[3], reference_error.colno); + parent.assert_equals(args[4], reference_error.error); + parent.t.done(); + }); +} + +var reference_error = new ErrorEvent("error", { + filename: "error_file.js", + lineno: 333, + colno: 999, + message: "there was an error", + error: {nondefault: 'some unusual object'}, +}); + +parent.t.step(function() { + document.body.outerHTML = "<body onerror='check1(arguments, arguments.callee)'></body>" + window.dispatchEvent(reference_error); +}); + +function check2(args, callee) { + parent.t2.step(function() { + parent.assert_equals(callee.length, 5); + parent.assert_equals(args.length, 1); + parent.assert_false(args[0] instanceof ErrorEvent); + parent.t2.done() + }); +} + +parent.t2.step(function() { + document.body.outerHTML = "<body onerror='check2(arguments, arguments.callee)'></body>" + window.dispatchEvent(new Event("error")); +}); + +function check3(args, callee) { + parent.t3.step(function() { + parent.assert_equals(args.length, 1); + parent.assert_equals(callee.length, 1); + }); +} + +parent.t3.step(function() { + document.body.outerHTML = "<body><span onerror='check3(arguments, arguments.callee)'></span></body>" + document.body.firstChild.dispatchEvent(reference_error); + document.body.firstChild.dispatchEvent(new Event("error")); + parent.t3.done(); +}); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler.html b/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler.html new file mode 100644 index 000000000..60fc674d5 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/events/onerroreventhandler.html @@ -0,0 +1,11 @@ +<!doctype html> +<meta charset=utf-8> +<title>OnErrorEventHandler + ErrorEvent is treated differently</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> +var t = async_test("onerror + ErrorEvent + Window"); +var t2 = async_test("onerror + !ErrorEvent + Window"); +var t3 = async_test("onerror + Document"); +</script> +<iframe src="onerroreventhandler-frame.html"></iframe> diff --git a/testing/web-platform/tests/html/webappapis/scripting/introduction-5/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/introduction-5/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/introduction-5/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/javascript-protocol/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/javascript-protocol/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/javascript-protocol/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/.gitkeep b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/addEventListener.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/addEventListener.html new file mode 100644 index 000000000..dbb1cdd5a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/addEventListener.html @@ -0,0 +1,32 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - addEventListener</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var ran = false; + window.addEventListener('error', t.step_func(function(e){ + ran = true; + assert_true(e.isTrusted, 'isTrusted'); + }), false); + </script> + <script> + undefined_variable; + </script> + <script> + for (;) {} + </script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error-data-url.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error-data-url.html new file mode 100644 index 000000000..66e1dfed4 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error-data-url.html @@ -0,0 +1,37 @@ +<!doctype html> +<html> + <head> + <title><body onerror> - compile error in <script src=data:...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + </script> + <body onerror=" + t.step(function(){ + ran = true; + assert_equals(typeof event, 'string', 'first arg'); + assert_equals(source, 'data:text/javascript,for(;){}', 'second arg'); + assert_equals(typeof lineno, 'number', 'third arg'); + }); + t_col.step(function() { + assert_equals(typeof colno, 'number', 'fourth arg'); + }); + "> + <div id=log></div> + <script src="data:text/javascript,for(;){}"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + t_col.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error.html new file mode 100644 index 000000000..0f65f7399 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-compile-error.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title><body onerror> - compile error in <script></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + </script> + <body onerror=" + t.step(function(){ + ran = true; + assert_equals(typeof event, 'string', 'first arg'); + assert_equals(source, location.href, 'second arg'); + assert_equals(typeof lineno, 'number', 'third arg'); + }); + t_col.step(function() { + assert_equals(typeof colno, 'number', 'fourth arg'); + }); + "> + <div id=log></div> + <script> + for(;) {} + </script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + t_col.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-runtime-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-runtime-error.html new file mode 100644 index 000000000..faaddd9ed --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/body-onerror-runtime-error.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title><body onerror> - runtime error in <script></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + </script> + <body onerror=" + t.step(function(){ + ran = true; + assert_equals(typeof event, 'string', 'first arg'); + assert_equals(source, location.href, 'second arg'); + assert_equals(typeof lineno, 'number', 'third arg'); + }); + t_col.step(function(){ + assert_equals(typeof colno, 'number', 'fourth arg'); + }); + "> + <div id=log></div> + <script> + undefined_variable; + </script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + t_col.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html new file mode 100644 index 000000000..14e9a8bc2 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setInterval.html @@ -0,0 +1,34 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in cross-origin setInterval</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + var interval; + window.onerror = t.step_func(function(a, b, c, d){ + clearInterval(interval); + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + function col_check() { + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + } + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/syntax-error-in-setInterval.js'); + document.body.appendChild(script); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html new file mode 100644 index 000000000..ba3be9d0a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin-setTimeout.html @@ -0,0 +1,32 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in cross-origin setTimeout</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + function col_check() { + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + } + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/syntax-error-in-setTimeout.js'); + document.body.appendChild(script); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin.html new file mode 100644 index 000000000..b7e989529 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-cross-origin.html @@ -0,0 +1,38 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <script src=//www1...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/syntax-error.js'); + document.body.appendChild(script); + onload = function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + }); + }; + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-data-url.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-data-url.html new file mode 100644 index 000000000..08ce2f348 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-data-url.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <script src=data:...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, 'data:text/javascript,for(;){}', 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="data:text/javascript,for(;){}"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute.html new file mode 100644 index 000000000..864d09fc1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in attribute</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <p onclick="{"></p> + <script> + t.step(function(){ + var ev = document.createEvent('Event'); + ev.initEvent('click', false, false); + document.querySelector('p').dispatchEvent(ev); + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror.html new file mode 100644 index 000000000..0b094e71c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror.html @@ -0,0 +1,28 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <body onerror></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var ran = false; + window.onerror = t.step_func(function(){ + ran = true; + }); + </script> + </head> + <body onerror="{"><!-- sets the event handler to null before compiling --> + <div id=log></div> + <script> + for(;) {} + </script> + <script> + t.step(function(){ + assert_false(ran, 'ran'); + t.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html new file mode 100644 index 000000000..39a01335c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setInterval.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in setInterval</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + var interval; + window.onerror = t.step_func(function(a, b, c, d){ + clearInterval(interval); + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + interval = setInterval("{", 10); + setTimeout(function(){ + t.step(function(){ + clearInterval(interval); + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + }, 20); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setTimeout.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setTimeout.html new file mode 100644 index 000000000..879660313 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-in-setTimeout.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in setTimeout</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + setTimeout("{", 10); + setTimeout(function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + }, 20); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin.html new file mode 100644 index 000000000..71c28b584 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error-same-origin.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <script src=...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, document.querySelector('script[src="support/syntax-error.js"]').src, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="support/syntax-error.js"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error.html new file mode 100644 index 000000000..a4bdfd9c4 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/compile-error.html @@ -0,0 +1,38 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - compile error in <script></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script> + for(;) {} + </script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/contains.json b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/contains.json new file mode 100644 index 000000000..b49029277 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/contains.json @@ -0,0 +1,28 @@ +[ + { + "id": "definitions-0", + "original_id": "definitions-0" + }, + { + "id": "calling-scripts", + "original_id": "calling-scripts" + }, + { + "id": "creating-scripts", + "original_id": "creating-scripts" + }, + { + "id": "killing-scripts", + "original_id": "killing-scripts" + }, + { + "id": "runtime-script-errors", + "original_id": "runtime-script-errors", + "children": [ + { + "id": "runtime-script-errors-in-documents", + "original_id": "runtime-script-errors-in-documents" + } + ] + } +]
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html new file mode 100644 index 000000000..dd97566d7 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html @@ -0,0 +1,34 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in cross-origin setInterval</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + var interval; + window.onerror = t.step_func(function(a, b, c, d){ + clearInterval(interval); + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + function col_check() { + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + } + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/undefined-variable-in-setInterval.js'); + document.body.appendChild(script); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html new file mode 100644 index 000000000..20ee21c61 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setTimeout.html @@ -0,0 +1,32 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in cross-origin setTimeout</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + function col_check() { + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + } + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/undefined-variable-in-setTimeout.js'); + document.body.appendChild(script); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin.html new file mode 100644 index 000000000..d63aaa6d3 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin.html @@ -0,0 +1,38 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in <script src=//www1...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(a, 'Script error.', 'first arg'); + assert_equals(b, '', 'second arg'); + assert_equals(c, 0, 'third arg'); + }); + var script = document.createElement('script'); + script.src = location.href.replace('://', '://www1.').replace(/\/[^\/]+$/, '/support/undefined-variable.js'); + document.body.appendChild(script); + onload = function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(col_value, 0, 'fourth arg'); + t_col.done(); + }); + }; + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-data-url.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-data-url.html new file mode 100644 index 000000000..485ce90aa --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-data-url.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in <script src=data:...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, 'data:text/javascript,undefined_variable;', 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="data:text/javascript,undefined_variable;"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-attribute.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-attribute.html new file mode 100644 index 000000000..b4f69da7a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-attribute.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in attribute</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <p onclick="undefined_variable;"></p> + <script> + t.step(function(){ + var ev = document.createEvent('Event'); + ev.initEvent('click', false, false); + document.querySelector('p').dispatchEvent(ev); + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-body-onerror.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-body-onerror.html new file mode 100644 index 000000000..e0fd1dcbd --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-body-onerror.html @@ -0,0 +1,25 @@ +<!doctype html> +<html> + <head> + <title>runtime error in <body onerror></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var ran = 0; + </script> + </head> + <body onerror="ran++; undefined_variable_in_onerror;"> + <div id=log></div> + <script> + undefined_variable; + </script> + <script> + t.step(function(){ + assert_equals(ran, 1, 'ran'); + t.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html new file mode 100644 index 000000000..fcfb6c597 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setInterval.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in setInterval</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + var interval; + window.onerror = t.step_func(function(a, b, c, d){ + clearInterval(interval); + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + interval = setInterval("undefined_variable;", 10); + setTimeout(function(){ + clearInterval(interval); + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + }, 20); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html new file mode 100644 index 000000000..c0c69ad7c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-setTimeout.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in setTimeout</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + setTimeout("undefined_variable;", 10); + setTimeout(function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + }, 20); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-window-onerror.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-window-onerror.html new file mode 100644 index 000000000..150a793b7 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-in-window-onerror.html @@ -0,0 +1,29 @@ +<!doctype html> +<html> + <head> + <title>runtime error in window.onerror</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var ran = 0; + window.onerror = function(){ + ran++; + undefined_variable_in_onerror; + }; + </script> + <script> + undefined_variable; + </script> + <script> + t.step(function(){ + assert_equals(ran, 1, 'ran'); + t.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin.html new file mode 100644 index 000000000..8f3cfb70b --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error-same-origin.html @@ -0,0 +1,36 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in <script src=...></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, document.querySelector('script[src="support/undefined-variable.js"]').src, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script src="support/undefined-variable.js"></script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error.html new file mode 100644 index 000000000..7907494aa --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/runtime-error.html @@ -0,0 +1,38 @@ +<!doctype html> +<html> + <head> + <title>window.onerror - runtime error in <script></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <div id=log></div> + <script> + setup({allow_uncaught_exception:true}); + var t = async_test(); + var t_col = async_test(document.title+' (column)'); + var ran = false; + var col_value; + window.onerror = t.step_func(function(a, b, c, d){ + ran = true; + col_value = d; + assert_equals(typeof a, 'string', 'first arg'); + assert_equals(b, location.href, 'second arg'); + assert_equals(typeof c, 'number', 'third arg'); + }); + </script> + <script> + undefined_variable; + </script> + <script> + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(function(){ + assert_equals(typeof col_value, 'number', 'fourth arg'); + t_col.done(); + }); + </script> + </body> +</html>
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js new file mode 100644 index 000000000..812c0daea --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setInterval.js @@ -0,0 +1,9 @@ +interval = setInterval('{', 10); +setTimeout(function(){ + clearInterval(interval); + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(col_check); +}, 20);
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js new file mode 100644 index 000000000..84eb4fc41 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error-in-setTimeout.js @@ -0,0 +1,8 @@ +setTimeout('{', 10); +setTimeout(function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(col_check); +}, 20); diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error.js new file mode 100644 index 000000000..0f74a6fca --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/syntax-error.js @@ -0,0 +1 @@ +for (;) {}
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js new file mode 100644 index 000000000..2950fdb51 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setInterval.js @@ -0,0 +1,9 @@ +interval = setInterval('undefined_variable;', 10); +setTimeout(function(){ + clearInterval(interval); + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(col_check); +}, 20);
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js new file mode 100644 index 000000000..6350ab62e --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable-in-setTimeout.js @@ -0,0 +1,8 @@ +setTimeout('undefined_variable;', 10); +setTimeout(function(){ + t.step(function(){ + assert_true(ran, 'ran'); + t.done(); + }); + t_col.step(col_check); +}, 20); diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable.js b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable.js new file mode 100644 index 000000000..e73a62ced --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/support/undefined-variable.js @@ -0,0 +1 @@ +undefined_variable;
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html new file mode 100644 index 000000000..3c21df49c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-parse-error.html @@ -0,0 +1,40 @@ +<!doctype html> +<html> + <head> + <title>window.onerror: parse errors</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <!-- + + In https://html.spec.whatwg.org/multipage/#creating-scripts , + step 3 describes parsing the script, and step 5 says: + # Otherwise, report the error using the onerror event handler of + # the script's global object. If the error is still not handled + # after this, then the error may be reported to the user. + which links to + https://html.spec.whatwg.org/multipage/#report-the-error , + which describes what to do when onerror is a Function. + + --> + </head> + <body> + + <div id="log"></div> + <script> + setup({allow_uncaught_exception:true}); + var error_count = 0; + window.onerror = function(msg, url, lineno) { + ++error_count; + test(function() {assert_equals(url, window.location.href)}, + "correct url passed to window.onerror"); + test(function() {assert_equals(lineno, 34)}, + "correct line number passed to window.onerror"); + }; + </script> + <script>This script does not parse correctly.</script> + <script> + test(function() {assert_equals(error_count, 1)}, + "correct number of calls to window.onerror"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error-throw.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error-throw.html new file mode 100644 index 000000000..5d2ef0d29 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error-throw.html @@ -0,0 +1,39 @@ +<!doctype html> +<html> + <head> + <title>window.onerror: runtime scripterrors</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <!-- + + https://html.spec.whatwg.org/multipage/#runtime-script-errors + says what to do for uncaught runtime script errors, and just below + describes what to do when onerror is a Function. + + --> + </head> + <body> + + <div id="log"></div> + <script> + setup({allow_uncaught_exception:true}); + var error_count = 0; + window.onerror = function(msg, url, lineno) { + ++error_count; + }; + </script> + <script> + try { + // This error is caught, so it should NOT trigger onerror. + throw "foo"; + } catch (ex) { + } + // This error is NOT caught, so it should trigger onerror. + throw "bar"; + </script> + <script> + test(function() {assert_equals(error_count, 1)}, + "correct number of calls to window.onerror"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html new file mode 100644 index 000000000..1fdab521a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-runtime-error.html @@ -0,0 +1,43 @@ +<!doctype html> +<html> + <head> + <title>window.onerror: runtime scripterrors</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <!-- + + https://html.spec.whatwg.org/multipage/#runtime-script-errors + says what to do for uncaught runtime script errors, and just below + describes what to do when onerror is a Function. + + --> + </head> + <body> + + <div id="log"></div> + <script> + setup({allow_uncaught_exception:true}); + var error_count = 0; + window.onerror = function(msg, url, lineno) { + ++error_count; + test(function() {assert_equals(url, window.location.href)}, + "correct url passed to window.onerror"); + test(function() {assert_equals(lineno, 36)}, + "correct line number passed to window.onerror"); + }; + </script> + <script> + try { + // This error is caught, so it should NOT trigger onerror. + window.nonexistentproperty.oops(); + } catch (ex) { + } + // This error is NOT caught, so it should trigger onerror. + window.nonexistentproperty.oops(); + </script> + <script> + test(function() {assert_equals(error_count, 1)}, + "correct number of calls to window.onerror"); + </script> + </body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html new file mode 100644 index 000000000..65a1a02b1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-1.html @@ -0,0 +1,33 @@ +<!doctype html> +<meta charset=utf-8> +<title> + When a listener from window A is added to an event target in window B via the + addEventListener function from window B, errors in that listener should be + reported to window A. +</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe></iframe> +<iframe></iframe> +<script> +test(function() { + var f = new frames[0].Function("thereIsNoSuchCallable()"); + frames[1].document.addEventListener("myevent", f); + var frame0ErrorFired = false; + var frame1ErrorFired = false; + var ourErrorFired = false; + frames[0].addEventListener("error", function() { + frame0ErrorFired = true; + }); + frames[1].addEventListener("error", function() { + frame1ErrorFired = true; + }); + addEventListener("error", function() { + ourErrorFired = true; + }); + frames[1].document.dispatchEvent(new Event("myevent")); + assert_true(frame0ErrorFired); + assert_false(frame1ErrorFired); + assert_false(ourErrorFired); +}, "The error event from an event listener should fire on that listener's global"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html new file mode 100644 index 000000000..6c5476542 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-2.html @@ -0,0 +1,33 @@ +<!doctype html> +<meta charset=utf-8> +<title> + When a listener from window A is added to an event target in window B via the + addEventListener function from window A, errors in that listener should be + reported to window A. +</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe></iframe> +<iframe></iframe> +<script> +test(function() { + var f = new frames[0].Function("thereIsNoSuchCallable()"); + frames[0].document.addEventListener.call(frames[1].document, "myevent", f); + var frame0ErrorFired = false; + var frame1ErrorFired = false; + var ourErrorFired = false; + frames[0].addEventListener("error", function() { + frame0ErrorFired = true; + }); + frames[1].addEventListener("error", function() { + frame1ErrorFired = true; + }); + addEventListener("error", function() { + ourErrorFired = true; + }); + frames[1].document.dispatchEvent(new Event("myevent")); + assert_true(frame0ErrorFired); + assert_false(frame1ErrorFired); + assert_false(ourErrorFired); +}, "The error event from an event listener should fire on that listener's global"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html new file mode 100644 index 000000000..5e78baa8d --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-3.html @@ -0,0 +1,33 @@ +<!doctype html> +<meta charset=utf-8> +<title> + When a listener from window A is added to an event target in window A via the + addEventListener function from window A, errors in that listener should be + reported to window A. +</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe></iframe> +<iframe></iframe> +<script> +test(function() { + var f = new frames[1].Function("thereIsNoSuchCallable()"); + frames[1].document.addEventListener("myevent", f); + var frame0ErrorFired = false; + var frame1ErrorFired = false; + var ourErrorFired = false; + frames[0].addEventListener("error", function() { + frame0ErrorFired = true; + }); + frames[1].addEventListener("error", function() { + frame1ErrorFired = true; + }); + addEventListener("error", function() { + ourErrorFired = true; + }); + frames[1].document.dispatchEvent(new Event("myevent")); + assert_false(frame0ErrorFired); + assert_true(frame1ErrorFired); + assert_false(ourErrorFired); +}, "The error event from an event listener should fire on that listener's global"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html new file mode 100644 index 000000000..a5f35d613 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/scripting/processing-model-2/window-onerror-with-cross-frame-event-listeners-4.html @@ -0,0 +1,33 @@ +<!doctype html> +<meta charset=utf-8> +<title> + When a listener from window A is added to an event target in window A via the + addEventListener function from window B, errors in that listener should be + reported to window A. +</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<iframe></iframe> +<iframe></iframe> +<script> +test(function() { + var f = new frames[1].Function("thereIsNoSuchCallable()"); + frames[0].document.addEventListener.call(frames[1].document, "myevent", f); + var frame0ErrorFired = false; + var frame1ErrorFired = false; + var ourErrorFired = false; + frames[0].addEventListener("error", function() { + frame0ErrorFired = true; + }); + frames[1].addEventListener("error", function() { + frame1ErrorFired = true; + }); + addEventListener("error", function() { + ourErrorFired = true; + }); + frames[1].document.dispatchEvent(new Event("myevent")); + assert_false(frame0ErrorFired); + assert_true(frame1ErrorFired); + assert_false(ourErrorFired); +}, "The error event from an event listener should fire on that listener's global"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/.gitkeep b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-external-interface/.gitkeep b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-external-interface/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-external-interface/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/.gitkeep b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.html new file mode 100644 index 000000000..1956a202c --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.html @@ -0,0 +1,10 @@ +<!doctype html> +<meta charset=utf-8> +<title>NavigatorID</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src=NavigatorID.js></script> +<div id="log"></div> +<script> +run_test(); +</script> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js new file mode 100644 index 000000000..cf16c68d4 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js @@ -0,0 +1,63 @@ +function run_test() { + test(function() { + assert_equals(navigator.appCodeName, "Mozilla"); + }, "appCodeName"); + + test(function() { + assert_equals(typeof navigator.appName, "string", + "navigator.appName should be a string"); + }, "appName"); + + test(function() { + assert_equals(typeof navigator.appVersion, "string", + "navigator.appVersion should be a string"); + }, "appVersion"); + + test(function() { + assert_equals(typeof navigator.platform, "string", + "navigator.platform should be a string"); + }, "platform"); + + test(function() { + assert_equals(navigator.product, "Gecko"); + }, "product"); + + test(function() { + // See https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555 + if ("window" in self) { + // If you identify as WebKit, taintEnabled should not exist. + if (navigator.userAgent.indexOf("WebKit") != -1) { + assert_false("taintEnabled" in navigator); + } + // Otherwise it should exist and return false. + else { + assert_false(navigator.taintEnabled()); + } + } else { + // taintEnabled should not exist in workers. + assert_false("taintEnabled" in navigator); + } + }, "taintEnabled"); + + test(function() { + assert_equals(typeof navigator.userAgent, "string", + "navigator.userAgent should be a string"); + }, "userAgent type"); + + test(function() { + assert_equals(navigator.vendorSub, ""); + }, "vendorSub"); + + async_test(function() { + var request = new XMLHttpRequest(); + request.onload = this.step_func_done(function() { + assert_equals("user-agent: " + navigator.userAgent + "\n", + request.response, + "userAgent should return the value sent in the " + + "User-Agent header"); + }); + request.open("GET", "/XMLHttpRequest/resources/inspect-headers.py?" + + "filter_name=User-Agent"); + request.send(); + }, "userAgent value"); +} diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker.js b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker.js new file mode 100644 index 000000000..9ba7defa1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker.js @@ -0,0 +1,4 @@ +importScripts("/resources/testharness.js") +importScripts("NavigatorID.js") +run_test(); +done(); diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/contains.json b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/contains.json new file mode 100644 index 000000000..441c24cec --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/contains.json @@ -0,0 +1,22 @@ +[ + { + "id": "client-identification", + "original_id": "client-identification" + }, + { + "id": "custom-handlers", + "original_id": "custom-handlers" + }, + { + "id": "security-and-privacy", + "original_id": "security-and-privacy" + }, + { + "id": "sample-handler-impl", + "original_id": "sample-handler-impl" + }, + { + "id": "manually-releasing-the-storage-mutex", + "original_id": "manually-releasing-the-storage-mutex" + } +]
\ No newline at end of file diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html new file mode 100644 index 000000000..b6b41c21f --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html @@ -0,0 +1,136 @@ +<!DOCTYPE html> +<meta charset='utf-8'> +<title>registerContentHandler()</title> + +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> + +<noscript><p>Enable JavaScript and reload.</p></noscript> + +<p><strong>Note:</strong> If your browser limits the number of handler +registration requests on a page, you might need to disable or significantly +increase that limit for the tests below to run.</p> + + +<div id='log'></div> + +<script> +test(function () { + assert_idl_attribute(navigator, 'registerContentHandler'); +}, 'the registerContentHandler method should exist on the navigator object'); + +/* Happy path */ +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s', 'foo'); +}, 'a handler with valid arguments should work'); + + +/* URL argument */ +test(function () { + navigator.registerContentHandler('text/x-unknown-type', '%s', 'foo'); +}, 'a relative URL should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '#%s', 'foo'); +}, 'a URL with a fragment identifier should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '?foo=%s', 'foo'); +}, 'a URL with a query string should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '?foo=%s&bar', 'foo'); +}, 'a URL with a multi-argument query string should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/', 'foo'); +}, 'a URL with the passed string as a directory name should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/?foo=1337&bar#baz', 'foo'); +}, 'a URL with the passed string as a directory name followed by a query string and fragment identifier should work'); + +test(function () { + navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/foo/%s/', 'foo'); +}, 'a URL with the passed string included twice should work'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', '', 'foo') } ); +}, 'an empty url argument should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.com', 'foo') } ); +}, '%s instead of domain name should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.example.com', 'foo') } ); +}, '%s instead of subdomain name should throw syntax_err'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '', 'foo') } ); +}, 'a url argument without %s should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com', 'foo') } ); +}, 'a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%', 'foo') } ); +}, 'a url argument without %s (but with %) should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%a', 'foo') } ); +}, 'a url argument without %s (but with %a) should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'https://example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (2)'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://foobar.example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (3)'); + +/* Content type argument */ + +/* The following MIME types are handled natively by the browser, and must not + * be possible to override. Note that this list only covers a few basic content + * types. Full lists of content types handled by each browser is found under + * /vendor/. */ + +var blacklist = new Array( + 'image/jpeg', + 'text/html', + 'text/javascript', + 'text/plain'); + +for (var bi=0, bl=blacklist.length; bi<bl; ++bi){ + + test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') } ); + }, 'attempting to override the ' + blacklist[bi] + ' MIME type should throw SECURITY_ERR'); + +} + +/* Overriding the following MIME types should be possible. */ +var whitelist = new Array('application/atom+xml', /* For feeds. */ + 'application/rss+xml', /* For feeds. */ + 'application/x-unrecognized', /* Arbitrary MIME types should be overridable. */ + 'text/unrecognized', + 'foo/bar'); + +for (var wi=0, wl=whitelist.length; wi<wl; ++wi){ + + test(function () { + navigator.registerContentHandler(whitelist[wi], location.href + '/%s', 'foo'); + }, 'overriding the ' + whitelist[wi] + ' MIME type should work'); + +} + +</script> + +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml new file mode 100644 index 000000000..a0d2fa15b --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>isContentHandlerRegistered for new content type</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + assert_equals(navigator.isContentHandlerRegistered('application/x-notRegisteredInOtherTCs-001', location.href.replace(/\/[^\/]*$/, "") + '/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml new file mode 100644 index 000000000..d5c2ff3e0 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>isContentHandlerRegistered for content type that is not yet accepted</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var ctype = 'application/x-notRegisteredInOtherTCs-002'; + var url = location.href.replace(/\/[^\/]*$/, "") + "/%s"; + navigator.registerContentHandler(ctype, url, 'test'); + assert_equals(navigator.isContentHandlerRegistered(ctype, url), 'declined'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml new file mode 100644 index 000000000..92e7ca8f5 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Content type case insensitivity in isContentHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var ctype = 'application/x-notRegisteredInOtherTCs-003', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerContentHandler(ctype, url, 'test'); + assert_equals(navigator.isContentHandlerRegistered(ctype.toUpperCase(), url), 'declined'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml new file mode 100644 index 000000000..a82f3506b --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Non-matching url in isContentHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var ctype = 'application/x-notRegisteredInOtherTCs-004', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerContentHandler(ctype, url, 'test'); + assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml new file mode 100644 index 000000000..b8c8b58d1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Invalid characters in content type in isContentHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var ctype = 'application/x-nótRegísteredInOthérTCs-004', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerContentHandler(ctype, url, 'test'); + assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml new file mode 100644 index 000000000..86d0cff61 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Blacklisted content type and isContentHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var ctype = 'application/xhtml+xml', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerContentHandler(ctype, url, 'test'); + assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/get-navigatorlanguage-manual.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/get-navigatorlanguage-manual.html new file mode 100644 index 000000000..4bdab9112 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/get-navigatorlanguage-manual.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>NavigatorLanguage: navigator.language returns the user's preferred language</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#navigatorlanguage"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<h2>Precondition</h2> +<p>The user agent's preferred language is set as English (en).</p> +<div id="log"></div> +<script> + test(function() { + assert_equals(navigator.language, "en"); + }); +</script> + diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html new file mode 100644 index 000000000..a971fe9d1 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset=utf-8> +<title>Test for lack of indexed getter on Navigator</title> +<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-navigator-object"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +test(function() { + assert_false("0" in window.navigator); + assert_equals(window.navigator[0], undefined); +}, "window.navigator[0] should not exist"); +test(function() { + window.navigator[0] = "pass"; + assert_true("0" in window.navigator); + assert_equals(window.navigator[0], "pass"); +}, "window.navigator[0] should be settable"); +test(function() { + assert_false("-1" in window.navigator); + assert_equals(window.navigator[-1], undefined); +}, "window.navigator[-1] should not exist"); +test(function() { + window.navigator[-1] = "pass"; + assert_true("-1" in window.navigator); + assert_equals(window.navigator[-1], "pass"); +}, "window.navigator[-1] should be settable"); +</script> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html new file mode 100644 index 000000000..d56df8a3d --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>NavigatorLanguage: the most preferred language is the one returned by navigator.language</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#navigatorlanguage"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> + test(function() { + assert_true("language" in navigator); + assert_true("languages" in navigator); + + assert_equals(navigator.languages[0], navigator.language, + "navigator.languages is the most preferred language first"); + + }); +</script> + diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html new file mode 100644 index 000000000..a9ceee5a8 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html @@ -0,0 +1,214 @@ +<!DOCTYPE html> +<meta charset='utf-8'> +<title>registerProtocolHandler()</title> + +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> + +<noscript><p>Enable JavaScript and reload.</p></noscript> + +<p><strong>Note:</strong> If your browser limits the number of handler +registration requests on a page, you might need to disable or significantly +increase that limit for the tests below to run.</p> + +<div id='log'></div> + +<script type='text/javascript'> + +test(function () { + assert_idl_attribute(navigator, 'registerProtocolHandler'); +}, 'the registerProtocolHandler method should exist on the navigator object'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '/%s', 'foo'); +}, 'a handler with valid arguments should work'); + + +/* URL argument */ +test(function () { + navigator.registerProtocolHandler('tel', '%s', 'foo'); +}, 'a relative URL should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '#%s', 'foo'); +}, 'a URL with a fragment identifier should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '?foo=%s', 'foo'); +}, 'a URL with a query string should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '?foo=%s&bar', 'foo'); +}, 'a URL with a multi-argument query string should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '/%s/bar/baz/', 'foo'); +}, 'a URL with the passed string as a directory name should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '/%s/bar/baz/?foo=1337&bar#baz', 'foo'); +}, 'a URL with the passed string as a directory name followed by a query string and fragment identifier should work'); + +test(function () { + navigator.registerProtocolHandler('tel', location.href + '/%s/foo/%s/', 'foo'); +}, 'a URL with the passed string included twice should work'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', '', 'foo') } ); +}, 'an empty url argument should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', 'http://%s.com', 'foo') } ); +}, '%s instead of domain name should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', 'http://%s.example.com', 'foo') } ); +}, '%s instead of subdomain name should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', location.href + '', 'foo') } ); +}, 'a url argument without %s should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', 'http://example.com', 'foo') } ); +}, 'a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', location.href + '/%', 'foo') } ); +}, 'a url argument without %s (but with %) should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto', location.href + '/%a', 'foo') } ); +}, 'a url argument without %s (but with %a) should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler('mailto', 'http://example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler('mailto', 'https://example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (2)'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler('mailto', 'http://foobar.example.com/%s', 'foo') } ); +}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (3)'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler('mailto', 'mailto:%s@example.com', 'foo') } ); +}, 'looping handlers should throw SECURITY_ERR'); + +test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler('sms', 'tel:%s', 'foo') } ); +}, 'a url argument pointing to a non-http[s] scheme should throw SECURITY_ERR due to not being of the same origin'); + +/* Protocol argument */ +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('unrecognized', location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing an unrecognized scheme should throw SECURITY_ERR'); /* This is a whitelist, not a blacklist. */ + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto:', location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing : should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto://', location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing :// should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('http://', location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing http:// should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto' + String.fromCharCode(0), location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing a null character should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailtoo' + String.fromCharCode(8), location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing a backspace character should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mailto' + String.fromCharCode(10), location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing a LF character should throw SYNTAX_ERR'); + +test(function () { + assert_throws('SYNTAX_ERR', function () { navigator.registerProtocolHandler('mаilto', location.href + '/%a', 'foo') } ); +}, 'a protocol argument containing non-alphanumeric characters (like a cyrillic “а”) should throw SYNTAX_ERR'); + +test(function () { + navigator.registerProtocolHandler('TEL', location.href + '/%s', 'foo'); +}, 'a protocol argument of “TEL” should be equivalent to “tel”'); + +test(function () { + navigator.registerProtocolHandler('teL', location.href + '/%s', 'foo'); +}, 'a protocol argument of “teL” should be equivalent to “tel”'); + + +/* Overriding any of the following protocols must never be allowed. That would + * break the browser. */ +var blacklist = new Array( + 'about', + 'attachment', + 'blob', + 'chrome', + 'cid', + 'data', + 'file', + 'ftp', + 'http', + 'https', + 'javascript', + 'livescript', + 'mid', + 'mocha', + 'opera', + 'operamail', + 'res', + 'resource', + 'shttp', + 'tcl', + 'vbscript', + 'view-source', + 'ws', + 'wss', + 'wyciwyg'); + +for ( var bi=0, bl=blacklist.length; bi<bl; ++bi ){ + + test(function () { + assert_throws('SECURITY_ERR', function () { navigator.registerProtocolHandler(blacklist[bi], location.href + '/%s', 'foo') } ); + }, 'attempting to override the ' + blacklist[bi] + ' protocol should throw SECURITY_ERR'); + +} + +/* The following protocols must be possible to override. + * We're just testing that the call goes through here. Whether or not they + * actually work as handlers is covered by the interactive tests. */ +var whitelist = new Array( + 'geo', + 'im', + 'irc', + 'ircs', + 'mailto', + 'mms', + 'news', + 'nntp', + 'sms', + 'smsto', + 'tel', + 'urn', + 'webcal', + 'wtai', + 'xmpp'); + +for ( var wi=0, wl=whitelist.length; wi<wl; ++wi ){ + + test(function () { + navigator.registerProtocolHandler(whitelist[wi], location.href + '/%s', 'foo'); + assert_true(true); + }, 'overriding the ' + whitelist[wi] + ' protocol should work'); + +} +</script> + +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml new file mode 100644 index 000000000..ce9ee1eb0 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>isProtocolHandlerRegistered for new protocol</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var dir_uri = location.href.replace(/\/[^\/]*$/, ""); + assert_equals(navigator.isProtocolHandlerRegistered('web+CustomProtocolOne', dir_uri + '/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml new file mode 100644 index 000000000..ce2c8dc0d --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>isProtocolHandlerRegistered for protocol that is not yet accepted</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var scheme = 'web+CustomProtocolTwo'; + var url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it'); + assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'declined') +}) +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml new file mode 100644 index 000000000..035d5b9a6 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Protocol case insensitivity in isProtocolHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var scheme = 'web+CustomProtocolTree', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it'); + assert_equals(navigator.isProtocolHandlerRegistered(scheme.toUpperCase(), url), 'declined'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml new file mode 100644 index 000000000..3fd14dd12 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Non-matching url in isProtocolHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var scheme = 'web+CustomProtocolFour', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerProtocolHandler(scheme, url, 'Ignore dialog'); + assert_equals(navigator.isProtocolHandlerRegistered(scheme, 'http://t/core/standards/registerhandler/%s'), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml new file mode 100644 index 000000000..894ff4a6a --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Invalid characters in protocol scheme and isProtocolHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var scheme = 'web+CústomPrótocolFíve', url = location.href.replace(/\/[^\/]*$/, "") + '/%s'; + navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it'); + assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml new file mode 100644 index 000000000..7529a7eb2 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Scheme outside white list and isProtocolHandlerRegistered</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script type="application/ecmascript"> +test(function() { + var dir_uri = location.href.replace(/\/[^\/]*$/, ""); + var scheme = 'http', url = dir_uri + '/%s'; + navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it'); + assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'new'); +}); +</script> +</head> +<body> +<div id="log"></div> +</body> +</html> diff --git a/testing/web-platform/tests/html/webappapis/timers/.gitkeep b/testing/web-platform/tests/html/webappapis/timers/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/timers/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/timers/evil-spec-example.html b/testing/web-platform/tests/html/webappapis/timers/evil-spec-example.html new file mode 100644 index 000000000..77a874690 --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/timers/evil-spec-example.html @@ -0,0 +1,23 @@ +<!doctype html> +<title>Interaction of setTimeout and WebIDL</title> +<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"> +<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-windowtimers-settimeout"> +<link rel="help" href="https://heycam.github.io/webidl/#es-operations"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="log"></div> +<script> +var t = async_test() +function finishTest() { + assert_equals(log, "ONE TWO ") + t.done() +} +var log = ''; +function logger(s) { log += s + ' '; } + +setTimeout({ toString: function () { + setTimeout("logger('ONE')", 100); + return "logger('TWO'); t.step(finishTest)"; +} }, 100); +</script> diff --git a/testing/web-platform/tests/html/webappapis/user-prompts/.gitkeep b/testing/web-platform/tests/html/webappapis/user-prompts/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/user-prompts/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/user-prompts/dialogs-implemented-using-separate-documents/.gitkeep b/testing/web-platform/tests/html/webappapis/user-prompts/dialogs-implemented-using-separate-documents/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/user-prompts/dialogs-implemented-using-separate-documents/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/user-prompts/printing/.gitkeep b/testing/web-platform/tests/html/webappapis/user-prompts/printing/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/user-prompts/printing/.gitkeep diff --git a/testing/web-platform/tests/html/webappapis/user-prompts/simple-dialogs/.gitkeep b/testing/web-platform/tests/html/webappapis/user-prompts/simple-dialogs/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/testing/web-platform/tests/html/webappapis/user-prompts/simple-dialogs/.gitkeep |