When I using navigationPreload.enable(), Safari 16.x on macOs and all browser on ios16.x make two requests Here is my code: const uri = 'https://uri'; self.addEventListener('activate', event => { event.waitUntil((async () => { if (self.registration.navigationPreload) { await self.registration.navigationPreload.enable(); } })()); }); self.addEventListener('fetch', (event) => { const request = event.request; if (request.mode === 'navigate' && request.destination !== 'iframe') { event.respondWith((async () => { try { return await event.preloadResponse || await fetch(request); } catch (e) { const response = await fetch(uri); if (response.ok) { const text = await response.text(); const body = decode(text); return new Response(body, { headers: { 'Content-Type': 'text/html' } }); } } })()); } }); function decode(str) { return decodeURIComponent( some code ); }
this is minimal reproducer self.addEventListener('activate', event => { event.waitUntil((async () => { if (self.registration.navigationPreload) { await self.registration.navigationPreload.enable(); } })()); }); self.addEventListener('fetch', (event) => { const request = event.request; event.respondWith((async () => { return await event.preloadResponse || await fetch(request); })()); });
<rdar://problem/100639064>
Thanks for the report. I believe this was fixed in https://bugs.webkit.org/show_bug.cgi?id=245788.
*** This bug has been marked as a duplicate of bug 245788 ***