From 27864fc47fedd0a6349d86d5cfbf08fc7f2dc978 Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Sat, 1 Jun 2019 12:17:12 -0700 Subject: [PATCH] fix: Revert "fix: no need for double reload of SW in Chrome (#1251)" (#1257) This reverts commit fa2eb8fe52e985185a7157cca31ba57382609734. --- src/routes/_pages/settings/index.html | 2 +- src/routes/_utils/serviceWorkerClient.js | 82 +++--------------------- src/service-worker.js | 9 +-- 3 files changed, 11 insertions(+), 82 deletions(-) diff --git a/src/routes/_pages/settings/index.html b/src/routes/_pages/settings/index.html index 02a3045..45503ed 100644 --- a/src/routes/_pages/settings/index.html +++ b/src/routes/_pages/settings/index.html @@ -36,7 +36,7 @@ methods: { reload (event) { event.preventDefault() - location.reload() + document.location.reload(true) } } } diff --git a/src/routes/_utils/serviceWorkerClient.js b/src/routes/_utils/serviceWorkerClient.js index aed0689..d846f08 100644 --- a/src/routes/_utils/serviceWorkerClient.js +++ b/src/routes/_utils/serviceWorkerClient.js @@ -1,81 +1,17 @@ import { snackbar } from '../_components/snackbar/snackbar' -// A lot of this code is borrowed from https://github.com/GoogleChromeLabs/squoosh/blob/53b46f8/src/lib/offliner.ts -// Service Workers are hard! +function onUpdateFound (registration) { + const newWorker = registration.installing -// Tell the service worker to skip waiting -async function skipWaiting () { - const reg = await navigator.serviceWorker.getRegistration() - if (!reg || !reg.waiting) { - return - } - reg.waiting.postMessage('skip-waiting') -} - -// Wait for an installing worker -async function installingWorker (reg) { - if (reg.installing) { - return reg.installing - } - return new Promise((resolve) => { - reg.addEventListener( - 'updatefound', - () => resolve(reg.installing), - { once: true } - ) + newWorker.addEventListener('statechange', async () => { + if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { + snackbar.announce('App update available.', 'Reload', () => document.location.reload(true)) + } }) } -// Wait a service worker to become waiting -async function updateReady (reg) { - if (reg.waiting) { - return - } - const installing = await installingWorker(reg) - return new Promise((resolve) => { - const listener = () => { - if (installing.state === 'installed') { - installing.removeEventListener('statechange', listener) - resolve() - } - } - installing.addEventListener('statechange', listener) +if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/service-worker.js').then(registration => { + registration.addEventListener('updatefound', () => onUpdateFound(registration)) }) } - -(async () => { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/service-worker.js') - - const hasController = !!navigator.serviceWorker.controller - - navigator.serviceWorker.addEventListener('controllerchange', () => { - if (!hasController) { // first install - return - } - - location.reload() - }) - - // If we don't have a controller, we don't need to check for updates – we've just loaded from the - // network. - if (!hasController) { - return - } - - const reg = await navigator.serviceWorker.getRegistration() - if (!reg) { // SW not registered yet - return - } - - // Look for updates - await updateReady(reg) - - // Ask the user if they want to update. - snackbar.announce('App update available.', 'Reload', () => { - // Tell the waiting worker to activate, this will change the controller and cause a reload (see - // 'controllerchange') - /* no await */ skipWaiting() - }) - } -})() diff --git a/src/service-worker.js b/src/service-worker.js index d3716fb..d2b4448 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -35,6 +35,7 @@ self.addEventListener('install', event => { caches.open(WEBPACK_ASSETS).then(cache => cache.addAll(webpackAssets)), caches.open(ASSETS).then(cache => cache.addAll(assets)) ]) + self.skipWaiting() })()) }) @@ -242,11 +243,3 @@ self.addEventListener('notificationclick', event => { } })()) }) - -self.addEventListener('message', (event) => { - switch (event.data) { - case 'skip-waiting': - self.skipWaiting() - break - } -})