在网页中向Javascript公开一个XPCOM组件

3
我想编写一个XPCOM组件,将其作为JavaScript对象暴露在网页中。类似Google Gears的东西是我所追求的。也就是说,在安装了Google Gears Firefox扩展之后,JavaScript对象“google.gears”可供任何想要使用它的网页使用。我找到了很多关于XPCOM开发的Mozilla文档,但没有关于如何将组件暴露给运行在网页中的JavaScript的任何说明。这是否可能使用XPCOM实现?我需要编写Firefox插件而不是扩展吗?
5个回答

7

我正在使用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} - sdwilsh
抱歉让你感到有些枯燥,但是JS全局属性并不是什么新鲜事物。nsIDOMGlobalPropertyInitializer接口是新的,但对于提问者所问的问题并不需要它。不过这个接口还是很酷的,因为如果你的JS全局属性实现了它,它可以找出它附加到哪个窗口对象上。在Firefox 4之前是不可能做到这一点的。 - Matthew Gertner

1

这篇文章看起来很有前途:

一般来说,不受信任的内容(例如网页)无法对大多数XPCOM组件进行任何操作,包括创建它们。当然,也有例外情况 - 例如,DOM对象是具有明确定义的公共使用接口的赞美XPCOM组件。但是,为了使网页使用组件,包括调用任何方法或属性,组件必须明确告诉Mozilla什么是允许的,什么是不允许的。nsISecurityCheckedComponent接口定义了如何实现。

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


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

0

你可以使用网页扩展来实现这个功能,我已经阅读过并且不再提供支持。


0

可以做到,但您需要代理对XPCOM组件的调用。还要注意,这可能也相当危险。

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


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