Bug 1156847 - Part 7: Add unit tests for responding to a FetchEvent with a synthesized Response both in the case where the service worker is loaded from the network and from the cache; r=nsm
authorEhsan Akhgari <ehsan@mozilla.com>
Thu, 23 Apr 2015 19:21:00 -0400
changeset 273087 a59eaeaeb8b4c8c1a3bec1b2a72b87ab6f3b4c8c
parent 273086 e3a415d282b0e91b0ce5ee57b3f37a48ae11a424
child 273088 d90e308bfb98fe5c7561d05ed89cdaaff1261417
push id863
push userraliiev@mozilla.com
push dateMon, 03 Aug 2015 13:22:43 +0000
treeherdermozilla-release@f6321b14228d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersnsm
bugs1156847
milestone40.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1156847 - Part 7: Add unit tests for responding to a FetchEvent with a synthesized Response both in the case where the service worker is loaded from the network and from the cache; r=nsm
dom/workers/test/serviceworkers/fetch/https/https_test.js
dom/workers/test/serviceworkers/mochitest.ini
dom/workers/test/serviceworkers/test_https_fetch.html
dom/workers/test/serviceworkers/test_https_synth_fetch_from_cached_sw.html
--- a/dom/workers/test/serviceworkers/fetch/https/https_test.js
+++ b/dom/workers/test/serviceworkers/fetch/https/https_test.js
@@ -2,10 +2,13 @@ self.addEventListener("install", functio
   event.waitUntil(caches.open("cache").then(function(cache) {
     return cache.add("index.html");
   }));
 });
 
 self.addEventListener("fetch", function(event) {
   if (event.request.url.indexOf("index.html") >= 0) {
     event.respondWith(caches.match(event.request));
+  } else if (event.request.url.indexOf("synth.html") >= 0) {
+    event.respondWith(new Response('<!DOCTYPE html><script>window.parent.postMessage({status: "done-synth"}, "*");</script>',
+                                   {headers:{"Content-Type": "text/html"}}));
   }
 });
--- a/dom/workers/test/serviceworkers/mochitest.ini
+++ b/dom/workers/test/serviceworkers/mochitest.ini
@@ -77,16 +77,17 @@ support-files =
   periodic/register.html
   periodic/unregister.html
 
 [test_unregister.html]
 [test_installation_simple.html]
 [test_fetch_event.html]
 [test_https_fetch.html]
 [test_https_fetch_cloned_response.html]
+[test_https_synth_fetch_from_cached_sw.html]
 [test_match_all.html]
 [test_match_all_advanced.html]
 [test_install_event.html]
 [test_navigator.html]
 [test_scopes.html]
 [test_controller.html]
 [test_workerUnregister.html]
 [test_workerUpdate.html]
--- a/dom/workers/test/serviceworkers/test_https_fetch.html
+++ b/dom/workers/test/serviceworkers/test_https_fetch.html
@@ -26,16 +26,18 @@
       if (e.data.status == "ok") {
         ok(e.data.result, e.data.message);
       } else if (e.data.status == "registrationdone") {
         ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
                            .getService(SpecialPowers.Ci.nsIIOService);
         ios.offline = true;
         iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/index.html";
       } else if (e.data.status == "done") {
+        iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/synth.html";
+      } else if (e.data.status == "done-synth") {
         ios.offline = false;
         iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/unregister.html";
       } else if (e.data.status == "unregistrationdone") {
         window.onmessage = null;
         ok(true, "Test finished successfully");
         SimpleTest.finish();
       }
     };
copy from dom/workers/test/serviceworkers/test_https_fetch.html
copy to dom/workers/test/serviceworkers/test_https_synth_fetch_from_cached_sw.html
--- a/dom/workers/test/serviceworkers/test_https_fetch.html
+++ b/dom/workers/test/serviceworkers/test_https_synth_fetch_from_cached_sw.html
@@ -1,22 +1,22 @@
 <!--
   Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/
 -->
 <!DOCTYPE HTML>
 <html>
 <head>
-  <title>Bug 1133763 - test fetch event in HTTPS origins</title>
+  <title>Bug 1156847 - test fetch event generating a synthesized response in HTTPS origins from a cached SW</title>
   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 <p id="display"></p>
-<div id="content" style="display: none">
+<div id="content" tyle="display: none">
 <iframe></iframe>
 </div>
 <pre id="test"></pre>
 <script class="testbody" type="text/javascript">
 
   var iframe;
   function runTest() {
     iframe = document.querySelector("iframe");
@@ -24,18 +24,31 @@
     var ios;
     window.onmessage = function(e) {
       if (e.data.status == "ok") {
         ok(e.data.result, e.data.message);
       } else if (e.data.status == "registrationdone") {
         ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
                            .getService(SpecialPowers.Ci.nsIIOService);
         ios.offline = true;
-        iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/index.html";
-      } else if (e.data.status == "done") {
+
+        // In order to load synth.html from a cached service worker, we first
+        // remove the existing window that is keeping the service worker alive,
+        // and do a GC to ensure that the SW is destroyed.  This way, when we
+        // load synth.html for the second time, we will first recreate the
+        // service worker from the cache.  This is intended to test that we
+        // properly store and retrieve the security info from the cache.
+        iframe.parentNode.removeChild(iframe);
+        iframe = null;
+        SpecialPowers.exactGC(window, function() {
+          iframe = document.createElement("iframe");
+          iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/synth.html";
+          document.body.appendChild(iframe);
+        });
+      } else if (e.data.status == "done-synth") {
         ios.offline = false;
         iframe.src = "https://example.com/tests/dom/workers/test/serviceworkers/fetch/https/unregister.html";
       } else if (e.data.status == "unregistrationdone") {
         window.onmessage = null;
         ok(true, "Test finished successfully");
         SimpleTest.finish();
       }
     };