https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts
content script 权限 // 访问 dom 需要 host 权限
在 API 方面没有 es6 modules 加载方案,不过可以通过 <script> 标签曲线支持 // V3 有动态导入模块,导入执行环境 Chrome 是 content script,Firefox 是 page,Firefox 需要使用 `runtime.getURL`
content script 中进行跨域请求受页面 SOP 限制 // Chrome manifest v2 不受限制,使用 bg 转发
Firefox 59 不能在右键执行的上下文点击函数中 open window;
Content script 运行于一个特定的网页环境(不是后台脚本,后台脚本是扩展的一部分; 也不是该网页利用 <script> 加载的一个脚本,<script> 加载的脚本是网页的一部分)。
执行 page 脚本 V3 有 CSP 限制 // Chrome manifest v2 不受限制,Firefox 有
// V3 有 world: MAIN,Firefox v3 还没实现,Firefox 能尝试 script.src = runtime.getURL
runtime.connect 是内容将让特权脚本主动传消息手段,例如有多个标签情况下
tabs.executeScript 也是 content script 环境
// bg 注册 scripting.registerContentScripts()
// 指定 tab scripting.executeScript()
在每一个 extension 的每一个 frame 中,只有一个全局作用域。所以在一个 content script 中的变量可以被另外的 content script 访问到,而与 content script 如何被加载无关。
content scripts 得到的是一个“干净的DOM视图”(Xray vision),这意味着:
- content scripts 不能看见页面脚本定义的 javascript 变量
- 直接在扩展中修改 window/document 上的方法页面感知不到 // 使用 `<script>` 可绕过
- 如果一个页面脚本重定义了一个 DOM 内置属性,content scripts 将获取到这个属性的原始版本,而不是重定义版本。
- Sharing objects with page scripts // Firefox
- ExecutionWorld // Chrome Firefox bug
在 Firefox 中类型继承有问题,原型链上的方法不能读取到,但是写出字段可以。
// Spotify lyrics options 窗口 render 方法读取不到
好像不能在 React 类似的网站中使用 content script 插入内容,很容易操作 Permission denied,可能是事件传播导致 page 环境读取 content script 内容
在 Chrome 中没有 customElements 对象,需要使用垫片 // 垫片是如何让 customElement 工作的?
与 bgscript 交互:browser.runtime.sendMessage()
建立长久链接以和 bgscript 传输大量数据:runtime.onConnect
尽管content script 通常不能获取由网页脚本创建的对象,但他们可以通过 window.postMessage 和 window.addEventListener APIs 与网页脚本进行通信. // 只能传递可序列化对象,比如不能传递 element 的引用
用户脚本(FF,v2):
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/contentScripts
This API is very similar to the "content_scripts" manifest.json key, except that with "content_scripts" , the set of content scripts and associated patterns is fixed at install time. With the contentScripts API, an extension can register and unregister scripts at runtime.