Firefox 插件和线程模型

Firefox addon and threading model

这不是直接的编码问题,但对此的回答将有助于编写 Firefox 插件。

  • 是否所有 JS 插件代码都在主线程上执行?
  • 假设上面的问题是"是",插件代码是否可以由主线程上的不同 JS 运行时执行?
  • 假设#2 的答案是"否",在同一个 JS 运行时中是否有多个 JS"执行上下文"?如果"是",插件代码是否可以在同一个 JS 运行时内的不同执行上下文中执行?
  • 我可能在上面的问题中离题很远,但我在我的插件中看到了一个奇怪的行为,导致我的部分插件代码挂起(当一个模式对话框启动时,我无法在套接字上接收数据 # 1),但其他部分继续工作(我能够从套接字#2 读取数据)。我无法解释这种行为。


    Is all JS addon code executed on main thread?

    是的。 AFAIK 这条规则的唯一例外是您通过 Web Worker 或 ChromeWorker 运行的代码。有计划在不同的过程中运行基于 Add-on SDK 的扩展,我不确定这是否仍然是目标。

    could the addon code be executed by different JS runtimes on the main thread?

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

    I am seeing a strange behavior in my addon that is causing parts of my addon code to hang (when a modal dialog is up, am not able to receive data on socket #1)

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

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

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