From 77560c4273862f35ae329b56173d22f18074e4c8 Mon Sep 17 00:00:00 2001 From: Domenic Denicola Date: Tue, 4 Jun 2019 11:08:54 +0200 Subject: [PATCH 1/3] Add optional test for cloning of error stacks Supplements https://github.com/web-platform-tests/wpt/pull/17095. Follows https://github.com/whatwg/html/pull/4665 and https://github.com/heycam/webidl/pull/732. --- ...red-cloning-error-stack-optional.window.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js diff --git a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js new file mode 100644 index 00000000000000..3d28a8fd9165d8 --- /dev/null +++ b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js @@ -0,0 +1,51 @@ +stackTest(() => { + return new Error('some message'); +}, 'page-created Error'); + +stackTest(() => { + return new DOMException('InvalidStateError', 'some message'); +}, 'page-created DOMException'); + +stackTest(() => { + try { + Object.defineProperty(); + } catch (e) { + return e; + } +}, 'JS-engine-created TypeError'); + +stackTest(() => { + try { + HTMLParagraphElement.prototype.align; + } catch (e) { + return e; + } +}, 'web API-created TypeError'); + +stackTest(() => { + try { + document.createElement(''); + } catch (e) { + return e; + } +}, 'web API-created DOMException'); + + +function stackTest(errorFactory, description) { + async_test(t => { + const error = errorFactory(); + const originalStack = error.stack; + + if (!originalStack) { + t.done(); + return; + } + + const worker = new Worker('./echo.js'); + worker.onmessage = t.step_func_done(e => { + assert_equals(e.data.stack, originalStack); + }); + + worker.postMessage(error); + }, description); +} From a3c2eb58c369dd307db596a40f00cf9c34cc9bb8 Mon Sep 17 00:00:00 2001 From: Domenic Denicola Date: Thu, 13 Jun 2019 18:43:55 -0400 Subject: [PATCH 2/3] Add cross-site frame tests Consolidated echo window/worker into resources/ directory --- .../safe-passing-of-structured-data/echo.js | 1 - .../resources/echo-iframe.html | 0 .../resources/echo-worker.js | 0 .../identity-not-preserved.html | 4 +- .../shared-array-buffers/no-transferring.html | 2 +- ...cloning-error-stack-optional.sub.window.js | 86 +++++++++++++++++++ ...red-cloning-error-stack-optional.window.js | 51 ----------- .../structured_clone_bigint.html | 2 +- .../structuredclone_0.html | 2 +- 9 files changed, 91 insertions(+), 57 deletions(-) delete mode 100644 html/infrastructure/safe-passing-of-structured-data/echo.js rename html/infrastructure/safe-passing-of-structured-data/{shared-array-buffers => }/resources/echo-iframe.html (100%) rename html/infrastructure/safe-passing-of-structured-data/{shared-array-buffers => }/resources/echo-worker.js (100%) create mode 100644 html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js delete mode 100644 html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js diff --git a/html/infrastructure/safe-passing-of-structured-data/echo.js b/html/infrastructure/safe-passing-of-structured-data/echo.js deleted file mode 100644 index 02184921cf3b61..00000000000000 --- a/html/infrastructure/safe-passing-of-structured-data/echo.js +++ /dev/null @@ -1 +0,0 @@ -onmessage = function (ev) { postMessage(ev.data); } \ No newline at end of file diff --git a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/echo-iframe.html b/html/infrastructure/safe-passing-of-structured-data/resources/echo-iframe.html similarity index 100% rename from html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/echo-iframe.html rename to html/infrastructure/safe-passing-of-structured-data/resources/echo-iframe.html diff --git a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/echo-worker.js b/html/infrastructure/safe-passing-of-structured-data/resources/echo-worker.js similarity index 100% rename from html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/echo-worker.js rename to html/infrastructure/safe-passing-of-structured-data/resources/echo-worker.js diff --git a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html index 91110867d7b47a..11161ba8ab73d4 100644 --- a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html +++ b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html @@ -29,7 +29,7 @@ async_test(t => { const sab = new SharedArrayBuffer(); - const worker = new Worker("resources/echo-worker.js"); + const worker = new Worker("../resources/echo-worker.js"); worker.addEventListener("message", t.step_func(({ data }) => { if (data.testId !== 2) { @@ -58,7 +58,7 @@ iframe.onload = t.step_func(() => { iframe.contentWindow.postMessage({ testId: 3, sab }, "*"); }); - iframe.src = "resources/echo-iframe.html"; + iframe.src = "../resources/echo-iframe.html"; document.body.appendChild(iframe); }, "postMessaging to an iframe and back does not give back the same SharedArrayBuffer"); diff --git a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html index fa95d8abe5d4f9..b39e37fd496644 100644 --- a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html +++ b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html @@ -17,7 +17,7 @@ test(() => { const sab = new SharedArrayBuffer(); - const worker = new Worker("resources/echo-worker.js"); + const worker = new Worker("../resources/echo-worker.js"); assert_throws("DataCloneError", () => worker.postMessage(sab, [sab])); assert_throws("DataCloneError", () => worker.postMessage("test", [sab])); }, "Trying to transfer a SharedArrayBuffer to a worker throws"); diff --git a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js new file mode 100644 index 00000000000000..ffd1376c738c46 --- /dev/null +++ b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js @@ -0,0 +1,86 @@ +// .stack properties on errors are unspecified, but are present in most +// browsers, most of the time. https://github.com/tc39/proposal-error-stacks/ tracks standardizing them. +// Tests will pass automatically if the .stack property isn't present. + +stackTests(() => { + return new Error('some message'); +}, 'page-created Error'); + +stackTests(() => { + return new DOMException('InvalidStateError', 'some message'); +}, 'page-created DOMException'); + +stackTests(() => { + try { + Object.defineProperty(); + } catch (e) { + return e; + } +}, 'JS-engine-created TypeError'); + +stackTests(() => { + try { + HTMLParagraphElement.prototype.align; + } catch (e) { + return e; + } +}, 'web API-created TypeError'); + +stackTests(() => { + try { + document.createElement(''); + } catch (e) { + return e; + } +}, 'web API-created DOMException'); + +function stackTests(errorFactory, description) { + async_test(t => { + const error = errorFactory(); + const originalStack = error.stack; + + if (!originalStack) { + t.done(); + return; + } + + const worker = new Worker('resources/echo-worker.js'); + worker.onmessage = t.step_func_done(e => { + assert_equals(e.data.stack, originalStack); + }); + + worker.postMessage(error); + }, description + ' (worker)'); + + // testId needed because they all share window's message event. + let testId = 0; + async_test(t => { + const thisTestId = testId; + ++testId; + + const error = errorFactory(); + const originalStack = error.stack; + + if (!originalStack) { + t.done(); + return; + } + + const iframe = document.createElement('iframe'); + window.addEventListener('message', t.step_func(e => { + if (e.data.testId === thisTestId) { + assert_equals(e.data.error.stack, originalStack); + t.done(); + } + })); + + iframe.onload = t.step_func(() => { + iframe.contentWindow.postMessage({ error, testId: thisTestId }, "*"); + }); + + const crossSiteEchoIFrame = new URL('resources/echo-iframe.html', location.href); + crossSiteEchoIFrame.hostname = '{{hosts[alt][www1]}}'; + iframe.src = crossSiteEchoIFrame; + document.body.append(iframe); + }, description + ' (cross-site iframe)'); +} diff --git a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js deleted file mode 100644 index 3d28a8fd9165d8..00000000000000 --- a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.window.js +++ /dev/null @@ -1,51 +0,0 @@ -stackTest(() => { - return new Error('some message'); -}, 'page-created Error'); - -stackTest(() => { - return new DOMException('InvalidStateError', 'some message'); -}, 'page-created DOMException'); - -stackTest(() => { - try { - Object.defineProperty(); - } catch (e) { - return e; - } -}, 'JS-engine-created TypeError'); - -stackTest(() => { - try { - HTMLParagraphElement.prototype.align; - } catch (e) { - return e; - } -}, 'web API-created TypeError'); - -stackTest(() => { - try { - document.createElement(''); - } catch (e) { - return e; - } -}, 'web API-created DOMException'); - - -function stackTest(errorFactory, description) { - async_test(t => { - const error = errorFactory(); - const originalStack = error.stack; - - if (!originalStack) { - t.done(); - return; - } - - const worker = new Worker('./echo.js'); - worker.onmessage = t.step_func_done(e => { - assert_equals(e.data.stack, originalStack); - }); - - worker.postMessage(error); - }, description); -} diff --git a/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html b/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html index e51837b6ffc785..995edac8da9d95 100644 --- a/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html +++ b/html/infrastructure/safe-passing-of-structured-data/structured_clone_bigint.html @@ -23,7 +23,7 @@ //the worker is used for each test in sequence //worker's callback will be set for each test //worker's internal onmessage echoes the data back to this thread through postMessage - worker = new Worker("./echo.js"); + worker = new Worker("./resources/echo-worker.js"); testCollection = [ function() { var t = async_test("Primitive BigInt is cloned"); diff --git a/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html b/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html index c9631a1fb75165..098283106ef87d 100644 --- a/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html +++ b/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html @@ -18,7 +18,7 @@ //the worker is used for each test in sequence //worker's callback will be set for each test //worker's internal onmessage echoes the data back to this thread through postMessage - worker = new Worker("./echo.js"); + worker = new Worker("./resources/echo-worker.js"); testCollection = [ function() { var t = async_test("Primitive string is cloned"); From cccc113aa287c3125be30eca81b106ca794cbfde Mon Sep 17 00:00:00 2001 From: Anne van Kesteren Date: Tue, 9 Jul 2019 14:17:28 +0200 Subject: [PATCH 3/3] use token() --- .../identity-not-preserved.html | 16 ++++++++++------ ...ed-cloning-error-stack-optional.sub.window.js | 7 +++---- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html index 11161ba8ab73d4..869f49043e9736 100644 --- a/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html +++ b/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/identity-not-preserved.html @@ -5,6 +5,7 @@ +
@@ -13,9 +14,10 @@ "use strict"; async_test(t => { + const testId = token(); const sab = new SharedArrayBuffer(1); window.addEventListener("message", t.step_func(({ data }) => { - if (data.testId !== 1) { + if (data.testId !== testId) { return; } @@ -24,15 +26,16 @@ t.done(); })); - window.postMessage({ sab, testId: 1 }, "*"); + window.postMessage({ testId, sab }, "*"); }, "postMessaging to this window does not give back the same SharedArrayBuffer (but does use the same backing block)"); async_test(t => { + const testId = token(); const sab = new SharedArrayBuffer(); const worker = new Worker("../resources/echo-worker.js"); worker.addEventListener("message", t.step_func(({ data }) => { - if (data.testId !== 2) { + if (data.testId !== testId) { return; } @@ -40,13 +43,14 @@ t.done(); })); - worker.postMessage({ testId: 2, sab }); + worker.postMessage({ testId, sab }); }, "postMessaging to a worker and back does not give back the same SharedArrayBuffer"); async_test(t => { + const testId = token(); const sab = new SharedArrayBuffer(); window.addEventListener("message", t.step_func(({ data }) => { - if (data.testId !== 3) { + if (data.testId !== testId) { return; } @@ -56,7 +60,7 @@ const iframe = document.createElement("iframe"); iframe.onload = t.step_func(() => { - iframe.contentWindow.postMessage({ testId: 3, sab }, "*"); + iframe.contentWindow.postMessage({ testId, sab }, "*"); }); iframe.src = "../resources/echo-iframe.html"; document.body.appendChild(iframe); diff --git a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js index ffd1376c738c46..2fb2f7d266096f 100644 --- a/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js +++ b/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js @@ -1,3 +1,5 @@ +// META: script=/common/utils.js + // .stack properties on errors are unspecified, but are present in most // browsers, most of the time. https://github.com/tc39/proposal-error-stacks/ tracks standardizing them. // Tests will pass automatically if the .stack property isn't present. @@ -52,11 +54,8 @@ function stackTests(errorFactory, description) { worker.postMessage(error); }, description + ' (worker)'); - // testId needed because they all share window's message event. - let testId = 0; async_test(t => { - const thisTestId = testId; - ++testId; + const thisTestId = token(); const error = errorFactory(); const originalStack = error.stack;