火狐浏览器的C++插件

3
Firefox提供XPCOM API接口,可以用C++编写附加组件类,并允许第三方Web应用程序访问。我想知道是否有其他方法可以实现这些好处(即编写一个C++附加组件并提供JavaScript接口,以便任何JavaScript应用程序都可以使用此接口并最终使用C++类功能)。
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调用您的库。 据我所知,大多数附加组件现在已经转换为使用js-ctypes。


非常感谢您详尽的回答!您能否建议一下这个链接中提到的 http://stackoverflow.com/questions/17955147/ideas-needed-javascriptxpcomc-add-on 的可能替代方案? - peetonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接