在网页中将 XPCOM 组件公开给 javascript

Posted

技术标签:

【中文标题】在网页中将 XPCOM 组件公开给 javascript【英文标题】:Expose an XPCOM component to javascript in a web page 【发布时间】:2011-02-28 18:39:21 【问题描述】:

我想编写一个 XPCOM 组件,它在网页中作为 javascript 对象公开。我正在寻找像 Google Gears 这样的东西。也就是说,在安装 Google Gears Firefox 扩展后,javascript 对象“google.gears”可用于任何想要使用它的网页。我发现了很多关于 XPCOM 开发的 mozilla 文档,但没有将组件暴露给在网页中运行的 javascript。 XPCOM可以做到这一点吗?我是否需要编写 Firefox 插件而不是扩展程序?

【问题讨论】:

【参考方案1】:

我正在使用 Firefox 4 中的一个新 API - nsiDOMGlobalPropertyInitializer 来做到这一点 - 它允许您创建一个 JS 对象以延迟附加到所有窗口。这就是 Firefox 4 中新的 Web 控制台的创建方式。

您的组件中必须具有以下 QI 属性:

QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer]),

以下是扩展中完整实现的示例:

https://github.com/daviddahl/domcrypt/blob/master/extension/domcrypt/components/domcrypt.js

所以基本上,QI 到 Ci.nsIDOMGlobalPropertyInitializer,然后确保你的清单有这样一行:

category JavaScript-global-property crypt @droplettr.com/domcrypt;1

见:https://github.com/daviddahl/domcrypt/blob/master/extension/domcrypt/components/domcrypt.manifest

【讨论】:

清单行总是看起来像category JavaScript-global-property property name component contract id 很抱歉让你失望了,但 JS 全局属性并没有什么新鲜事。 nsIDOMGlobalPropertyInitializer 接口是新的,但对于提问者的问题,它并不是必需的。不过这很酷,因为如果你的 JS 全局属性实现了它,它可以找出它附加到哪个窗口对象。这在 Firefox 4 之前是不可能的。【参考方案2】:

This article 看起来很有希望:

一般来说,不受信任的内容 (例如网页)不能做任何事情 大多数 XPCOM 组件,包括 创建它们。当然有 此政策的例外情况 - DOM 例如,物体被美化 具有明确定义的 XPCOM 组件 供公众使用的接口。对于网络 页面使用组件,但是, 包括调用任何方法或 属性,组件必须 明确告诉 Mozilla 什么是 允许的和不允许的。这 nsISecurityCheckedComponent 接口 定义如何完成。

来源:http://weblogs.mozillazine.org/weirdal/archives/017211.html

【讨论】:

【参考方案3】:

旧的 3.x 方法是在“JavaScript 全局属性”类别中注册您的组件。 (这在 4.x 中仍然有效,但您必须改用“JavaScript-global-property”类别,因为类别名称不再允许包含空格。)您的对象必须实现 nsIClassInfo 接口,加上任何您要向内容公开的接口。它并不是非常有用,因为您无法知道哪个内容脚本正在访问您的对象。

【讨论】:

【参考方案4】:

这是可行的,但您必须代理对 XPCOM 组件的调用。还要记住,它也可能非常危险。

请参阅我的回答 here,了解如何将 chrome 对象公开给内容代码。

【讨论】:

【参考方案5】:

您可以使用网络扩展来做到这一点,我已阅读并且将不再提供支持

【讨论】:

以上是关于在网页中将 XPCOM 组件公开给 javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何从 javascript xpcom 组件中使用 c++ xpcom 组件

c++ XPCOM组件与COM服务之间的通信(IPC)

注册 XPCOM 组件时出现问题

帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)

XPCOM 组件 DLL 加载到 Firefox 中,但随后无法注册其类

XPCOM 的 XPI 扩展