C++ 中的 Firefox 附加组件

标签 firefox firefox-addon

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

最佳答案

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

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

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

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 调用你的库。 据我所知,现在大多数附加组件都切换到了 js-ctypes。

关于C++ 中的 Firefox 附加组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17822669/

相关文章:

javascript - FCM 通知适用于 Chrome 但不适用于 Firefox

javascript - 在 Firefox 扩展中操作 <canvas> 图像数据

javascript - 调试 firefox 扩展的问题

javascript - 如何转义 JSON 中的反斜杠?

css - 奇怪的 firefox float 定位,在 chrome/safari (CSS) 中工作正常

internet-explorer - IE、火狐、Safari : Want to write Internet filter: Are there well known "hooks" that I can tie into?

javascript - 火狐扩展 : write cookie names for the current web-page in a local . txt 文件

javascript - Firefox 中的 jQuery @ 按键检测

firefox - 渲染 HTML5 动画服务器端?

javascript - 如何使用 document.getElementById ("table-name").rows.length;在 Firefox Addon SDK 扩展中