зеркало из https://github.com/mozilla/gecko-dev.git
162 строки
4.2 KiB
JavaScript
162 строки
4.2 KiB
JavaScript
let Cm = Components.manager;
|
|
|
|
let swm = Cc["@mozilla.org/serviceworkers/manager;1"].getService(
|
|
Ci.nsIServiceWorkerManager
|
|
);
|
|
|
|
const URI = "https://example.com/browser/dom/serviceworkers/test/empty.html";
|
|
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);
|
|
});
|