From c5fd1b460a277e73b928b00126231aeb9e34e6fb Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 10 Jul 2026 18:19:56 +0200 Subject: [PATCH 1/4] fix(service-worker): Correctly cache static assets in case of redirects Signed-off-by: Marcel Klehr --- src/service-worker.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/service-worker.js b/src/service-worker.js index 4547e9cdfd..64350f4536 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() From a66eb001c24a2135fc687da2870bd5d9d0319528 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 10 Jul 2026 18:20:09 +0200 Subject: [PATCH 2/4] fix(service-worker): Load the correct endpoint Signed-off-by: Marcel Klehr --- src/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index 02f131415e..7b18fe0b76 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'), From 402bdcd81daf3cf2b146ac60c00a477c46468fc7 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Fri, 10 Jul 2026 18:22:47 +0200 Subject: [PATCH 3/4] fix(webmanifest): Correctly inject web manifest Signed-off-by: Marcel Klehr --- lib/AugmentedTemplateResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/AugmentedTemplateResponse.php b/lib/AugmentedTemplateResponse.php index cd6977f1e3..1ea43053bc 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 = preg_replace('//i', '', $return); return $return; } } From 9e7aa1cca2c82dd76762ff314c5c4856daf31c7f Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sat, 11 Jul 2026 10:50:18 +0200 Subject: [PATCH 4/4] fix(AugmentedTemplateResponse): Fix psalm issue Signed-off-by: Marcel Klehr --- lib/AugmentedTemplateResponse.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/AugmentedTemplateResponse.php b/lib/AugmentedTemplateResponse.php index 1ea43053bc..35cfb46427 100644 --- a/lib/AugmentedTemplateResponse.php +++ b/lib/AugmentedTemplateResponse.php @@ -19,7 +19,7 @@ class AugmentedTemplateResponse extends TemplateResponse { public function render() { $return = parent::render(); - $return = preg_replace('//i', '', $return); - return $return; + $return2 = preg_replace('//i', '', $return); + return $return2 ?? $return; } }