Bug 1450070 - WIP: Add test for application panel update button draft
authorJulian Descottes <jdescottes@mozilla.com>
Fri, 18 May 2018 11:02:05 +0900
changeset 796722 4bc5dba8c6fde5b249fdf0ac0820232201433f88
parent 796721 36a561e30d14970330a3f11db8be854b92605a9c
push id110345
push userjdescottes@mozilla.com
push dateFri, 18 May 2018 06:04:47 +0000
bugs1450070
milestone62.0a1
Bug 1450070 - WIP: Add test for application panel update button MozReview-Commit-ID: 9XzeyCQl50v
devtools/client/application/test/browser.ini
devtools/client/application/test/browser_application_panel_update-worker.js
devtools/client/application/test/service-workers/random.html
devtools/client/application/test/service-workers/sjs_random_serviceworker.sjs
--- 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