-
Notifications
You must be signed in to change notification settings - Fork 32
Firefox vs Chrome
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 | 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 |
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.
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 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.