我想编写一个XPCOM组件,将其作为JavaScript对象暴露在网页中。类似Google Gears的东西是我所追求的。也就是说,在安装了Google Gears Firefox扩展之后,JavaScript对象“google.gears”可供任何想要使用它的网页使用。我找到了很多关于XPCOM开发的Mozilla文档,但没有关于如何将组件暴露给运行在网页中的JavaScript的任何说明。这是否可能使用XPCOM实现?我需要编写Firefox插件而不是扩展吗?
我正在使用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。
这篇文章看起来很有前途:
一般来说,不受信任的内容(例如网页)无法对大多数XPCOM组件进行任何操作,包括创建它们。当然,也有例外情况 - 例如,DOM对象是具有明确定义的公共使用接口的赞美XPCOM组件。但是,为了使网页使用组件,包括调用任何方法或属性,组件必须明确告诉Mozilla什么是允许的,什么是不允许的。nsISecurityCheckedComponent接口定义了如何实现。
来源:http://weblogs.mozillazine.org/weirdal/archives/017211.html
你可以使用网页扩展来实现这个功能,我已经阅读过并且不再提供支持。
category JavaScript-global-property {property name} {component contract id}
。 - sdwilsh