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");