diff options
Diffstat (limited to 'browser/components/contextualidentity/test/browser/browser_broadcastchannel.js')
-rw-r--r-- | browser/components/contextualidentity/test/browser/browser_broadcastchannel.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/browser/components/contextualidentity/test/browser/browser_broadcastchannel.js b/browser/components/contextualidentity/test/browser/browser_broadcastchannel.js new file mode 100644 index 0000000000..0bb27f1146 --- /dev/null +++ b/browser/components/contextualidentity/test/browser/browser_broadcastchannel.js @@ -0,0 +1,85 @@ +const BASE_ORIGIN = "http://example.com"; +const URI = + BASE_ORIGIN + + "/browser/browser/components/contextualidentity/test/browser/empty_file.html"; + +// Opens `uri' in a new tab with the provided userContextId and focuses it. +// Returns the newly opened tab and browser. +async function openTabInUserContext(uri, userContextId) { + // open the tab in the correct userContextId + let tab = BrowserTestUtils.addTab(gBrowser, uri, { userContextId }); + + // select tab and make sure its browser is focused + gBrowser.selectedTab = tab; + tab.ownerGlobal.focus(); + + let browser = gBrowser.getBrowserForTab(tab); + await BrowserTestUtils.browserLoaded(browser); + return { tab, browser }; +} + +async function runTestForReceiver(receiver) { + let channelName = "contextualidentity-broadcastchannel"; + + // reflect the received message on title + await SpecialPowers.spawn(receiver.browser, [channelName], function (name) { + content.window.testPromise = new content.window.Promise(resolve => { + content.window.bc = new content.window.BroadcastChannel(name); + content.window.bc.onmessage = function (e) { + content.document.title += e.data; + resolve(); + }; + }); + }); + + let sender1 = await openTabInUserContext(URI, 1); + let sender2 = await openTabInUserContext(URI, 2); + sender1.message = "Message from user context #1"; + sender2.message = "Message from user context #2"; + + // send a message from a tab in different user context first + // then send a message from a tab in the same user context + for (let sender of [sender1, sender2]) { + await SpecialPowers.spawn( + sender.browser, + [{ name: channelName, message: sender.message }], + function (opts) { + let bc = new content.window.BroadcastChannel(opts.name); + bc.postMessage(opts.message); + } + ); + } + + // Since sender1 sends before sender2, if the title is exactly + // sender2's message, sender1's message must've been blocked + await SpecialPowers.spawn( + receiver.browser, + [sender2.message], + async function (message) { + await content.window.testPromise.then(function () { + is( + content.document.title, + message, + "should only receive messages from the same user context" + ); + }); + } + ); + + gBrowser.removeTab(sender1.tab); + gBrowser.removeTab(sender2.tab); +} + +add_setup(async function () { + // make sure userContext is enabled. + await SpecialPowers.pushPrefEnv({ + set: [["privacy.userContext.enabled", true]], + }); +}); + +add_task(async function test() { + info("Checking broadcast channel with browser tab receiver"); + let receiver = await openTabInUserContext(URI, 2); + await runTestForReceiver(receiver); + gBrowser.removeTab(receiver.tab); +}); |