C ++中的Firefox附加组件

时间:2013-07-23 23:24:48

标签: firefox firefox-addon

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

1 个答案:

答案 0 :(得分:1)

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

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

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

MDN有一些关于网页到扩展程序通信的文章,反之亦然,例如,您可以使用,例如"Interaction between privileged and non-privileged pages"

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

  • 您需要针对每个Gecko版本(每六周)重新编译二进制文件,因为自Firefox 4以来二进制组件已经过版本标记。
  • (点)版本之间的二进制API / ABI不像您希望的那样稳定。实际上API / ABI经常在游戏后期无意中破坏,导致许多用户遭受大量不必要的崩溃,例如: bug 828296
  • 平台开发人员officially said binary components in extensions are a hassle

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