Bug 1450070 - WIP: Add test for application panel update button
MozReview-Commit-ID: 9XzeyCQl50v
--- a/devtools/client/application/test/browser.ini
+++ b/devtools/client/application/test/browser.ini
@@ -1,19 +1,22 @@
[DEFAULT]
tags = devtools
subsuite = devtools
support-files =
head.js
service-workers/dynamic-registration.html
service-workers/empty.html
service-workers/empty-sw.js
+ service-workers/random.html
service-workers/scope-page.html
service-workers/simple.html
+ service-workers/sjs_random_serviceworker.sjs
service-workers/simple-unicode.html
!/devtools/client/shared/test/frame-script-utils.js
!/devtools/client/shared/test/shared-head.js
!/devtools/client/shared/test/telemetry-test-helpers.js
[browser_application_panel_list-domain-workers.js]
[browser_application_panel_list-several-workers.js]
[browser_application_panel_list-single-worker.js]
[browser_application_panel_list-unicode.js]
+[browser_application_panel_update-worker.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/application/test/browser_application_panel_update-worker.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const TAB_URL = URL_ROOT + "service-workers/random.html";
+
+add_task(async function() {
+ await enableApplicationPanel();
+
+ let { panel, tab, target } = await openNewTabAndApplicationPanel(TAB_URL);
+ let doc = panel.panelWin.document;
+
+ info("Wait until the service worker appears in the application panel");
+ await waitUntil(() => getWorkerContainers(doc).length > 0);
+
+ let workerContainer = getWorkerContainers(doc)[0];
+
+ info("Wait until the update button is displayed for the service worker");
+ await waitUntil(() => workerContainer.querySelector(".update-button"));
+
+ let scopeEl = workerContainer.querySelector(".service-worker-scope");
+ let expectedScope = "example.com/browser/devtools/client/application/test/" +
+ "service-workers/";
+ ok(scopeEl.textContent.startsWith(expectedScope),
+ "Service worker has the expected scope");
+
+ info("Load a script that will trigger a fetch event on the service worker");
+ loadScript(tab);
+ await asyncWaitUntil(async function() {
+ let result = await getServiceWorkerVersion(tab);
+ return result === 1;
+ });
+ ok(true, "serviceWorkerVersion was set to 1");
+
+ let lastUpdateTimeEl = workerContainer.querySelector(".js-last-update-time");
+ let lastUpdateTime = lastUpdateTimeEl.textContent;
+
+ let updateButton = workerContainer.querySelector(".update-button");
+ info("Click on the update button and wait for the update time to update");
+ updateButton.click();
+ await waitUntil(() => {
+ let newLastUpdateTime = lastUpdateTimeEl.textContent;
+ return newLastUpdateTime && newLastUpdateTime !== lastUpdateTime;
+ });
+
+ info("Load a script again and wait until the serviceWorkerVersion is set to 2");
+ loadScript(tab);
+ await asyncWaitUntil(async function() {
+ let result = await getServiceWorkerVersion(tab);
+ return result === 2;
+ });
+ ok(true, "serviceWorkerVersion was updated to 2");
+
+ await unregisterAllWorkers(target.client);
+});
+
+async function loadScript(tab) {
+ ContentTask.spawn(tab.linkedBrowser, {}, async function() {
+ let win = content.wrappedJSObject;
+ const script = win.document.createElement("script");
+ script.setAttribute("type", "text/javascript");
+ script.setAttribute("src", "version.js");
+ win.document.body.appendChild(script);
+ });
+}
+
+async function getServiceWorkerVersion(tab) {
+ return ContentTask.spawn(tab.linkedBrowser, {}, async function() {
+ return content.wrappedJSObject.serviceWorkerVersion;
+ });
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/application/test/service-workers/random.html
@@ -0,0 +1,16 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="UTF-8">
+ <title>Service worker test</title>
+</head>
+<body>
+<script type="text/javascript">
+"use strict";
+window.sw = navigator.serviceWorker.register("sjs_random_serviceworker.sjs",
+ {scope: "."});
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/devtools/client/application/test/service-workers/sjs_random_serviceworker.sjs
@@ -0,0 +1,47 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* globals getState, setState */
+/* exported handleRequest */
+
+"use strict";
+
+/**
+ * Every time this URL is called, a different service worker script is returned.
+ */
+
+function handleRequest(request, response) {
+ response.processAsync();
+
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback(() => {
+ // to avoid garbage collection
+ timer = null;
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.setHeader("Content-Type", "application/javascript; charset=utf-8", false);
+
+ // Increase the current counter.
+ let counter = 1 + (+getState("counter"));
+
+ response.write(`
+ self.onactivate = function(event) {
+ event.waitUntil(self.clients.claim());
+ };
+
+ self.onfetch = function(event) {
+ if (event.request.url.includes("version.js")) {
+ let scriptResponse = new Response("window.serviceWorkerVersion = ${counter};");
+ return event.respondWith(scriptResponse);
+ }
+ return null;
+ };
+
+ self.oninstall = function(event) {
+ event.waitUntil(self.skipWaiting());
+ }
+ `);
+
+ setState("counter", "" + counter);
+ response.finish();
+ }, 1000, Ci.nsITimer.TYPE_ONE_SHOT); // Add around one second of delay.
+}
\ No newline at end of file