/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-env browser */
/* eslint no-unused-vars: [2, {"vars": "local"}] */
"use strict";
// Load the shared-head file first.
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js",
this
);
/**
* 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);
// Force single content process, see Bug 1231208 for the SW refactor that should enable
// 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() {
// FIXME bug 1575427 this rejection is very common.
const { PromiseTestUtils } = ChromeUtils.importESModule(
"resource://testing-common/PromiseTestUtils.sys.mjs"
);
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 setupTelemetryTest() {
// Reset all the counts
Services.telemetry.clearEvents();
// Ensure no events have been logged
const ALL_CHANNELS = Ci.nsITelemetry.DATASET_ALL_CHANNELS;
const snapshot = Services.telemetry.snapshotEvents(ALL_CHANNELS,
true);
ok(!snapshot.parent,
"No events have been logged for the main process");
}
function getTelemetryEvents(objectName) {
// read the requested events only
const ALL_CHANNELS = Ci.nsITelemetry.DATASET_ALL_CHANNELS;
const snapshot = Services.telemetry.snapshotEvents(ALL_CHANNELS,
true);
// filter and transform the event data so the relevant info is in a single object:
// { method: "...", extraField: "...", anotherExtraField: "...", ... }
const events = snapshot.parent
.filter(event => event[1] ===
"devtools.main" && event[3] === objectName)
.map(event => ({ method: event[2], ...event[5] }));
return events;
}
function checkTelemetryEvent(expectedEvent, objectName =
"application") {
info(
"Check telemetry event");
const events = getTelemetryEvents(objectName);
// assert we only got 1 event with a valid session ID
is(events.length, 1,
"There was only 1 event logged");
const [event] = events;
Assert.greater(
Number(event.session_id),
0,
"There is a valid session_id in the event"
);
// assert expected data
Assert.deepEqual(event, { ...expectedEvent, session_id: event.session_id });
}
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();
})
);
}
function selectPage(panel, page) {
/**
* Select a page by simulating a user click in the sidebar.
* @param {string} page The page we want to select (see `PAGE_TYPES`)
**/
info(`Selecting application page: ${page}`);
const doc = panel.panelWin.document;
const navItem = doc.querySelector(`.js-sidebar-${page}`);
navItem.click();
}