fix: only treat a waiting service worker as an update when a controller exists
This commit is contained in:
@@ -3021,16 +3021,25 @@ async function registerServiceWorker() {
|
|||||||
const reg = await navigator.serviceWorker.register('/sw.js', { updateViaCache: 'none' });
|
const reg = await navigator.serviceWorker.register('/sw.js', { updateViaCache: 'none' });
|
||||||
_swReg = reg;
|
_swReg = reg;
|
||||||
|
|
||||||
|
// A waiting worker only means "update pending" when this page is already
|
||||||
|
// controlled by a previous SW. On a FIRST install (fresh visit, or right
|
||||||
|
// after Settings → Force refresh unregisters everything) the brand-new
|
||||||
|
// worker passes through the `installed`/waiting state for a moment before
|
||||||
|
// activating — with no controller that is not an update, and showing the
|
||||||
|
// banner for it is exactly the "Update available keeps coming back after
|
||||||
|
// Refresh UI" loop.
|
||||||
|
const hasController = () => !!navigator.serviceWorker.controller;
|
||||||
|
|
||||||
// If a new SW is already waiting (e.g. user refreshed after an update),
|
// If a new SW is already waiting (e.g. user refreshed after an update),
|
||||||
// show the dialog right away.
|
// show the dialog right away.
|
||||||
if (reg.waiting) { showUpdateBanner(); return; }
|
if (reg.waiting && hasController()) { showUpdateBanner(); return; }
|
||||||
|
|
||||||
// Listen for a new SW installing after the page is open.
|
// Listen for a new SW installing after the page is open.
|
||||||
reg.addEventListener('updatefound', () => {
|
reg.addEventListener('updatefound', () => {
|
||||||
const sw = reg.installing;
|
const sw = reg.installing;
|
||||||
if (!sw) return;
|
if (!sw) return;
|
||||||
sw.addEventListener('statechange', () => {
|
sw.addEventListener('statechange', () => {
|
||||||
if (sw.state === 'installed' && reg.waiting) showUpdateBanner();
|
if (sw.state === 'installed' && reg.waiting && hasController()) showUpdateBanner();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user