GoogleChrome / GoogleChrome/workbox
The `WorkboxLifecycleEvent.isUpdate` is false on first immediate service worker update
- Dominant language
- JavaScript
- Stars
- 13k
- Forks
- 880
- Avg merge
- 2h 44m
- Merged PRs (30d)
- 8
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:
1. New service worker installation
2. Alter source code to trigger update in next step
3. 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:
https://github.com/GoogleChrome/workbox/blob/c77dceb54d4af1749db95316710d6430e82b0c48/packages/workbox-window/src/Workbox.ts#L698-L699
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](https://developer.chrome.com/docs/workbox/modules/workbox-window#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](https://web.dev/articles/broadcast-updates-guide#listen-to-service-worker-lifecycle-events)
```ts
wb.addEventListener('installed', (event) => {
if (event.isUpdate) {
// Show "Update App" banner
}
});
```
- demos > [workbox-window](https://github.com/GoogleChrome/workbox/blob/v7.3.0/demos/src/workbox-window/index.html)
https://github.com/GoogleChrome/workbox/blob/c77dceb54d4af1749db95316710d6430e82b0c48/demos/src/workbox-window/index.html#L53-L57
**Suggested solution**
I think the fix is to set `this._isUpdate = true` after first installation:
```diff
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: https://github.com/GoogleChrome/workbox/pull/1905
Contributor guide
Assessment
This issue has not been assessed yet.