我想写一个XPCOM组件,它在网页中作为javascript对象公开。像Google Gears这样的东西就是我所追求的。也就是说,在安装Google Gears Firefox扩展程序后,任何想要使用它的网页都可以使用javascript对象“google.gears”。我发现了很多关于XPCOM开发的mozilla文档,但没有任何关于将组件暴露给网页中运行的javascript的信息。这可能与XPCOM一起使用吗?我是否需要编写Firefox插件而不是扩展名?
答案 0 :(得分: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
答案 1 :(得分:1)
This article似乎很有希望:
一般来说,不受信任的内容 (如网页)无能为力 与大多数XPCOM组件,包括 创造它们。当然有 此政策的例外情况 - DOM 例如,对象得到了美化 XPCOM组件具有明确定义 供公众使用的界面。对于网络 但是,页面使用组件 包括呼吁任何方法或 属性,组件必须 明确告诉Mozilla是什么 允许的,什么不是。该 nsISecurityCheckedComponent接口 定义如何完成。
来源:http://weblogs.mozillazine.org/weirdal/archives/017211.html
答案 2 :(得分:1)
旧的3.x方法是在“JavaScript全局属性”类别中注册您的组件。 (这仍然适用于4.x,但您必须使用“JavaScript-global-property”类别,因为不再允许类别名称包含空格。)您的对象必须实现nsIClassInfo接口,加上您想要向内容公开的任何接口。它并不是非常有用,因为您无法知道哪些内容脚本正在访问您的对象。
答案 3 :(得分:0)
这是可行的,但您必须代理对XPCOM组件的调用。还要记住,它也可能非常危险。
请参阅我的回答here,了解如何将chrome对象公开给内容代码。
答案 4 :(得分:0)
您可以使用网络扩展程序执行此操作,我已阅读并且将不再提供支持