上下文
我目前正在开发一个浏览器扩展程序,它正在按照Chrome和Opera的预期运行,但我遇到了Firefox的问题。以下是重现问题所需的manifest.json
的最小版本:
{
"name": "Example",
"version": "0.0.1",
"author": "Pyves",
"content_scripts": [
{
"all_frames": true,
"matches": [
"<all_urls>"
],
"js": [
"content.js"
]
}
],
"manifest_version": 2
}
以下是相关的content.js
:
console.log("Content script loaded");
问题
使用Chrome和Opera时,无论访问过的网页如何,系统都会记录 Content script loaded
。然而,在使用Firefox时,内容脚本似乎不会在某些页面中加载,例如以下原始GitHub页面:
https://raw.githubusercontent.com/badges/shields/master/README.md
Firefox控制台中没有错误消息说明为什么内容脚本没有在该特定页面上执行。
问题
为什么Firefox扩展程序无法将内容脚本加载到某些页面?
需要进行哪些更改才能使扩展程序在所有浏览器上保持一致?
提前致谢,非常感谢任何帮助!
答案 0 :(得分:6)
我终于弄明白为什么在使用Firefox时,某些页面中没有加载扩展程序的内容脚本。
使用网络开发人员工具分析请求后,发现获取GitHub原始页面时会返回以下标题:
Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; sandbox
根据MDN Web Docs,sandbox
CSP指令具有以下效果:
为所请求的资源启用沙箱[...]。它适用 限制页面的操作,包括阻止弹出窗口, 阻止执行插件和脚本,并强制执行 同源政策。
因此,Firefox阻止扩展程序在使用沙箱CSP的页面中执行内容脚本,而其他浏览器(如Chrome和Opera)确实允许此行为。 Mozilla的Bugzilla(1267027和1411641)中的相关错误报告强调:
CSP&#39;沙盒&#39;由于唯一来源,指令阻止内容脚本匹配
此问题已得到承认,并且有望在未来的Firefox版本中修复。