WebExtension Content scripts

Tags
webextension
Created
Dec 1, 2017 7:02 AM

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.postMessagewindow.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.

SuperMade with Super