diff options
Diffstat (limited to 'devtools/client/application/test/browser/head.js')
-rw-r--r-- | devtools/client/application/test/browser/head.js | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/devtools/client/application/test/browser/head.js b/devtools/client/application/test/browser/head.js new file mode 100644 index 0000000000..6b7e67ff8d --- /dev/null +++ b/devtools/client/application/test/browser/head.js @@ -0,0 +1,134 @@ +/* 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); + + // Enable service workers in the debugger + await pushPref("devtools.debugger.features.windowless-service-workers", true); + // 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; + ok(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(); +} |