Firefox Manifest V3扩展仅点击弹窗才注入内容脚本的原因排查
Firefox 111中Manifest V3扩展内容脚本延迟注入问题排查
问题描述
我开发的Manifest V3扩展在Chrome、Edge等浏览器中运行正常,但在Firefox 111里,只有打开弹窗窗口后才会注入内容脚本。我需要它在每次页面加载时自动注入,而且弹窗里根本没有触发内容脚本的代码,修改manifest.json也没效果。目前是通过about:debugging在FF 111中临时安装的扩展。
当前manifest.json配置
{ "name": "XXX", "version": "0.5.0", "manifest_version": 3, "author": "Benny Nissen", "content_security_policy": { "extension_pages": "default-src 'self'; script-src 'self'; object-src; img-src 'self' data: blob:;" }, "description": "Bla, bla,homepage_url: https://xxx.xx", "icons": { "16": "icons/key_icon16.png", "48": "icons/key_icon48.png", "128": "icons/key_icon128.png" }, "options_ui": { "page": "src/browser_action/options.html", "open_in_tab": true }, "default_locale": "en", "background": { "//service_worker_is_for_chrome_and_scripts_is_for_ff": "stupidity - but please remove/add relevant //", "//service_worker": "src/bg/background.js", "scripts": [ "js/lib/jserror/jserror.js", "js/lib/lang/languagedb.js", "js/lib/pcrypt.js", "js/lib/pcryptapi.js", "js/lib/other/prototypes.js", "js/lib/other/php.js", "js/lib/forge.min.js", "js/lib/elliptic.min.js", "js/lib/srp6a/thinbus-srp-config.js", "js/lib/srp6a/thinbus-srp6a-sha256-versioned.js", "js/pcrypt_extension.js", "js/pcrypt_shared.js", "src/bg/background.js" ] }, "action": { "default_icon": { "16": "icons/key_icon16.png", "48": "icons/key_icon48.png", "128": "icons/key_icon128.png" }, "default_title": "Password Crypt", "default_popup": "src/browser_action/popup.html" }, "permissions": [ "notifications", "geolocation", "storage", "clipboardWrite", "tabs", "<all_urls>" ], "host_permissions": [ "<all_urls>" ], "content_scripts": [ { "matches": [ "<all_urls>" ], "exclude_matches": [ "https://*.facebook.com/settings*" ], "js": [ "src/inject/inject.js" ], "run_at": "document_start" }, { "matches": [ "https://facebook.com/settings*", "https://www.facebook.com/settings*" ], "all_frames": true, "js": [ "src/inject/inject.js" ], "run_at": "document_start" } ], "web_accessible_resources": [ { "resources": [ "icons/chevron-left.svg", "icons/eye.svg", "icons/key.svg", "icons/key_icon.png", "icons/link.svg", "icons/settings.svg", "icons/settings_black.svg", "icons/user.svg" ], "matches": [ "<all_urls>" ] } ] }
原因分析与解决方案
1. Firefox扩展休眠机制
Firefox会对长时间未交互的Manifest V3扩展进行休眠,导致内容脚本无法自动注入。点击弹窗相当于唤醒了扩展,因此之后内容脚本能正常运行。
解决办法:在背景脚本background.js中添加标签页监听事件,强制保持扩展活跃:
// 监听标签页加载事件,防止扩展休眠 chrome.tabs.onUpdated.addListener((tabId, changeInfo) => { if (changeInfo.status === 'loading') { // 无需实际操作,仅触发扩展活跃状态 } });
2. Content Security Policy (CSP) 语法错误
你的CSP配置中object-src字段未指定值,Firefox对CSP语法要求更严格,这可能导致扩展初始化异常。
解决办法:修正CSP配置,将object-src改为object-src 'none';:
"content_security_policy": { "extension_pages": "default-src 'self'; script-src 'self'; object-src 'none'; img-src 'self' data: blob:;" }
3. Manifest V3兼容性问题
Firefox 111对Manifest V3的支持仍在完善阶段,背景脚本加载过多可能导致初始化延迟,阻塞内容脚本注入。
解决办法:
- 暂时简化背景脚本,只保留必要代码,测试是否能正常注入内容脚本;
- 尝试将
run_at从document_start改为document_idle,看是否能绕过时机限制。
4. 临时安装的调试限制
通过about:debugging临时安装的扩展可能存在调试模式下的行为差异,比如延迟激活。
解决办法:将扩展打包为.xpi文件正常安装,验证问题是否依然存在。
5. 权限配置验证
虽然你已添加<all_urls>,但Firefox对Manifest V3的权限匹配可能更严格,可尝试将host_permissions改为明确的协议范围:
"host_permissions": [ "http://*/*", "https://*/*" ]
内容的提问来源于stack exchange,提问作者Beast
相关产品推荐
相关产品推荐

