在网页中向javascript公开XPCOM组件

在网页中向javascript公开XPCOM组件,javascript,firefox,xpcom,Javascript,Firefox,Xpcom,我想编写一个XPCOM组件,在网页中作为javascript对象公开。我正在寻找谷歌齿轮之类的东西。也就是说,在安装GoogleGears Firefox扩展之后,javascript对象“Google.Gears”可用于任何想要使用它的网页。我已经找到了很多关于XPCOM开发的mozilla文档,但是没有任何关于将组件暴露于网页中运行的javascript的文档。这在XPCOM中是可能的吗?我需要编写Firefox插件而不是扩展吗?似乎很有希望: 一般来说,不可信的内容 (比如网页)什么都做不

我想编写一个XPCOM组件,在网页中作为javascript对象公开。我正在寻找谷歌齿轮之类的东西。也就是说,在安装GoogleGears Firefox扩展之后,javascript对象“Google.Gears”可用于任何想要使用它的网页。我已经找到了很多关于XPCOM开发的mozilla文档,但是没有任何关于将组件暴露于网页中运行的javascript的文档。这在XPCOM中是可能的吗?我需要编写Firefox插件而不是扩展吗?

似乎很有希望:

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


来源

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


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

我正是通过Firefox 4中的一个新API—nsiDOMGlobalPropertyInitializer—来实现这一点的,该API允许您创建一个JS对象以延迟地附加到所有窗口。这就是Firefox4中新的Web控制台的创建方式

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

QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer]),
以下是扩展中完整实现的示例:

因此,基本上,将QI转换为Ci.nsIDOMGlobalPropertyInitializer,然后确保清单中有一行内容如下:

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

请参阅:

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

您可以通过web扩展来实现这一点,我已经读过,并且不再支持它了

清单行总是看起来像
类别JavaScript全局属性{property name}{component contract id}
很抱歉对你发火,但是JS全局属性没有什么新的。nsIDOMGlobalPropertyInitializer接口是新的,但发问者询问的内容不需要它。不过这很酷,因为如果您的JS全局属性实现了它,它可以找到它所附加到的窗口对象。这在Firefox4之前是不可能的。