Originally created by: piotr-cz
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:
(await navigator.serviceWorker.getRegistration()).update()This matches the behavior described in source:
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:
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.
ts
wb.addEventListener('installed', (event) => {
if (event.isUpdate) {
// Show "Update App" banner
}
});
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: https://github.com/GoogleChrome/workbox/pull/1905