diff --git a/lib/AugmentedTemplateResponse.php b/lib/AugmentedTemplateResponse.php index cd6977f1e..35cfb4642 100644 --- a/lib/AugmentedTemplateResponse.php +++ b/lib/AugmentedTemplateResponse.php @@ -19,7 +19,7 @@ class AugmentedTemplateResponse extends TemplateResponse { public function render() { $return = parent::render(); - preg_replace('//i', '', $return); - return $return; + $return2 = preg_replace('//i', '', $return); + return $return2 ?? $return; } } diff --git a/src/main.js b/src/main.js index 02f131415..7b18fe0b7 100644 --- a/src/main.js +++ b/src/main.js @@ -34,7 +34,7 @@ const BookmarksApp = (global.Bookmarks = new Vue({ })) if ('serviceWorker' in navigator) { - navigator.serviceWorker.register(generateUrl('/apps/bookmarks/bookmarks-service-worker.js', {}, { + navigator.serviceWorker.register(generateUrl('/apps/bookmarks/service-worker.js', {}, { noRewrite: true, }), { scope: generateUrl('/apps/bookmarks'), diff --git a/src/service-worker.js b/src/service-worker.js index 4547e9cdf..64350f453 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -17,10 +17,26 @@ const FILES_TO_CACHE = [ './', ] +// cache.addAll()/cache.put() reject for responses that were redirected or +// aren't 2xx, which would abort the whole installation. Fetch each shell URL +// ourselves, rebuild a clean (non-redirected) Response, and tolerate failures. +async function precache(cache, url) { + const response = await fetch(url, { redirect: 'follow' }) + if (!response.ok) { + throw new Error(`Failed to precache ${url}: ${response.status}`) + } + const body = await response.blob() + await cache.put(url, new Response(body, { + status: response.status, + statusText: response.statusText, + headers: response.headers, + })) +} + self.addEventListener('install', (evt) => { evt.waitUntil( caches.open(STATIC_CACHE).then((cache) => { - return cache.addAll(FILES_TO_CACHE) + return Promise.allSettled(FILES_TO_CACHE.map((url) => precache(cache, url))) }), ) self.skipWaiting()