From 741a5c800ff59061e7235daff4bfa81f19a38120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Vogel?= <104342347+cedricvogel-leo@users.noreply.github.com> Date: Sun, 8 Nov 2026 17:23:19 +0100 Subject: [PATCH] Favicon for Safari: favicon.ico, and ?v=2 on the icon links Safari before 26 shows no SVG favicon (on the Mac its grey letter placeholder), so the site gets favicon.ico (16, 32, 48 px, from favicon.svg) as the first icon link, the SVG for the others. All three icon links carry ?v=2, a new address, so browsers fetch them afresh instead of a cached older icon. test:browser checks the links and that the icons load through the service worker with their query. Co-Authored-By: Claude Opus 5.5 --- index.html | 8 ++++++-- public/favicon.ico | Bin 0 -> 4204 bytes scripts/check-ide-browser.mjs | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 public/favicon.ico diff --git a/index.html b/index.html index 33e4ba6..b08036b 100644 --- a/index.html +++ b/index.html @@ -2,8 +2,12 @@ - - + + + + glpython diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..63259f0c570318292741ebda994cb7861d34ed58 GIT binary patch literal 4204 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 E1B43XH2?qr literal 0 HcmV?d00001 diff --git a/scripts/check-ide-browser.mjs b/scripts/check-ide-browser.mjs index a4b4f2d..da4d75f 100644 --- a/scripts/check-ide-browser.mjs +++ b/scripts/check-ide-browser.mjs @@ -596,6 +596,24 @@ try { await context.close() }) + await check('icons: favicon.ico, favicon.svg, apple-touch-icon, each ?v=2 (P41)', async () => { + const context = await newContext() + const page = await open(context, base) + assert.deepEqual(await page.evaluate(() => [...document.querySelectorAll('link[rel~="icon"], link[rel="apple-touch-icon"]')].map((link) => [link.rel, link.getAttribute('href'), link.type, link.getAttribute('sizes')])), [ + ['icon', '/favicon.ico?v=2', '', '32x32'], + ['icon', '/favicon.svg?v=2', 'image/svg+xml', null], + ['apple-touch-icon', '/apple-touch-icon.png?v=2', '', null], + ]) + // Through the page, i.e. through the service worker: served, with the query, as images. + const served = await page.evaluate(async () => Promise.all(['/favicon.ico?v=2', '/favicon.svg?v=2', '/apple-touch-icon.png?v=2'].map(async (path) => { + const response = await fetch(path) + return [path, response.status, response.headers.get('content-type')?.split(';')[0], (await response.arrayBuffer()).byteLength > 0] + }))) + assert.deepEqual(served.map(([path, status, , filled]) => [path, status, filled]), [['/favicon.ico?v=2', 200, true], ['/favicon.svg?v=2', 200, true], ['/apple-touch-icon.png?v=2', 200, true]]) + assert.ok(served.every(([, , type]) => /^image\//.test(type)), `as images: ${served.map(([, , type]) => type).join(', ')}`) + await context.close() + }) + await check('⋮ «Info»: the version from version.json, and the update check', async () => { const { version } = JSON.parse(readFileSync(new URL('../dist/version.json', import.meta.url), 'utf8')) const context = await newContext()