From 2630d2487c9bdb4108e034acd68d0de96bcb714f Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Mon, 28 Jan 2019 10:13:07 +0000 Subject: [PATCH] Bug 1500395 - Migrate service worker status test to new about:debugging;r=daisuke Depends on D17630 I am not mentioning the original test in the test file because they are not similar. Original test was not actually testing anything interesting for us. Differential Revision: https://phabricator.services.mozilla.com/D17631 --HG-- extra : moz-landing-system : lando --- .../test/browser/browser.ini | 1 + ...ser_aboutdebugging_serviceworker_status.js | 67 +++++++++++++++++++ .../test/browser/helper-serviceworker.js | 5 ++ .../service-workers/controlled-sw.html | 38 +++++++++++ .../service-workers/controlled-sw.js | 31 +++++++++ 5 files changed, 142 insertions(+) create mode 100644 devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_serviceworker_status.js create mode 100644 devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html create mode 100644 devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.js diff --git a/devtools/client/aboutdebugging-new/test/browser/browser.ini b/devtools/client/aboutdebugging-new/test/browser/browser.ini index aaeb6d66e5a5..d54339434f5c 100644 --- a/devtools/client/aboutdebugging-new/test/browser/browser.ini +++ b/devtools/client/aboutdebugging-new/test/browser/browser.ini @@ -57,6 +57,7 @@ skip-if = (os == "win" && ccov) # Bug 1521349 [browser_aboutdebugging_serviceworker_pushservice_url.js] [browser_aboutdebugging_serviceworker_runtime-page.js] [browser_aboutdebugging_serviceworker_start.js] +[browser_aboutdebugging_serviceworker_status.js] [browser_aboutdebugging_serviceworker_timeout.js] [browser_aboutdebugging_sidebar_network_runtimes.js] [browser_aboutdebugging_sidebar_usb_runtime.js] diff --git a/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_serviceworker_status.js b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_serviceworker_status.js new file mode 100644 index 000000000000..6ea5fb457f77 --- /dev/null +++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_serviceworker_status.js @@ -0,0 +1,67 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from helper-serviceworker.js */ +Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-serviceworker.js", this); + +const SW_TAB_URL = URL_ROOT + "resources/service-workers/controlled-sw.html"; +const SW_URL = URL_ROOT + "resources/service-workers/controlled-sw.js"; + +/** + * Test that the service worker has the status "registering" when the service worker is + * not installed yet. Other states (stopped, running) are covered by the existing tests. + */ +add_task(async function() { + await enableServiceWorkerDebugging(); + + const { document, tab } = await openAboutDebugging(); + + info("Open tab with a service worker that never leaves `registering` status"); + const swTab = await addTab(SW_TAB_URL); + + // Wait for the registration to make sure service worker has been started, and that we + // are not just reading STOPPED as the initial state. + await waitForRegistration(swTab); + + info("Wait until the service worker is in registering status"); + await waitForServiceWorkerRegistering(SW_URL, document); + + // Check that the buttons are displayed as expected. + checkButtons({ inspect: true, push: false, start: false }, SW_URL, document); + + info("Install the service worker"); + ContentTask.spawn(swTab.linkedBrowser, {}, + () => content.wrappedJSObject.installServiceWorker()); + + info("Wait until the service worker is running"); + await waitForServiceWorkerRunning(SW_URL, document); + + checkButtons({ inspect: true, push: true, start: false }, SW_URL, document); + + info("Unregister service worker"); + await unregisterServiceWorker(swTab); + + info("Wait until the service worker disappears from about:debugging"); + await waitUntil(() => !findDebugTargetByText(SW_URL, document)); + + info("Remove tabs"); + await removeTab(swTab); + await removeTab(tab); +}); + +function checkButtons({ inspect, push, start }, workerText, document) { + const targetElement = findDebugTargetByText(SW_URL, document); + + const inspectButton = targetElement.querySelector(".js-debug-target-inspect-button"); + const pushButton = targetElement.querySelector(".js-push-button"); + const startButton = targetElement.querySelector(".js-start-button"); + + is(!!inspectButton, inspect, + "Inspect button should be " + (inspect ? "visible" : "hidden")); + is(!!pushButton, push, + "Push button should be " + (push ? "visible" : "hidden")); + is(!!startButton, start, + "Start button should be " + (start ? "visible" : "hidden")); +} diff --git a/devtools/client/aboutdebugging-new/test/browser/helper-serviceworker.js b/devtools/client/aboutdebugging-new/test/browser/helper-serviceworker.js index 3d09e81900a9..6239b8753f75 100644 --- a/devtools/client/aboutdebugging-new/test/browser/helper-serviceworker.js +++ b/devtools/client/aboutdebugging-new/test/browser/helper-serviceworker.js @@ -61,6 +61,11 @@ async function waitForServiceWorkerRunning(workerText, 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; diff --git a/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html new file mode 100644 index 000000000000..aa388a14f653 --- /dev/null +++ b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.html @@ -0,0 +1,38 @@ + + + + + Service worker push test + + + + + diff --git a/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.js b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.js new file mode 100644 index 000000000000..79fb72f91e7b --- /dev/null +++ b/devtools/client/aboutdebugging-new/test/browser/resources/service-workers/controlled-sw.js @@ -0,0 +1,31 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/* eslint-env worker */ + +"use strict"; + +// Copied from shared-head.js +function waitUntil(predicate, interval = 10) { + if (predicate()) { + return Promise.resolve(true); + } + return new Promise(resolve => { + setTimeout(function() { + waitUntil(predicate, interval).then(() => resolve(true)); + }, interval); + }); +} + +// This flag will be flipped from controlled-sw.html::installServiceWorker() +let canInstall = false; +self.addEventListener("message", function(event) { + if (event.data === "install-service-worker") { + canInstall = true; + } +}); + +// Wait for the canInstall flag to be flipped before completing the install. +self.addEventListener("install", function(event) { + event.waitUntil(waitUntil(() => canInstall)); +});