Skip to content
This repository was archived by the owner on Mar 19, 2021. It is now read-only.

Commit 8be01b6

Browse files
asakusumawanderview
authored andcommitted
Clear-Site-Data: clients uncontrolled by service workers after storage directive (#19132)
Adds a failing test, asserting that pages actively controlled by a service worker become uncontrolled after the Clear-Site-Data storage directive. We agreed on this behavior in a spec issue and confirmed the need for this test at the TPAC Service Workers F2F. w3c/ServiceWorker#614 F2F notes: https://docs.google.com/document/d/1_Qfw5m3BJEaL1xIzTJd41HXjgJ9gq7mroBDXqSJIzic/edit
1 parent d9a9f29 commit 8be01b6

File tree

5 files changed

+73
-2
lines changed

5 files changed

+73
-2
lines changed

clear-site-data/storage.https.html

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<head>
44
<script src="/resources/testharness.js"></script>
55
<script src="/resources/testharnessreport.js"></script>
6+
<script src="../service-workers/service-worker/resources/test-helpers.sub.js"></script>
67
<script src="support/test_utils.sub.js"></script>
78
</head>
89

@@ -13,6 +14,15 @@
1314
return datatype.name == "storage";
1415
})[0];
1516

17+
var serviceWorkerTestPageIFrame;
18+
function fetchFromIFrame() {
19+
return serviceWorkerTestPageIFrame.contentWindow
20+
.fetch('support/controlled-endpoint.py')
21+
.then((result) => {
22+
return result.text();
23+
});
24+
}
25+
1626
// The tests are set up asynchronously.
1727
setup({"explicit_done": true});
1828

@@ -22,7 +32,41 @@
2232
test(function() {}, "Populate backends.");
2333

2434
TestUtils.populateStorage()
35+
.then(() => {
36+
return new Promise(function(resolve, reject) {
37+
promise_test(function(t) {
38+
return navigator.serviceWorker.getRegistration("support/").then(function(reg) {
39+
return wait_for_state(t, reg.installing || reg.waiting || reg.active, 'activated');
40+
}).then(resolve, reject);
41+
});
42+
});
43+
})
44+
.then(() => {
45+
return new Promise(function (resolve) {
46+
// Create iFrame in the service worker's scope. This page will make a request
47+
// for another page that is only served by the service worker
48+
serviceWorkerTestPageIFrame = document.createElement("iframe");
49+
serviceWorkerTestPageIFrame.src = "support/page_using_service_worker.html";
50+
serviceWorkerTestPageIFrame.onload = function() { resolve(); };
51+
document.body.appendChild(serviceWorkerTestPageIFrame);
52+
});
53+
})
54+
.then(() => {
55+
const serviceWorkerResponseBody = fetchFromIFrame();
56+
57+
promise_test(function() {
58+
return serviceWorkerResponseBody.then(function(body) {
59+
assert_equals(body, "FROM_SERVICE_WORKER", "Response should be from service worker");
60+
});
61+
}, "Baseline: Service worker responds to request");
62+
63+
return serviceWorkerResponseBody;
64+
})
2565
.then(function() {
66+
const waitForControllerChange = new Promise(function(resolve) {
67+
serviceWorkerTestPageIFrame.contentWindow
68+
.navigator.serviceWorker.addEventListener("controllerchange", resolve);
69+
});
2670
// Navigate to a resource with a Clear-Site-Data header in
2771
// an iframe, then verify that all backends of the "storage"
2872
// datatype have been deleted.
@@ -45,6 +89,19 @@
4589
}, test_name);
4690
});
4791

92+
promise_test(function() {
93+
return fetchFromIFrame().then(function(body) {
94+
assert_equals(body, "FROM_NETWORK", "Response should be from network and not from the service worker");
95+
});
96+
}, "Service worker no longer responds to requests");
97+
98+
promise_test(function() {
99+
return waitForControllerChange.then(function() {
100+
assert_false(!!serviceWorkerTestPageIFrame.contentWindow.navigator.serviceWorker.controller,
101+
"Client should not have a controller");
102+
});
103+
}, "controllerchange event fires and client no longer has controller");
104+
48105
done();
49106
});
50107
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
def main(request, response):
2+
return ([("Content-Type", "text/html")],
3+
"FROM_NETWORK")
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Clear-Site-Data + Service Workers Test Page</title>
5+
</head>
6+
</html>
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
/* This file is intentionally left blank. */
1+
self.addEventListener('fetch', (e) => {
2+
const url = new URL(e.request.url);
3+
if (url.pathname.match('controlled-endpoint.py')) {
4+
e.respondWith(new Response('FROM_SERVICE_WORKER'));
5+
}
6+
});

clear-site-data/support/test_utils.sub.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ var TestUtils = (function() {
121121
"add": function() {
122122
return navigator.serviceWorker.register(
123123
"support/service_worker.js",
124-
{ scope: "support/scope-that-does-not-contain-this-test/"});
124+
{ scope: "support/"});
125125
},
126126
"isEmpty": function() {
127127
return new Promise(function(resolve, reject) {

0 commit comments

Comments
 (0)