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()