内容脚本是在同一个隔离世界中运行,还是在不同的隔离世界中运行?

Nat*_*ate 6 javascript jquery google-chrome google-chrome-extension

我正在阅读 Chrome 文档,试图了解如何创建扩展,并且正在努力了解如何在内容脚本之间共享数据。

假设我的扩展程序捆绑了三个脚本:

jquery.js
script1.js
script2.js
Run Code Online (Sandbox Code Playgroud)

我需要script1.js使用script2.jsjQuery,并且每个脚本都需要能够读取和写入全局变量 ala window.foo = 'bar'

这些脚本还会向事件驱动的 DOM 添加内容,因此只要选项卡打开,它们读取/写入的全局变量就需要保持不变。

例如,script1.js可能会向页面添加一个按钮,单击该按钮后将运行 中定义的函数script1.js,该函数又设置一个全局变量,然后运行一个函数,然后在其中script2.js使用该变量(仅是一个示例)。

内容脚本文档说:

然而,内容脚本有一些限制。他们不可以:

  • ...
  • 使用由其扩展页面定义的变量或函数
  • 使用网页或其他内容脚本定义的变量或函数

这是否意味着扩展程序的内容脚本根本无法相互交互,或者是否意味着来自不同扩展程序的内容脚本无法相互交互?

换句话说,所有扩展内容脚本是在同一个隔离世界中运行,还是在单独的隔离世界中运行?

Xan*_*Xan 7

每个扩展、每帧都有一个执行上下文。

如果您在同一框架中注入多个脚本,它们将完全共享上下文(查看彼此的变量等)

DOM 在所有上下文中共享。这使得能够与自定义事件进行跨上下文通信。

跨框架(或跨选项卡)通信通常需要后台脚本作为消息或类似内容的代理window.postMessage