v1.9.2 - Favicon Fallback
What's Changed
Favicons that fail to load now fall back to a clean placeholder instead of a broken-image glyph.
The popup renders each tab's favicon as an <img> from a chrome-extension:// origin, which makes loading tab.favIconUrl a cross-origin request. It can fail when the favicon is served with a restrictive Cross-Origin-Resource-Policy (e.g. claude.ai's /favicon.ico ships CORP: same-origin), 404s, or is auth-only. The browser's tab bar still shows it via a privileged fetch, so it was invisible until a cross-origin consumer like ATO tried to render it — and showed a broken glyph.
Now every favicon <img> has an onerror handler that swaps to the existing placeholder, identical to a missing or chrome:// favicon.
Details
- Favicon creation is factored into one shared helper, so both render paths (domain groups and per-tab rows) behave identically.
- On failure the handler clears the broken
src, switches to the placeholder, and nulls itself so it can't loop. - No new permissions and no extra network requests — it just reacts to the existing image load.
- No regression for favicons that already render.
Fixes #46.
🤖 Generated with Claude Code