Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Prerender: Defer ServiceWorkerRegistration#unregister from prerendere…
…d pages The spec requires ServiceWorkerRegistration#unregister to be deferred until page activation. This CL implements the behavior. https://wicg.github.io/nav-speculation/prerendering.html#patch-service-workers Bug: 1305120 Change-Id: Ibf5d888f0636d2ad11c08f16b9b9739824536cb0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3606768 Reviewed-by: Lingqi Chi <lingqi@chromium.org> Reviewed-by: Asami Doi <asamidoi@chromium.org> Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org> Cr-Commit-Position: refs/heads/main@{#995987}
- Loading branch information
1 parent
df77a8e
commit 2f3f5cb
Showing
3 changed files
with
91 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
// Do nothing. |
34 changes: 34 additions & 0 deletions
34
speculation-rules/prerender/resources/service-worker-unregister.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
<!DOCTYPE html> | ||
<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="/speculation-rules/prerender/resources/utils.js"></script> | ||
<script src="/speculation-rules/prerender/resources/deferred-promise-utils.js"></script> | ||
<body> | ||
<script type="module"> | ||
|
||
const params = new URLSearchParams(location.search); | ||
const uid = params.get('uid'); | ||
|
||
// The main test page (restriction-service-worker-unregister.https.html) loads | ||
// the initiator page, then the initiator page will prerender itself with the | ||
// `prerendering` parameter. | ||
const isPrerendering = params.has('prerendering'); | ||
|
||
if (!isPrerendering) { | ||
loadInitiatorPage(); | ||
} else { | ||
const registration = | ||
await navigator.serviceWorker.getRegistration(location.href); | ||
|
||
const prerenderEventCollector = new PrerenderEventCollector(); | ||
const promise = registration.unregister() | ||
.then(registration => { | ||
prerenderEventCollector.addEvent('service worker unregistered'); | ||
}); | ||
prerenderEventCollector.start( | ||
promise, 'ServiceWorkerRegistration.unregister'); | ||
} | ||
|
||
</script> | ||
</body> |
56 changes: 56 additions & 0 deletions
56
speculation-rules/prerender/restriction-service-worker-unregister.https.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
<!DOCTYPE html> | ||
<title>ServiceWorkerRegistration.unregister in a prerendered page</title> | ||
<meta name="timeout" content="long"> | ||
<script src="/resources/testharness.js"></script> | ||
<script src="/resources/testharnessreport.js"></script> | ||
<script src="/common/utils.js"></script> | ||
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script> | ||
<script src="/speculation-rules/prerender/resources/utils.js"></script> | ||
<body> | ||
<script> | ||
|
||
setup(() => assertSpeculationRulesIsSupported()); | ||
|
||
const uid = token(); | ||
|
||
const PAGE_URL = `resources/service-worker-unregister.html?uid=${uid}`; | ||
const WORKER_URL = 'resources/do-nothing-worker.js'; | ||
|
||
promise_test(async t => { | ||
const registration = | ||
await navigator.serviceWorker.register(WORKER_URL, {scope: PAGE_URL}); | ||
t.add_cleanup(_ => registration.unregister()); | ||
|
||
const bc = new PrerenderChannel('test-channel', uid); | ||
t.add_cleanup(_ => bc.close()); | ||
|
||
const gotMessage = new Promise(resolve => { | ||
bc.addEventListener('message', e => { | ||
resolve(e.data); | ||
}, { | ||
once: true | ||
}); | ||
}); | ||
window.open(PAGE_URL, '_blank', 'noopener'); | ||
|
||
const result = await gotMessage; | ||
const expected = [ | ||
{event: 'started waiting ServiceWorkerRegistration.unregister', prerendering: true}, | ||
{event: 'prerendering change', prerendering: false}, | ||
{event: 'service worker unregistered', prerendering: false}, | ||
{event: 'finished waiting ServiceWorkerRegistration.unregister', prerendering: false}, | ||
]; | ||
assert_equals(result.length, expected.length); | ||
for (let i = 0; i < result.length; i++) { | ||
assert_equals(result[i].event, expected[i].event, `event[${i}]`); | ||
assert_equals(result[i].prerendering, expected[i].prerendering, | ||
`prerendering[${i}]`); | ||
} | ||
|
||
// Send a close signal to PrerenderEventCollector on the prerendered page. | ||
new PrerenderChannel('close', uid).postMessage(''); | ||
}, 'ServiceWorkerRegistration.unregister() should be deferred in a ' + | ||
'prerendered page'); | ||
|
||
</script> | ||
</body> |