85 lines
3.3 KiB
JavaScript
85 lines
3.3 KiB
JavaScript
// META: script=/common/utils.js
|
|
|
|
const sw_url = location.pathname.replace(/[^/]*$/, '') +
|
|
"./resources/serviceworker-partitioning-helper.js";
|
|
|
|
promise_test(async t => {
|
|
// Create 4 iframes (two normal and two credentialless ones) and register
|
|
// a serviceworker with the same scope and url in all of them.
|
|
//
|
|
// Registering the same service worker again with the same url and
|
|
// scope is a no-op. However, credentialless iframes get partitioned
|
|
// service workers, so we should have a total of 2 service workers
|
|
// at the end (one for the normal iframes and one for the credentialless
|
|
// ones).
|
|
let iframes = await Promise.all([
|
|
{ name: "normal", credentialless: false},
|
|
{ name: "normal_control", credentialless: false},
|
|
{ name: "credentialless", credentialless: true},
|
|
{ name: "credentialless_control", credentialless: true},
|
|
].map(async ({name, credentialless}) => {
|
|
|
|
let iframe = await new Promise(resolve => {
|
|
let iframe = document.createElement('iframe');
|
|
iframe.onload = () => resolve(iframe);
|
|
iframe.src = '/common/blank.html';
|
|
if (credentialless) iframe.credentialless = true;
|
|
document.body.append(iframe);
|
|
});
|
|
|
|
let sw = await new Promise(resolve => {
|
|
iframe.contentWindow.navigator.serviceWorker.register(sw_url)
|
|
.then(r => {
|
|
add_completion_callback(_ => r.unregister());
|
|
resolve(r.active || r.installing || r.waiting);
|
|
});
|
|
});
|
|
return { iframe: iframe, name: name, sw: sw };
|
|
}));
|
|
|
|
// Setup a MessageChannel for each pair (iframe, serviceworker).
|
|
// Ping each serviceworker telling him which iframe it belongs to.
|
|
iframes.forEach((iframe, i) => {
|
|
iframe.channel = new MessageChannel();
|
|
iframe.sw.postMessage({ from: iframe.name }, [iframe.channel.port2]);
|
|
});
|
|
|
|
let msg_promises = iframes.map(iframe => new Promise(resolve => {
|
|
iframe.channel.port1.onmessage = event => resolve(event.data);
|
|
}));
|
|
|
|
// Ping each (iframe, serviceworker) asking for which messages it got.
|
|
iframes.map(iframe => iframe.sw.postMessage({ check: iframe.name }));
|
|
|
|
// Collect all replies.
|
|
let msgs = await Promise.all(msg_promises);
|
|
|
|
// The "normal" iframe serviceworker belongs to the "normal" and the
|
|
// "normal_control" iframes.
|
|
assert_true(!!msgs[0]["normal"]);
|
|
assert_true(!!msgs[0]["normal_control"]);
|
|
assert_false(!!msgs[0]["credentialless"]);
|
|
assert_false(!!msgs[0]["credentialless_control"]);
|
|
|
|
// The "normal_control" iframe shares the same serviceworker as the "normal"
|
|
// iframe.
|
|
assert_true(!!msgs[1]["normal"]);
|
|
assert_true(!!msgs[1]["normal_control"]);
|
|
assert_false(!!msgs[1]["credentialless"]);
|
|
assert_false(!!msgs[1]["credentialless_control"]);
|
|
|
|
// The "credentialless" iframe serviceworker belongs to the "credentialless"
|
|
// and the "credentialless_control" iframes.
|
|
assert_false(!!msgs[2]["normal"]);
|
|
assert_false(!!msgs[2]["normal_control"]);
|
|
assert_true(!!msgs[2]["credentialless"]);
|
|
assert_true(!!msgs[2]["credentialless_control"]);
|
|
|
|
// The "credentialless_control" iframe shares the same serviceworker as the
|
|
// "credentialless" iframe.
|
|
assert_false(!!msgs[3]["normal"]);
|
|
assert_false(!!msgs[3]["normal_control"]);
|
|
assert_true(!!msgs[3]["credentialless"]);
|
|
assert_true(!!msgs[3]["credentialless_control"]);
|
|
|
|
}, "credentialless iframes get partitioned service workers.");
|