在网页中将 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 组件
帮我创建一个 Firefox 扩展(Javascript XPCOM 组件)