mirror of
https://github.com/servo/servo.git
synced 2025-08-15 10:25:32 +01:00
Update web-platform-tests to revision a46616a5b18e83587ddbbed756c7b96cbb4b015d
This commit is contained in:
parent
3f07cfec7c
commit
578498ba24
4001 changed files with 159517 additions and 30260 deletions
|
@ -0,0 +1,35 @@
|
|||
<!doctype html>
|
||||
<title>SharedArrayBuffer cannot cross agent clusters, BroadcastChannel edition</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script>
|
||||
async_test(t => {
|
||||
const channel = new BroadcastChannel("anne was here"),
|
||||
dw = new Worker("resources/broadcastchannel-worker.js"),
|
||||
sw = new SharedWorker("resources/broadcastchannel-sharedworker.js");
|
||||
let startCounter = 0,
|
||||
dwStatus = "unknown",
|
||||
swStatus = "unknown";
|
||||
|
||||
channel.onmessage = t.step_func(({ data }) => {
|
||||
if(data === "hi") {
|
||||
startCounter++;
|
||||
if(startCounter === 2) {
|
||||
const sab = new SharedArrayBuffer();
|
||||
channel.postMessage(sab);
|
||||
} else if(startCounter > 2) {
|
||||
assert_unreached();
|
||||
}
|
||||
} else if(data === "dw-success") {
|
||||
dwStatus = "success";
|
||||
} else if(data === "sw-success") {
|
||||
swStatus = "success";
|
||||
} else {
|
||||
assert_unreached();
|
||||
}
|
||||
if(dwStatus === "success" && swStatus === "success") {
|
||||
t.done();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,58 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers: BroadcastChannel within the same agent cluster</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#broadcasting-to-other-browsing-contexts">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
promise_test(t => {
|
||||
return Promise.all([
|
||||
createIFrame("resources/broadcastchannel-iframe.html"),
|
||||
createIFrame("resources/broadcastchannel-iframe.html"),
|
||||
createIFrame("resources/broadcastchannel-iframe.html")
|
||||
]).then(() => {
|
||||
const sab = new SharedArrayBuffer(3);
|
||||
const view = new Uint8Array(sab);
|
||||
const channel = new BroadcastChannel("channel name");
|
||||
|
||||
return new Promise(resolve => {
|
||||
let soFar = 0;
|
||||
channel.onmessage = t.step_func(({ data: { sab: broadcastSAB, i } }) => {
|
||||
if (broadcastSAB) {
|
||||
// We only care about "broadcasts" from the workers.
|
||||
return;
|
||||
}
|
||||
|
||||
assert_in_array(i, [0, 1, 2], "Any message events must come from expected sources");
|
||||
++soFar;
|
||||
|
||||
if (soFar === 3) {
|
||||
assert_equals(view[0], 1, "The first iframe must have set view[0] to 1");
|
||||
assert_equals(view[1], 2, "The second iframe must have set view[1] to 2");
|
||||
assert_equals(view[2], 3, "The third iframe must have set view[2] to 3");
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
|
||||
channel.postMessage({ sab });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
function createIFrame(src) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.src = src;
|
||||
iframe.onload = () => resolve(iframe);
|
||||
iframe.onerror = () => reject(`iframe with URL ${src} failed to load`);
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,64 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>SharedArrayBuffers, when cloned, do not give back the same object</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-sab.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
async_test(t => {
|
||||
const sab = new SharedArrayBuffer(1);
|
||||
window.addEventListener("message", t.step_func(({ data }) => {
|
||||
if (data.testId !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
assertSABsHaveSameBackingBlock(sab, data.sab);
|
||||
|
||||
t.done();
|
||||
}));
|
||||
|
||||
window.postMessage({ sab, testId: 1 }, "*");
|
||||
}, "postMessaging to this window does not give back the same SharedArrayBuffer (but does use the same backing block)");
|
||||
|
||||
async_test(t => {
|
||||
const sab = new SharedArrayBuffer();
|
||||
const worker = new Worker("resources/echo-worker.js");
|
||||
|
||||
worker.addEventListener("message", t.step_func(({ data }) => {
|
||||
if (data.testId !== 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert_not_equals(data.sab, sab);
|
||||
t.done();
|
||||
}));
|
||||
|
||||
worker.postMessage({ testId: 2, sab });
|
||||
}, "postMessaging to a worker and back does not give back the same SharedArrayBuffer");
|
||||
|
||||
async_test(t => {
|
||||
const sab = new SharedArrayBuffer();
|
||||
window.addEventListener("message", t.step_func(({ data }) => {
|
||||
if (data.testId !== 3) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert_not_equals(data.sab, sab);
|
||||
t.done();
|
||||
}));
|
||||
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.onload = t.step_func(() => {
|
||||
iframe.contentWindow.postMessage({ testId: 3, sab }, "*");
|
||||
});
|
||||
iframe.src = "resources/echo-iframe.html";
|
||||
document.body.appendChild(iframe);
|
||||
}, "postMessaging to an iframe and back does not give back the same SharedArrayBuffer");
|
||||
</script>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers into a dedicated worker nested inside a dedicated worker</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
fetch_tests_from_worker(new Worker("nested-worker-success.js"));
|
||||
</script>
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers into a dedicated worker nested inside a shared worker</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
fetch_tests_from_worker(new SharedWorker("nested-worker-success.js"));
|
||||
</script>
|
|
@ -0,0 +1,11 @@
|
|||
"use strict";
|
||||
importScripts("/resources/testharness.js");
|
||||
importScripts("resources/test-incrementer.js");
|
||||
|
||||
promise_test(t => {
|
||||
const worker = new Worker("resources/incrementer-worker.js");
|
||||
|
||||
return testSharingViaIncrementerScript(t, worker, "parent worker", worker, "sub-worker");
|
||||
}, "postMessaging to a dedicated sub-worker allows them to see each others' modifications");
|
||||
|
||||
done();
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>SharedArrayBuffers cannot be transferred</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/#structuredclone">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
test(() => {
|
||||
const sab = new SharedArrayBuffer();
|
||||
assert_throws("DataCloneError", () => window.postMessage(sab, "*", [sab]));
|
||||
assert_throws("DataCloneError", () => window.postMessage("test", "*", [sab]));
|
||||
}, "Trying to transfer a SharedArrayBuffer to this window throws");
|
||||
|
||||
test(() => {
|
||||
const sab = new SharedArrayBuffer();
|
||||
const worker = new Worker("resources/incrementer.js");
|
||||
assert_throws("DataCloneError", () => worker.postMessage(sab, [sab]));
|
||||
assert_throws("DataCloneError", () => worker.postMessage("test", [sab]));
|
||||
}, "Trying to transfer a SharedArrayBuffer to a worker throws");
|
||||
|
||||
test(() => {
|
||||
const sab = new SharedArrayBuffer();
|
||||
const channel = new MessageChannel();
|
||||
assert_throws("DataCloneError", () => channel.port1.postMessage(sab, [sab]));
|
||||
assert_throws("DataCloneError", () => channel.port1.postMessage("test", [sab]));
|
||||
}, "Trying to transfer a SharedArrayBuffer through a MessagePort throws");
|
||||
</script>
|
|
@ -0,0 +1,2 @@
|
|||
<!DOCTYPE html>
|
||||
<title>Used as a service worker-controlled iframe</title>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that messes with a given SharedArrayBuffer sent from a BroadcastChannel</title>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
const channel = new BroadcastChannel("channel name");
|
||||
|
||||
channel.onmessage = ({ data: { sab, i }, source }) => {
|
||||
if (!sab) {
|
||||
// We only care about "broadcasts" from the window
|
||||
return;
|
||||
}
|
||||
|
||||
const view = new Uint8Array(sab);
|
||||
view[i] = i + 1;
|
||||
channel.postMessage({ i });
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,7 @@
|
|||
const channel = new BroadcastChannel("anne was here");
|
||||
channel.onmessageerror = ({ data }) => {
|
||||
if(data === null) {
|
||||
channel.postMessage("sw-success");
|
||||
}
|
||||
}
|
||||
channel.postMessage("hi");
|
|
@ -0,0 +1,9 @@
|
|||
const channel = new BroadcastChannel("anne was here");
|
||||
channel.onmessage = ({ data }) => {
|
||||
if(data === "hi" || data === "sw-success") {
|
||||
return;
|
||||
} else if(data instanceof SharedArrayBuffer) {
|
||||
channel.postMessage("dw-success");
|
||||
}
|
||||
}
|
||||
channel.postMessage("hi");
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that echos back anything postMessaged to it to its parent</title>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
window.onmessage = ({ data }) => {
|
||||
parent.postMessage(data, "*");
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,5 @@
|
|||
"use strict";
|
||||
|
||||
self.onmessage = ({ data }) => {
|
||||
self.postMessage(data);
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that messes with a given SharedArrayBuffer and also sets document.domain</title>
|
||||
<script src="test-incrementer.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
document.domain = "{{host}}";
|
||||
setupDestinationIncrementer(self, parent, "*");
|
||||
</script>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that messes with a given SharedArrayBuffer</title>
|
||||
<script src="test-incrementer.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
setupDestinationIncrementer(self, parent, "*");
|
||||
</script>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that messes with a given SharedArrayBuffer</title>
|
||||
<script src="test-incrementer.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
setupDestinationIncrementer(self, opener, "*");
|
||||
</script>
|
|
@ -0,0 +1,7 @@
|
|||
"use strict";
|
||||
importScripts("./test-incrementer.js");
|
||||
|
||||
self.onmessage = ({ data }) => {
|
||||
// data will be a MessagePort
|
||||
setupDestinationIncrementer(data, data);
|
||||
};
|
|
@ -0,0 +1,4 @@
|
|||
"use strict";
|
||||
importScripts("./test-incrementer.js");
|
||||
|
||||
setupDestinationIncrementer(self, self);
|
|
@ -0,0 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Nesting level 1</title>
|
||||
|
||||
<iframe src="nested-iframe-2.html"></iframe>
|
|
@ -0,0 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Nesting level 2</title>
|
||||
|
||||
<iframe src="nested-iframe-3.html"></iframe>
|
|
@ -0,0 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Nesting level 3</title>
|
||||
|
||||
<iframe src="nested-iframe-4-incrementer.html"></iframe>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>A test page that messes with a given SharedArrayBuffer, nested 4 levels deep in iframes</title>
|
||||
<script src="test-incrementer.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
setupDestinationIncrementer(self, parent.parent.parent.parent.parent, "*");
|
||||
</script>
|
|
@ -0,0 +1,32 @@
|
|||
"use strict";
|
||||
self.importScripts("/resources/testharness.js");
|
||||
|
||||
let state = "start in worker";
|
||||
|
||||
self.onmessage = e => {
|
||||
if (e.data === "start in window") {
|
||||
assert_equals(state, "start in worker");
|
||||
e.source.postMessage(state);
|
||||
state = "we are expecting a messageerror due to the window sending us a SAB";
|
||||
} else if (e.data === "we are expecting a messageerror due to the worker sending us a SAB") {
|
||||
assert_equals(state, "onmessageerror was received in worker");
|
||||
e.source.postMessage(new SharedArrayBuffer());
|
||||
state = "done in worker";
|
||||
} else {
|
||||
e.source.postMessage(`worker onmessage was reached when in state "${state}" and data ${e.data}`);
|
||||
}
|
||||
};
|
||||
|
||||
self.onmessageerror = e => {
|
||||
if (state === "we are expecting a messageerror due to the window sending us a SAB") {
|
||||
assert_equals(e.data, null, "data");
|
||||
assert_equals(e.origin, self.origin, "origin");
|
||||
assert_not_equals(e.source, null, "source");
|
||||
assert_equals(e.ports.length, 0, "ports length");
|
||||
|
||||
state = "onmessageerror was received in worker";
|
||||
e.source.postMessage(state);
|
||||
} else {
|
||||
e.source.postMessage(`worker onmessageerror was reached when in state "${state}" and data ${e.data}`);
|
||||
}
|
||||
};
|
|
@ -0,0 +1,17 @@
|
|||
let state = "send-sw-failure"
|
||||
onconnect = initialE => {
|
||||
initialE.source.postMessage(state)
|
||||
initialE.source.onmessage = e => {
|
||||
if(state === "" && e.data === "send-window-failure") {
|
||||
e.postMessage(new SharedArrayBuffer())
|
||||
} else {
|
||||
e.postMessage("failure")
|
||||
}
|
||||
}
|
||||
initialE.source.onmessageerror = e => {
|
||||
if(state === "send-sw-failure") {
|
||||
e.postMessage("send-sw-failure-success")
|
||||
state = ""
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
"use strict";
|
||||
|
||||
self.getViewValue = (view, index) => {
|
||||
if(view instanceof DataView) {
|
||||
return view.getInt8(index);
|
||||
}
|
||||
return view[index];
|
||||
};
|
||||
|
||||
self.setViewValue = (view, index, value) => {
|
||||
if(view instanceof DataView) {
|
||||
view.setInt8(index, value);
|
||||
} else {
|
||||
view[index] = value;
|
||||
}
|
||||
};
|
||||
|
||||
self.testSharingViaIncrementerScript = (t, whereToListen, whereToListenLabel, whereToSend, whereToSendLabel, origin, type = "Int32Array") => {
|
||||
return new Promise(resolve => {
|
||||
const sab = new SharedArrayBuffer(8);
|
||||
const view = new self[type](sab);
|
||||
setViewValue(view, 0, 1);
|
||||
|
||||
whereToListen.onmessage = t.step_func(({ data }) => {
|
||||
switch (data.message) {
|
||||
case "initial payload received": {
|
||||
assert_equals(data.value, 1, `The ${whereToSendLabel} must see the same value in the SharedArrayBuffer`);
|
||||
break;
|
||||
}
|
||||
|
||||
case "changed to 2": {
|
||||
assert_equals(getViewValue(view, 0), 2, `The ${whereToListenLabel} must see changes made in the ${whereToSendLabel}`);
|
||||
|
||||
setViewValue(view, 0, 3);
|
||||
whereToSend.postMessage({ message: "changed to 3" }, origin);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "changed to 3 received": {
|
||||
assert_equals(data.value, 3, `The ${whereToSendLabel} must see changes made in the ${whereToListenLabel}`);
|
||||
resolve();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
whereToSend.postMessage({ message: "initial payload", view }, origin);
|
||||
});
|
||||
};
|
||||
|
||||
self.setupDestinationIncrementer = (whereToListen, whereToSendBackTo, origin) => {
|
||||
let view;
|
||||
whereToListen.onmessage = ({ data }) => {
|
||||
switch (data.message) {
|
||||
case "initial payload": {
|
||||
view = data.view;
|
||||
whereToSendBackTo.postMessage({ message: "initial payload received", value: getViewValue(view, 0) }, origin);
|
||||
|
||||
setViewValue(view, 0, 2);
|
||||
whereToSendBackTo.postMessage({ message: "changed to 2" }, origin);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case "changed to 3": {
|
||||
whereToSendBackTo.postMessage({ message: "changed to 3 received", value: getViewValue(view, 0) }, origin);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
"use strict";
|
||||
|
||||
self.assertSABsHaveSameBackingBlock = (originalSAB, clonedSAB) => {
|
||||
const originalView = new Uint8Array(originalSAB);
|
||||
const clonedView = new Uint8Array(clonedSAB);
|
||||
|
||||
assert_not_equals(originalSAB, clonedSAB, "the clone must not be the same object");
|
||||
|
||||
assert_equals(originalView[0], 0, "originalView[0] starts 0");
|
||||
assert_equals(clonedView[0], 0, "clonedView[0] starts 0");
|
||||
|
||||
originalView[0] = 5;
|
||||
assert_equals(originalView[0], 5, "originalView[0] ends up 5");
|
||||
assert_equals(clonedView[0], 5, "clonedView[0] ends up 5");
|
||||
};
|
|
@ -0,0 +1,36 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>SharedArrayBuffers cloning via history's methods invoking StructuredSerializeForStorage</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserializeforstorage">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-history-pushstate">
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-history-replacestate">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
for (const method of ["pushState", "replaceState"]) {
|
||||
test(() => {
|
||||
assert_throws("DataCloneError", () => {
|
||||
history[method](new SharedArrayBuffer(), "dummy title");
|
||||
});
|
||||
}, `history.${method}(): simple case`);
|
||||
|
||||
test(() => {
|
||||
let getter1Called = false;
|
||||
let getter2Called = false;
|
||||
assert_throws("DataCloneError", () => {
|
||||
history[method]([
|
||||
{ get x() { getter1Called = true; return 5; } },
|
||||
new SharedArrayBuffer(),
|
||||
{ get x() { getter2Called = true; return 5; } }
|
||||
], "dummy title");
|
||||
});
|
||||
|
||||
assert_true(getter1Called, "The getter before the SAB must have been called");
|
||||
assert_false(getter2Called, "The getter after the SAB must not have been called");
|
||||
}, `history.${method}(): is interleaved correctly`);
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,40 @@
|
|||
// META: script=/IndexedDB/support.js
|
||||
"use strict";
|
||||
|
||||
async_test(t => {
|
||||
const openReq = createdb(t);
|
||||
|
||||
openReq.onupgradeneeded = e => {
|
||||
const db = e.target.result;
|
||||
const store = db.createObjectStore("store", { keyPath: "key" });
|
||||
|
||||
assert_throws("DataCloneError", () => {
|
||||
store.put({ key: 1, property: new SharedArrayBuffer() });
|
||||
});
|
||||
t.done();
|
||||
};
|
||||
}, "SharedArrayBuffer cloning via IndexedDB: basic case");
|
||||
|
||||
async_test(t => {
|
||||
const openReq = createdb(t);
|
||||
|
||||
openReq.onupgradeneeded = e => {
|
||||
const db = e.target.result;
|
||||
const store = db.createObjectStore("store", { keyPath: "key" });
|
||||
|
||||
let getter1Called = false;
|
||||
let getter2Called = false;
|
||||
|
||||
assert_throws("DataCloneError", () => {
|
||||
store.put({ key: 1, property: [
|
||||
{ get x() { getter1Called = true; return 5; } },
|
||||
new SharedArrayBuffer(),
|
||||
{ get x() { getter2Called = true; return 5; } }
|
||||
]});
|
||||
});
|
||||
|
||||
assert_true(getter1Called, "The getter before the SAB must have been called");
|
||||
assert_false(getter2Called, "The getter after the SAB must not have been called");
|
||||
t.done();
|
||||
};
|
||||
}, "SharedArrayBuffer cloning via the IndexedDB: is interleaved correctly");
|
|
@ -0,0 +1,23 @@
|
|||
"use strict";
|
||||
|
||||
test(() => {
|
||||
assert_throws("DataCloneError", () => {
|
||||
new Notification("Bob: Hi", { data: new SharedArrayBuffer() });
|
||||
})
|
||||
}, "SharedArrayBuffer cloning via the Notifications API's data member: basic case");
|
||||
|
||||
test(() => {
|
||||
let getter1Called = false;
|
||||
let getter2Called = false;
|
||||
|
||||
assert_throws("DataCloneError", () => {
|
||||
new Notification("Bob: Hi", { data: [
|
||||
{ get x() { getter1Called = true; return 5; } },
|
||||
new SharedArrayBuffer(),
|
||||
{ get x() { getter2Called = true; return 5; } }
|
||||
]});
|
||||
});
|
||||
|
||||
assert_true(getter1Called, "The getter before the SAB must have been called");
|
||||
assert_false(getter2Called, "The getter after the SAB must not have been called");
|
||||
}, "SharedArrayBuffer cloning via the Notifications API's data member: is interleaved correctly");
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers into same-origin-domain windows</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-incrementer.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
document.domain = "{{host}}";
|
||||
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.onload = t.step_func(() => {
|
||||
resolve(testSharingViaIncrementerScript(t, window, "window", iframe.contentWindow, "iframe", "*"));
|
||||
});
|
||||
iframe.src = "//{{domains[www1]}}:{{location[port]}}/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe-domain.sub.html";
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}, "postMessaging to a same-origin-domain (but not same-origin) iframe allows them to see each others' modifications");
|
||||
</script>
|
|
@ -0,0 +1,22 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers using MessageChannel</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-incrementer.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
promise_test(t => {
|
||||
const worker = new Worker("resources/incrementer-worker-with-channel.js");
|
||||
const channel = new MessageChannel();
|
||||
worker.postMessage(channel.port2, [channel.port2]);
|
||||
|
||||
return testSharingViaIncrementerScript(t, channel.port1, "window", channel.port1, "worker");
|
||||
}, "postMessaging to a dedicated worker via MessageChannel allows them to see each others' modifications");
|
||||
</script>
|
|
@ -0,0 +1,54 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>SharedArrayBuffer cannot cross agent clusters, service worker edition</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
promise_test(t => {
|
||||
const scope = "resources/blank.html";
|
||||
return service_worker_unregister_and_register(t, "resources/serviceworker-failure.js", scope).then(reg => {
|
||||
return wait_for_state(t, reg.installing, "activated");
|
||||
})
|
||||
.then(() => {
|
||||
return with_iframe(scope);
|
||||
}).then(iframe => {
|
||||
const sw = iframe.contentWindow.navigator.serviceWorker;
|
||||
let state = "start in window";
|
||||
|
||||
return new Promise(resolve => {
|
||||
sw.onmessage = t.step_func(e => {
|
||||
if (e.data === "start in worker") {
|
||||
assert_equals(state, "start in window");
|
||||
sw.controller.postMessage(new SharedArrayBuffer());
|
||||
state = "we are expecting confirmation of an onmessageerror in the worker";
|
||||
} else if (e.data === "onmessageerror was received in worker") {
|
||||
assert_equals(state, "we are expecting confirmation of an onmessageerror in the worker");
|
||||
state = "we are expecting a messageerror due to the worker sending us a SAB";
|
||||
sw.controller.postMessage(state);
|
||||
} else {
|
||||
assert_unreached("Got an unexpected message from the service worker: " + e.data);
|
||||
}
|
||||
});
|
||||
|
||||
sw.onmessageerror = t.step_func(e => {
|
||||
assert_equals(state, "we are expecting a messageerror due to the worker sending us a SAB");
|
||||
|
||||
assert_equals(e.data, null, "data");
|
||||
assert_equals(e.origin, self.origin, "origin");
|
||||
assert_equals(e.source, null, "source");
|
||||
assert_equals(e.ports.length, 0, "ports length");
|
||||
|
||||
state = "done in window";
|
||||
resolve();
|
||||
});
|
||||
|
||||
sw.controller.postMessage(state);
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -0,0 +1,31 @@
|
|||
<!doctype html>
|
||||
<title>SharedArrayBuffer cannot cross agent clusters, shared worker edition</title>
|
||||
<script src=/resources/testharness.js></script>
|
||||
<script src=/resources/testharnessreport.js></script>
|
||||
<script>
|
||||
async_test(t => {
|
||||
const sw = new SharedWorker("resources/sharedworker-failure.js")
|
||||
let state = ""
|
||||
sw.port.onmessage = t.step_func(e => {
|
||||
if(e.data === "send-sw-failure") {
|
||||
sw.port.postMessage(new SharedArrayBuffer())
|
||||
} else if(e.data === "send-sw-failure-success") {
|
||||
state = "send-window-failure"
|
||||
sw.port.postMessage(state)
|
||||
} else {
|
||||
assert_unreached()
|
||||
}
|
||||
})
|
||||
sw.port.onmessageerror = t.step_func(e => {
|
||||
if(state === "send-window-failure") {
|
||||
assert_equals(e.data, null, "data")
|
||||
assert_equals(e.origin, "", "origin")
|
||||
assert_equals(e.source, null, "source")
|
||||
assert_equals(e.ports.length, 0, "ports length")
|
||||
t.done()
|
||||
} else {
|
||||
assert_unreached()
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers to similar-origin, but not same-origin, windows</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-incrementer.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
document.domain = "{{host}}";
|
||||
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.onload = t.step_func(() => {
|
||||
resolve(testSharingViaIncrementerScript(t, window, "window", iframe.contentWindow, "iframe", "*"));
|
||||
});
|
||||
iframe.src = "//{{domains[www1]}}:{{location[port]}}/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/incrementer-iframe.html";
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}, "postMessaging to a not same-origin-domain, but similar origin, iframe allows them to see each others' modifications");
|
||||
</script>
|
|
@ -0,0 +1,70 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<title>Structured cloning of SharedArrayBuffers: simple success cases that don't need dedicated files</title>
|
||||
<link rel="help" href="https://html.spec.whatwg.org/multipage/#structuredserialize">
|
||||
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="resources/test-incrementer.js"></script>
|
||||
|
||||
<div id="log"></div>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
[
|
||||
"DataView",
|
||||
"Int8Array",
|
||||
"Uint8Array",
|
||||
"Uint8ClampedArray",
|
||||
"Int16Array",
|
||||
"Uint16Array",
|
||||
"Int32Array",
|
||||
"Uint32Array",
|
||||
"Float32Array",
|
||||
"Float64Array"
|
||||
].forEach(type => {
|
||||
promise_test(t => {
|
||||
const worker = new Worker("resources/incrementer-worker.js");
|
||||
|
||||
return testSharingViaIncrementerScript(t, worker, "window", worker, "worker", undefined, type);
|
||||
}, "postMessaging to a dedicated worker allows them to see each others' modifications with " + type);
|
||||
});
|
||||
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.onload = t.step_func(() => {
|
||||
resolve(testSharingViaIncrementerScript(t, window, "window", iframe.contentWindow, "iframe", "*"));
|
||||
});
|
||||
iframe.src = "resources/incrementer-iframe.html";
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}, "postMessaging to a same-origin iframe allows them to see each others' modifications");
|
||||
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const iframe = document.createElement("iframe");
|
||||
iframe.onload = t.step_func(() => {
|
||||
const level1 = iframe.contentWindow;
|
||||
const level2 = level1.frames[0];
|
||||
const level3 = level2.frames[0];
|
||||
const targetWindow = level3.frames[0];
|
||||
resolve(testSharingViaIncrementerScript(t, window, "window", targetWindow, "nested iframe", "*"));
|
||||
});
|
||||
iframe.src = "resources/nested-iframe-1.html";
|
||||
document.body.appendChild(iframe);
|
||||
});
|
||||
}, "postMessaging to a same-origin deeply-nested iframe allows them to see each others' modifications");
|
||||
|
||||
promise_test(t => {
|
||||
return new Promise(resolve => {
|
||||
const w = window.open("resources/incrementer-popup.html");
|
||||
w.onload = t.step_func(() => {
|
||||
resolve(testSharingViaIncrementerScript(t, window, "window", w, "popup window", "*").then(() => {
|
||||
w.close();
|
||||
}));
|
||||
});
|
||||
});
|
||||
}, "postMessaging to a same-origin opened window allows them to see each others' modifications");
|
||||
</script>
|
|
@ -85,7 +85,7 @@ onload = function() {
|
|||
}
|
||||
|
||||
('iframe src, a href, base href, link href, img src, embed src, object data, track src, video src, audio src, input src, form action, ' +
|
||||
'input formaction formAction, button formaction formAction, menuitem icon, script src').split(', ').forEach(function(str) {
|
||||
'input formaction formAction, button formaction formAction, script src').split(', ').forEach(function(str) {
|
||||
var arr = str.split(' ');
|
||||
test_reflecting(arr[0], arr[1], arr[2]);
|
||||
});
|
||||
|
@ -292,7 +292,6 @@ onload = function() {
|
|||
});
|
||||
|
||||
// XXX test <img srcset> or its successor
|
||||
// <menuitem icon> could also be tested but the spec doesn't require it to be loaded...
|
||||
|
||||
// loading video
|
||||
function test_load_video(tag, use_source_element) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue