3

Firefox 提供 XPCOM API 接口,用于在 C++ 中编写附加类,并允许第三方 Web 应用程序访问它们。我想知道 - 有没有其他方法可以实现这些好处(即用 C++ 编写一个插件并提供一个 JavaScript 接口,所以任何 JavaScript 应用程序都可以使用这个接口并最终使用 C++ 类功能)?

4

1 回答 1

1

是的,可以用 C++(或 Javascript)编写 XPCOM 组件并将它们公开给网站。JavaScript-global-property您可以在、JavaScript-global-constructor等类别中注册它们。这些东西通常没有很好的记录,如果有的话。如果您想了解更多信息,请阅读代码(例如在mxr上)。

但出于多种原因,强烈建议不要这样做:

  • 很难确保这些东西实际上是安全的并使其工作可靠。
  • 很难控制哪些网站可能实际使用新 API。JavaScript-global-property和朋友将可用于所有网站!
  • 您的附加组件将在全局 javascript 命名空间中引入新名称,这可能与网站代码发生冲突。(正因为如此,许多新的 WebAPI 并没有直接引入全局命名空间,而是成为 navigator 的属性)。
  • 由于这些原因,addons.mozilla.org 站点将仅接受使用此机制的插件作为规则的例外,并且仅当作者证明需要使用并且没有真正的替代品时。

MDN有几篇关于网页到扩展通信的文章,反之亦然,您可以使用,例如“特权和非特权页面之间的交互”

此外,不鼓励在扩展中发布二进制 XPCOM 组件:

  • 您需要针对每个 Gecko 版本(每六周)重新编译您的二进制文件,因为二进制组件自 Firefox 4 起就有版本标记。
  • (点)版本之间的二进制 API/ABI 并不像您希望的那样稳定。实际上,API/ABI 经常在游戏后期不经意间被破坏,导致很多用户不必要的崩溃,例如bug 828296
  • 平台开发人员正式表示扩展中的二进制组件很麻烦

相反,您应该尽可能使用 Javascript,和/或使用 C-API/ABI 创建一个普通的二进制库(.so、.dll、.dylib)并使用js-ctypes。您可以在 javascript 中实现 XPCOM 组件,然后使用 js-ctypes 调用您的库。AFAIK 现在大多数附加组件都切换到了 js-ctypes。

于 2013-08-02T17:37:36.333 回答