Source code
Revision control
Copy as Markdown
Other Tools
/* Any copyright is dedicated to the Public Domain.
/* eslint no-unused-vars: [2, {"vars": "local"}] */
"use strict";
// Load the shared-head file first.
Services.scriptloader.loadSubScript(
this
);
// Cleanup preferences that may be set by tests when interacting with the UI
registerCleanupFunction(function () {
Services.prefs.clearUserPref("devtools.application.selectedSidebar");
});
/**
* Set all preferences needed to enable service worker debugging and testing.
*/
async function enableServiceWorkerDebugging() {
// Enable service workers.
await pushPref("dom.serviceWorkers.enabled", true);
// Accept workers from mochitest's http.
await pushPref("dom.serviceWorkers.testing.enabled", true);
// SW debugging in multi-e10s.
await pushPref("dom.ipc.processCount", 1);
// Disable randomly spawning processes during tests
await pushPref("dom.ipc.processPrelaunch.enabled", false);
// Wait for dom.ipc.processCount to be updated before releasing processes.
Services.ppmm.releaseCachedProcesses();
}
async function enableApplicationPanel() {
const { PromiseTestUtils } = ChromeUtils.importESModule(
);
PromiseTestUtils.allowMatchingRejectionsGlobally(
/this._frontCreationListeners is null/
);
// Enable all preferences related to service worker debugging.
await enableServiceWorkerDebugging();
// Enable web manifest processing.
Services.prefs.setBoolPref("dom.manifest.enabled", true);
// Enable application panel in DevTools.
await pushPref("devtools.application.enabled", true);
}
function getWorkerContainers(doc) {
return doc.querySelectorAll(".js-sw-container");
}
async function openNewTabAndApplicationPanel(url) {
const tab = await addTab(url);
const toolbox = await gDevTools.showToolboxForTab(tab, {
toolId: "application",
});
const panel = toolbox.getCurrentPanel();
const target = toolbox.target;
const commands = toolbox.commands;
return { panel, tab, target, toolbox, commands };
}
async function unregisterAllWorkers(client, doc) {
// This method is declared in shared-head.js
await unregisterAllServiceWorkers(client);
info("Wait for service workers to disappear from the UI");
waitUntil(() => getWorkerContainers(doc).length === 0);
}
async function waitForWorkerRegistration(swTab) {
info("Wait until the registration appears on the window");
const swBrowser = swTab.linkedBrowser;
await asyncWaitUntil(async () =>
SpecialPowers.spawn(swBrowser, [], function () {
return !!content.wrappedJSObject.getRegistration();
})
);
}
/**
* Select a page by simulating a user click in the sidebar.
*
* @param {string} page The page we want to select (see `PAGE_TYPES`)
*/
async function selectPage(panel, page) {
info(`Selecting application page: ${page}`);
const doc = panel.panelWin.document;
const navItem = doc.querySelector(`.js-sidebar-${page}`);
// Force/wait for the element to be painted before clicking, to avoid a11y
await waitFor(() => navItem.getBoundingClientRect().width > 0);
navItem.click();
}