Skip to content

Firefox vs Chrome

Ng Guoyou edited this page Jul 16, 2026 · 5 revisions

Firefox and Chrome differences

Save In ships one Manifest V3 codebase to Firefox 121+ and Chrome/Chromium 123+. Most behavior is shared. Differences below come from browser capabilities and are feature-detected where possible.

Feature differences

Feature Firefox Chrome / Chromium
Background Non-persistent event page Non-persistent service worker
Tab-strip context menu Supported Supported in Chrome 150+; omitted on Chrome 123–149
Referer option Scoped metadata/content rules; native direct final download Scoped metadata/content rules; protected Blob download
Blob download URL Native URL.createObjectURL Data-URL fallback when an object URL is unavailable
Last-used menu icon Shown when supported Omitted when contextMenus.create({ icons }) is rejected
Ordinary browser-download routing Experimental cancel-and-replace for matching HTTP(S) downloads Native synchronous downloads.onDeterminingFilename
Shortcut file formats HTML redirect and .webloc only — Firefox refuses to save a file whose name ends .url or .desktop All formats
Duplicate filename prompt Unimplemented; an imported prompt setting falls back to uniquify Supported

Shortcut formats on Firefox

Firefox validates the filename passed to its downloads API against the list of extensions it treats as dangerous, and fails the whole download rather than renaming the file — .url, .desktop, .lnk, .scf, and .local are all refused. It has done this since Firefox 112 (bug 1815062 / CVE-2023-29542): the check moved into the sanitizer the downloads API validates against, and the extension API never received the opt-out the file picker got.

Save In's Windows and macOS .url shortcuts and its Freedesktop .desktop shortcuts land exactly on that list, so those formats are not offered on Firefox and a stored or imported profile that selects one saves an HTML redirect instead. .html and .webloc are unaffected. Chrome never passes the filename — it suggests one through downloads.onDeterminingFilename — so every format works there.

Save In requests declarativeNetRequestWithHostAccess for temporary exact Referer rules, but does not request webRequest or webRequestBlocking. Firefox can also attach the header through its native downloads API for a direct final download. Chrome rejects that unsafe download header, so Save In passes the protected content to Chrome as a local Blob.

Background lifecycle

Both browser backgrounds sleep when idle. Persistent download state is stored rather than trusted to module globals. Event listeners are registered synchronously at startup so the event that wakes the background is not missed.

Firefox provides a real window; Chrome's service worker does not. Shared code therefore feature-detects APIs such as URL.createObjectURL and storage.session.

Content scripts

Content scripts use callback-style chrome.*, which works in both browsers. A script from an older extension instance can outlive an update, so failed messages are caught and retried where appropriate.

See Manifest V3, Authenticated downloads and request context, Browser downloads, and Troubleshooting and diagnostics.

Clone this wiki locally