Description
Library Affected:
workbox-window
Browser & Platform:
At least Chrome 131.0.6778.86, possibly all browsers
Issue or Feature Request Description:
The WorkboxLifecycleEvent.isUpdate
will remain false
in following scenario:
- New service worker installation
- Alter source code to trigger update in next step
- Manually trigger Service worker update (without navigation/ page reload), for ie. by one of;
- DevTools > Application > Service workers > Update
(await navigator.serviceWorker.getRegistration()).update()
This matches the behavior described in source:
workbox/packages/workbox-window/src/Workbox.ts
Lines 698 to 699 in c77dceb
However it's name leads to false assumption that it's value is true
on any update (even that there was no controlling service worker at the time of registration).
Some examples:
-
chrome for developers > Workbox-window docs > When an updated version of the service worker is found:
When a new service worker starts installing but an existing version is currently controlling the page, the isUpdate property of all the following events will be true.
-
web.dev > Broadcast updates to pages with service workers > Listen to service worker lifecycle events
wb.addEventListener('installed', (event) => { if (event.isUpdate) { // Show "Update App" banner } });
-
demos > workbox-window
workbox/demos/src/workbox-window/index.html
Lines 53 to 57 in c77dceb
Suggested solution
I think the fix is to set this._isUpdate = true
after first installation:
diff --git a/packages/workbox-window/src/Workbox.ts
private readonly _onControllerChange = (originalEvent: Event) => {
const sw = this._sw;
const isExternal = sw !== navigator.serviceWorker.controller;
+ this._isUpdate = true
+ this._isUpdate = navigator.serviceWorker.controller !== null // Alternative implementation
and adjust jsdoc comments for this property.
I'm just not entirely sure if this is the right place?
Related PR: #1905