Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

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