Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: SharedArrayBuffer structured cloning tests #5003

Merged
merged 25 commits into from
Apr 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
e621b44
Initial test
domenic Feb 23, 2017
a1e2045
Factor a bunch of stuff out
domenic Feb 23, 2017
622299b
Add popup test
domenic Feb 23, 2017
705b8ad
Add nested worker tests
domenic Feb 23, 2017
7c9df6d
Add deeply nested iframe test
domenic Feb 23, 2017
60a830b
Add tests that identity is not preserved accidentally
domenic Feb 23, 2017
357cac9
Add MessageChannel test; nobody passes this
domenic Feb 24, 2017
23c2de8
Add basic cross agent cluster test
annevk Apr 10, 2017
4ca7da1
Test similar-origin but not same-origin
domenic Apr 17, 2017
375f50d
Expand no-identity test to test postMessaging to yourself
domenic Apr 17, 2017
9f587b9
Update test metadata
domenic Apr 17, 2017
71316c2
Add service worker test and beef up shared worker test
domenic Apr 18, 2017
7349790
Test IDB, notifications API, and history
domenic Apr 18, 2017
dc17aa2
Update history changes to disallow cloning
domenic Apr 18, 2017
421a9d1
Add BroadcastChannel success test
domenic Apr 19, 2017
d375123
Revise BroadcastChannel test
domenic Apr 19, 2017
c32a32d
require HTTPS for service worker test
annevk Apr 26, 2017
676d88b
also test passing [sab] only to the transfer list throws
annevk Apr 26, 2017
be5acc0
BroadcastChannel that partially fails and partially succeeds
annevk Apr 26, 2017
916775e
Revert "BroadcastChannel that partially fails and partially succeeds"
annevk Apr 26, 2017
84918cc
replace two dots with hyphens
annevk Apr 26, 2017
867a5b3
Revert "Revert "BroadcastChannel that partially fails and partially s…
annevk Apr 27, 2017
950b32e
generalize at least one test for all views (easy to expand, not sure …
annevk Apr 27, 2017
ea639f2
also make DataView work
annevk Apr 27, 2017
e2679cc
Fixup to DataView
domenic Apr 27, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -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:[email protected]">
<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_true(i === 0 || i === 1 || i === 2, `Any message events must come from expected sources; got ${i}`);
++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>
Original file line number Diff line number Diff line change
@@ -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:[email protected]">
<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>
Original file line number Diff line number Diff line change
@@ -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:[email protected]">
<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>
Original file line number Diff line number Diff line change
@@ -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:[email protected]">
<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>
Original file line number Diff line number Diff line change
@@ -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();
Original file line number Diff line number Diff line change
@@ -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:[email protected]">
<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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<!DOCTYPE html>
<title>Used as a service worker-controlled iframe</title>
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const channel = new BroadcastChannel("anne was here");
channel.onmessageerror = ({ data }) => {
if(data === null) {
channel.postMessage("sw-success");
}
}
channel.postMessage("hi");
Original file line number Diff line number Diff line change
@@ -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");
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"use strict";

self.onmessage = ({ data }) => {
self.postMessage(data);
};
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -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>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"use strict";
importScripts("./test-incrementer.js");

self.onmessage = ({ data }) => {
// data will be a MessagePort
setupDestinationIncrementer(data, data);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
"use strict";
importScripts("./test-incrementer.js");

setupDestinationIncrementer(self, self);
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Nesting level 1</title>

<iframe src="nested-iframe-2.html"></iframe>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Nesting level 2</title>

<iframe src="nested-iframe-3.html"></iframe>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Nesting level 3</title>

<iframe src="nested-iframe-4-incrementer.html"></iframe>
Original file line number Diff line number Diff line change
@@ -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>
Loading