diff options
Diffstat (limited to 'devtools/client/aboutdebugging/test/browser/helper-serviceworker.js')
-rw-r--r-- | devtools/client/aboutdebugging/test/browser/helper-serviceworker.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/devtools/client/aboutdebugging/test/browser/helper-serviceworker.js b/devtools/client/aboutdebugging/test/browser/helper-serviceworker.js new file mode 100644 index 0000000000..e57b62b7eb --- /dev/null +++ b/devtools/client/aboutdebugging/test/browser/helper-serviceworker.js @@ -0,0 +1,111 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from head.js */ + +/** + * Temporarily flip all the preferences necessary for service worker testing. + */ +async function enableServiceWorkerDebugging() { + // Enable service workers. + await pushPref("dom.serviceWorkers.enabled", true); + + // Accept workers from mochitest's http (normally only available in https). + await pushPref("dom.serviceWorkers.testing.enabled", true); + + // Force single content process. Necessary until sw e10s refactor is done (Bug 1231208). + await pushPref("dom.ipc.processCount", 1); + Services.ppmm.releaseCachedProcesses(); +} +/* exported enableServiceWorkerDebugging */ + +/** + * Helper to listen once on a message sent using postMessage from the provided tab. + * + * @param {Tab} tab + * The tab on which the message will be received. + * @param {String} message + * The name of the expected message. + */ +function onServiceWorkerMessage(tab, message) { + info("Make the test page notify us when the service worker sends a message."); + return SpecialPowers.spawn( + tab.linkedBrowser, + [message], + function (messageChild) { + return new Promise(resolve => { + const win = content.wrappedJSObject; + win.navigator.serviceWorker.addEventListener( + "message", + function (event) { + if (event.data == messageChild) { + resolve(); + } + } + ); + }); + } + ); +} +/* exported onServiceWorkerMessage */ + +async function _waitForServiceWorkerStatus(workerText, status, document) { + await waitUntil(() => { + const target = findDebugTargetByText(workerText, document); + const statusElement = target && target.querySelector(".qa-worker-status"); + return statusElement && statusElement.textContent === status; + }); + + return findDebugTargetByText(workerText, document); +} +/* exported waitForServiceWorkerRunning */ + +async function waitForServiceWorkerStopped(workerText, document) { + return _waitForServiceWorkerStatus(workerText, "Stopped", document); +} +/* exported waitForServiceWorkerStopped */ + +async function waitForServiceWorkerRunning(workerText, document) { + return _waitForServiceWorkerStatus(workerText, "Running", document); +} +/* exported waitForServiceWorkerRunning */ + +async function waitForServiceWorkerRegistering(workerText, document) { + return _waitForServiceWorkerStatus(workerText, "Registering", document); +} +/* exported waitForServiceWorkerRegistering */ + +async function waitForRegistration(tab) { + info("Wait until the registration appears on the window"); + const swBrowser = tab.linkedBrowser; + await asyncWaitUntil(async () => + SpecialPowers.spawn(swBrowser, [], async function () { + return !!(await content.wrappedJSObject.getRegistration()); + }) + ); +} +/* exported waitForRegistration */ + +/** + * Unregister the service worker from the content page. The content page should define + * `getRegistration` to allow this helper to retrieve the service worker registration that + * should be unregistered. + * + * @param {Tab} tab + * The tab on which the service worker should be removed. + */ +async function unregisterServiceWorker(tab) { + return SpecialPowers.spawn(tab.linkedBrowser, [], function () { + const win = content.wrappedJSObject; + // Check that the content page defines getRegistration. + is( + typeof win.getRegistration, + "function", + "getRegistration is a valid function" + ); + win.getRegistration().unregister(); + }); +} +/* exported unregisterServiceWorker */ |