From 19d708647b67ed78eed33f4c15666cf0163da1d9 Mon Sep 17 00:00:00 2001 From: Hiroshige Hayashizaki Date: Thu, 17 Feb 2022 19:31:55 -0800 Subject: [PATCH] [WPT] BFCache: service worker clients This CL adds service worker tests for BFCache: - navigator.serviceWorker.controller - Fetch interception - Clients.claim() - Clients.matchAll() and - unregister(). Expected behavior: - Controlled pages should remain controlled after restored from BFCache, i.e. navigator.serviceWorker.controller should remain non-null and fetch should be intercepted. - Clients.claim() should evict pages that would be affected from BFCache. - Clients.matchAll() shouldn't list pages in BFCache. - unregister() shouldn't evict controlled pages from BFCache. Failing tests: - service-worker-clients-claim.https.html: On Safari/Firefox, Clients.claim() doesn't evict pages from BFCache. - service-worker-controlled-after-restore.https.html: On Firefox, fetches are not intercepted after restored from BFCache while `navigator.serviceWorker.controller` is non-null. Bug: 1107415, 1204228, https://github.com/w3c/ServiceWorker/issues/1594 Change-Id: I73233cf917e31dd91b974823d5490d0190f0eade --- .../resources/helper.sub.js | 13 ++++ .../resources/service-worker.js | 31 ++++++++ .../service-worker-clients-claim.https.html | 71 +++++++++++++++++ ...service-worker-clients-matchall.https.html | 76 +++++++++++++++++++ ...worker-controlled-after-restore.https.html | 54 +++++++++++++ .../service-worker-unregister.https.html | 63 +++++++++++++++ 6 files changed, 308 insertions(+) create mode 100644 html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js create mode 100644 html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-claim.https.html create mode 100644 html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-matchall.https.html create mode 100644 html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html create mode 100644 html/browsers/browsing-the-web/back-forward-cache/service-worker-unregister.https.html diff --git a/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js b/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js index ff446f5ee9d3c8..4b42d91670252f 100644 --- a/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js +++ b/html/browsers/browsing-the-web/back-forward-cache/resources/helper.sub.js @@ -187,3 +187,16 @@ function runBfcacheTest(params, description) { } }, description); } + +// Call clients.claim() on the service worker +async function claim(t, worker) { + const channel = new MessageChannel(); + const saw_message = new Promise(function(resolve) { + channel.port1.onmessage = t.step_func(function(e) { + assert_equals(e.data, 'PASS', 'Worker call to claim() should fulfill.'); + resolve(); + }); + }); + worker.postMessage({port: channel.port2}, [channel.port2]); + await saw_message; +} diff --git a/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js b/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js new file mode 100644 index 00000000000000..60dceb0a6a6f5f --- /dev/null +++ b/html/browsers/browsing-the-web/back-forward-cache/resources/service-worker.js @@ -0,0 +1,31 @@ +self.addEventListener('message', function(event) { + self.clients.claim() + .then(function(result) { + if (result !== undefined) { + event.data.port.postMessage( + 'FAIL: claim() should be resolved with undefined'); + return; + } + event.data.port.postMessage('PASS'); + }) + .catch(function(error) { + event.data.port.postMessage('FAIL: exception: ' + error.name); + }); + }); + +self.addEventListener('fetch', e => { + if (e.request.url.match(/\/is-controlled/)) { + e.respondWith(new Response('controlled')); + } + else if (e.request.url.match(/\/get-clients-matchall/)) { + const options = { includeUncontrolled: true, type: 'all' }; + e.respondWith( + self.clients.matchAll(options) + .then(clients => { + const client_urls = []; + clients.forEach(client => client_urls.push(client.url)); + return new Response(JSON.stringify(client_urls)); + }) + ); + } + }); diff --git a/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-claim.https.html b/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-claim.https.html new file mode 100644 index 00000000000000..d9540c221bdf21 --- /dev/null +++ b/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-claim.https.html @@ -0,0 +1,71 @@ + + + + + + + + + diff --git a/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-matchall.https.html b/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-matchall.https.html new file mode 100644 index 00000000000000..069529dbe477c6 --- /dev/null +++ b/html/browsers/browsing-the-web/back-forward-cache/service-worker-clients-matchall.https.html @@ -0,0 +1,76 @@ + + + + + + + + + diff --git a/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html b/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html new file mode 100644 index 00000000000000..5a63b6e677af20 --- /dev/null +++ b/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html @@ -0,0 +1,54 @@ + + + + + + + + + diff --git a/html/browsers/browsing-the-web/back-forward-cache/service-worker-unregister.https.html b/html/browsers/browsing-the-web/back-forward-cache/service-worker-unregister.https.html new file mode 100644 index 00000000000000..12ae298bdbf412 --- /dev/null +++ b/html/browsers/browsing-the-web/back-forward-cache/service-worker-unregister.https.html @@ -0,0 +1,63 @@ + + + + + + + + +