Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

let Cm = Components.manager;
let swm = Cc["@mozilla.org/serviceworkers/manager;1"].getService(
Ci.nsIServiceWorkerManager
);
const MOCK_CID = Components.ID("{2a0f83c4-8818-4914-a184-f1172b4eaaa7}");
const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";
const USER_CONTEXT_ID = 3;
let mockAlertsService = {
showAlert(alert, alertListener) {
ok(true, "Showing alert");
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(function () {
alertListener.observe(null, "alertshow", alert.cookie);
}, 100);
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(function () {
alertListener.observe(null, "alertclickcallback", alert.cookie);
}, 100);
},
showAlertNotification(
imageUrl,
title,
text,
textClickable,
cookie,
alertListener,
name,
dir,
lang,
data
) {
this.showAlert();
},
QueryInterface(aIID) {
if (aIID.equals(Ci.nsISupports) || aIID.equals(Ci.nsIAlertsService)) {
return this;
}
throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
},
createInstance(aIID) {
return this.QueryInterface(aIID);
},
};
registerCleanupFunction(() => {
Cm.QueryInterface(Ci.nsIComponentRegistrar).unregisterFactory(
MOCK_CID,
mockAlertsService
);
});
add_setup(async function () {
// make sure userContext, SW and notifications are enabled.
await SpecialPowers.pushPrefEnv({
set: [
["privacy.userContext.enabled", true],
["dom.serviceWorkers.exemptFromPerDomainMax", true],
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
["notification.prompt.testing", true],
["dom.serviceWorkers.disable_open_click_delay", 1000],
["dom.serviceWorkers.idle_timeout", 299999],
["dom.serviceWorkers.idle_extended_timeout", 299999],
["browser.link.open_newwindow", 3],
],
});
});
add_task(async function test() {
Cm.QueryInterface(Ci.nsIComponentRegistrar).registerFactory(
MOCK_CID,
"alerts service",
ALERTS_SERVICE_CONTRACT_ID,
mockAlertsService
);
// open the tab in the correct userContextId
let tab = BrowserTestUtils.addTab(gBrowser, URI, {
userContextId: USER_CONTEXT_ID,
});
let browser = gBrowser.getBrowserForTab(tab);
// select tab and make sure its browser is focused
gBrowser.selectedTab = tab;
tab.ownerGlobal.focus();
// wait for tab load
await BrowserTestUtils.browserLoaded(gBrowser.getBrowserForTab(tab));
// Waiting for new tab.
let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser, null, true);
// here the test.
/* eslint-disable no-shadow */
let uci = await SpecialPowers.spawn(browser, [URI], uri => {
let uci = content.document.nodePrincipal.userContextId;
// Registration of the SW
return (
content.navigator.serviceWorker
.register("file_userContextId_openWindow.js")
// Activation
.then(swr => {
return new content.window.Promise(resolve => {
let worker = swr.installing;
worker.addEventListener("statechange", () => {
if (worker.state === "activated") {
resolve(swr);
}
});
});
})
// Ask for an openWindow.
.then(swr => {
swr.showNotification("testPopup");
return uci;
})
);
});
/* eslint-enable no-shadow */
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
let newTab = await newTabPromise;
is(
newTab.getAttribute("usercontextid"),
USER_CONTEXT_ID,
"New tab has UCI equal " + USER_CONTEXT_ID
);
// wait for SW unregistration
/* eslint-disable no-shadow */
uci = await SpecialPowers.spawn(browser, [], () => {
let uci = content.document.nodePrincipal.userContextId;
return content.navigator.serviceWorker
.getRegistration(".")
.then(registration => {
return registration.unregister();
})
.then(() => {
return uci;
});
});
/* eslint-enable no-shadow */
is(uci, USER_CONTEXT_ID, "Tab runs with UCI " + USER_CONTEXT_ID);
BrowserTestUtils.removeTab(newTab);
BrowserTestUtils.removeTab(tab);
});