| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script> |
| <script src="support/test_utils.sub.js"></script> |
| </head> |
| |
| <body> |
| <script> |
| /** @property{Datatype} The storage datatype. */ |
| var storage = TestUtils.DATATYPES.filter(function(datatype) { |
| return datatype.name == "storage"; |
| })[0]; |
| |
| var serviceWorkerTestPageIFrame; |
| function fetchFromIFrame() { |
| return serviceWorkerTestPageIFrame.contentWindow |
| .fetch('controlled-endpoint.py') |
| .then((result) => { |
| return result.text(); |
| }); |
| } |
| |
| // The tests are set up asynchronously. |
| setup({"explicit_done": true}); |
| |
| // There must be at least one test added synchronously, otherwise |
| // testharness will complain. |
| // TODO(@msramek): Find a way to avoid this dummy test. |
| test(function() {}, "Populate backends."); |
| |
| TestUtils.populateStorage() |
| .then(() => { |
| return new Promise(function(resolve, reject) { |
| promise_test(function(t) { |
| return navigator.serviceWorker.getRegistration("support/").then(function(reg) { |
| return wait_for_state(t, reg.installing || reg.waiting || reg.active, 'activated'); |
| }).then(resolve, reject); |
| }); |
| }); |
| }) |
| .then(() => { |
| return new Promise(function (resolve) { |
| // Create iFrame in the service worker's scope. This page will make a request |
| // for another page that is only served by the service worker |
| serviceWorkerTestPageIFrame = document.createElement("iframe"); |
| serviceWorkerTestPageIFrame.src = "support/page_using_service_worker.html"; |
| serviceWorkerTestPageIFrame.onload = function() { resolve(); }; |
| document.body.appendChild(serviceWorkerTestPageIFrame); |
| }); |
| }) |
| .then(() => { |
| const serviceWorkerResponseBody = fetchFromIFrame(); |
| |
| promise_test(function() { |
| return serviceWorkerResponseBody.then(function(body) { |
| assert_equals(body, "FROM_SERVICE_WORKER", "Response should be from service worker"); |
| }); |
| }, "Baseline: Service worker responds to request"); |
| |
| return serviceWorkerResponseBody; |
| }) |
| .then(function() { |
| const waitForControllerChange = new Promise(function(resolve) { |
| serviceWorkerTestPageIFrame.contentWindow |
| .navigator.serviceWorker.addEventListener("controllerchange", resolve); |
| }); |
| // Navigate to a resource with a Clear-Site-Data header in |
| // an iframe, then verify that all backends of the "storage" |
| // datatype have been deleted. |
| return new Promise(function(resolve, reject) { |
| window.addEventListener("message", resolve); |
| var iframe = document.createElement("iframe"); |
| iframe.src = TestUtils.getClearSiteDataUrl([storage]); |
| document.body.appendChild(iframe); |
| }).then(function() { |
| TestUtils.STORAGE.forEach(function(backend) { |
| var test_name = |
| "Clear backend when 'storage' is deleted: " + backend.name; |
| |
| promise_test(function() { |
| return backend.isEmpty().then(function(isEmpty) { |
| assert_true( |
| isEmpty, |
| backend.name + " should have been cleared."); |
| }); |
| }, test_name); |
| }); |
| |
| promise_test(function() { |
| return fetchFromIFrame().then(function(body) { |
| assert_equals(body, "FROM_NETWORK", "Response should be from network and not from the service worker"); |
| }); |
| }, "Service worker no longer responds to requests"); |
| |
| promise_test(function() { |
| return waitForControllerChange.then(function() { |
| assert_false(!!serviceWorkerTestPageIFrame.contentWindow.navigator.serviceWorker.controller, |
| "Client should not have a controller"); |
| }); |
| }, "controllerchange event fires and client no longer has controller"); |
| |
| done(); |
| }); |
| }); |
| </script> |
| </body> |
| </html> |