diff options
Diffstat (limited to 'testing/web-platform/tests/clear-site-data/storage.https.html')
-rw-r--r-- | testing/web-platform/tests/clear-site-data/storage.https.html | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/testing/web-platform/tests/clear-site-data/storage.https.html b/testing/web-platform/tests/clear-site-data/storage.https.html new file mode 100644 index 0000000000..1d6882d7f7 --- /dev/null +++ b/testing/web-platform/tests/clear-site-data/storage.https.html @@ -0,0 +1,110 @@ +<!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> |