1

这不是一个直接的编码问题,但这个问题的答案将有助于对 Firefox 插件进行编码。

  1. 所有 JS 插件代码都在主线程上执行吗?
  2. 假设上面的问题是“是”,插件代码可以由主线程上的不同 JS 运行时执行吗?
  3. 假设对#2 的回答是“否”,那么在同一个 JS 运行时中是否存在多个 JS“执行上下文”?如果“是”,插件代码是否可以由同一 JS 运行时中的不同执行上下文执行?

我在上述问题中可能有问题,但我在插件中看到一个奇怪的行为,导致部分插件代码挂起(当模式对话框启动时,我无法在套接字 #1 上接收数据),但其他部分继续工作(能够从套接字#2 读取数据)。我无法解释这种行为。

4

1 回答 1

0

所有 JS 插件代码都在主线程上执行吗?

是的。AFAIK 这条规则的唯一例外是您通过网络工作者ChromeWorker运行的代码。有计划在不同的过程中运行基于附加 SDK 的扩展,我不确定这是否仍然是目标。

插件代码可以由主线程上的不同 JS 运行时执行吗?

理论上——是的。例如,扩展可能带有包含不同 JavaScript 引擎的二进制 XPCOM 组件。或者是 带有基于 JavaScript 的 JavaScript 引擎的Zaphod 扩展。但这对于在常规 SpiderMonkey 引擎中运行的代码并不重要。

我在插件中看到一个奇怪的行为,导致部分插件代码挂起(当模式对话框启动时,我无法在套接字 #1 上接收数据)

JavaScript 执行基于事件队列 - 浏览器将从队列中获取一个事件(例如 DOM 事件、超时、网络事件)并对其进行处理,然后运行相应的 JavaScript 代码。在此 JavaScript 代码完成之前,无法处理其他事件。

但是,当模式对话框打开或执行同步时,JavaScript 代码不会继续运行XMLHttpRequest- 但仍需要处理事件。这可以通过模式对话框和XMLHttpRequest在它们处于活动状态时进行事件处理来解决(它们旋转自己的事件循环)。

到目前为止的基础。进入套接字的数据是一个常规事件——无论它是由主事件循环还是由模式对话框的循环处理,它都应该工作。

于 2012-08-22T09:02:08.033 回答