| // META: script=/common/utils.js |
| |
| const sw_url = location.pathname.replace(/[^/]*$/, '') + |
| "./resources/sharedworker-partitioning-helper.js"; |
| |
| promise_test(async t => { |
| // Create 4 iframes (two normal and two credentialless ones) and create |
| // a shared worker with the same url in all of them. |
| // |
| // Creating the same shared worker again with the same url is a |
| // no-op. However, credentialless iframes get partitioned shared workers, |
| // so we should have a total of 2 shared 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 = new iframe.contentWindow.SharedWorker(sw_url); |
| return { iframe: iframe, name: name, sw: sw }; |
| })); |
| |
| // Ping each worker telling him which iframe it belongs to. |
| await Promise.all(iframes.map(iframe => { |
| iframe.sw.port.postMessage({ action: 'record', from: iframe.name}); |
| return new Promise(resolve => { |
| iframe.sw.port.onmessage = event => { |
| if (event.data.ack === iframe.name) resolve(); |
| } |
| }); |
| })); |
| |
| // Ping each (iframe, sharedworker) asking for which messages it got. |
| let msgs = await Promise.all(iframes.map(iframe => { |
| iframe.sw.port.postMessage({ action: 'retrieve', from: iframe.name }); |
| return new Promise(resolve => { |
| iframe.sw.port.onmessage = event => { |
| if (event.data.ack === iframe.name) resolve(event.data.messages); |
| } |
| }); |
| })); |
| |
| // The "normal" iframe sharedworker belongs to the "normal" and the |
| // "normal_control" iframes. |
| assert_true(!!msgs[0]["normal"] && |
| !!msgs[0]["normal_control"] && |
| !msgs[0]["credentialless"] && |
| !msgs[0]["credentialless_control"], |
| 'The "normal" iframe\'s sharedworker should return ' + |
| '{"normal": true, "normal_control": true}, ' + |
| 'but instead returned ' + JSON.stringify(msgs[0])); |
| |
| // The "normal_control" iframe shares the same sharedworker as the "normal" |
| // iframe. |
| assert_true(!!msgs[1]["normal"] && |
| !!msgs[1]["normal_control"] && |
| !msgs[1]["credentialless"] && |
| !msgs[1]["credentialless_control"], |
| 'The "normal_control" iframe\'s sharedworker should return ' + |
| '{"normal": true, "normal_control": true}, ' + |
| 'but instead returned ' + JSON.stringify(msgs[1])); |
| |
| // The "credentialless" iframe sharedworker belongs to the "credentialless" and the |
| // "credentialless_control" iframes. |
| assert_true(!msgs[2]["normal"] && |
| !msgs[2]["normal_control"] && |
| !!msgs[2]["credentialless"] && |
| !!msgs[2]["credentialless_control"], |
| 'The "credentialless" iframe\'s sharedworker should return ' + |
| '{"credentialless": true, "credentialless_control": true}, ' + |
| 'but instead returned ' + JSON.stringify(msgs[2])); |
| |
| // The "credentialless_control" iframe shares the same sharedworker as |
| // the "credentialless" iframe. |
| assert_true(!msgs[3]["normal"] && |
| !msgs[3]["normal_control"] && |
| !!msgs[3]["credentialless"] && |
| !!msgs[3]["credentialless_control"], |
| 'The "credentialless_control" iframe\'s sharedworker should return ' + |
| '{"credentialless": true, "credentialless_control": true}, ' + |
| 'but instead returned ' + JSON.stringify(msgs[3])); |
| |
| }, "credentialless iframes get partitioned shared workers."); |