处理和中止Firefox扩展的下载

时间:2011-02-09 17:42:10

标签: javascript firefox xul xpcom

我的扩展需要奇怪的行为:)

当用户输入URL或点击指向某个文档的链接时,我需要向他显示一些网页,而不是下载此文件(例如,pdf的web查看器)。换句话说,我想在内容的mimetype和action之间建立绑定。

有没有办法从特权XUL代码那里做到这一点?

PS。我知道我可以编写用于在浏览器中显示内容的插件,比如Adobe Reader插件,但我更喜欢用JS而不是C ++编写(并且不想为插件应该工作的所有平台交叉编译我的代码)。

1 个答案:

答案 0 :(得分:1)

您可以向类别管理器注册实现nsIRUIContentListener接口的组件。该类别为external-uricontentlisteners。该条目是您要注册的MIME类型。该值是组件的合同ID。

或者,可以直接使用URI侦听器注册组件,但这仅在您已经在启动时加载组件时才有用。

当您的用户点击指向使用该MIME类型提供的文档的链接时(并且没有已安装的插件已经处理该类型),那么您的组件将被创建。将调用其中一个isPreferredcanHandleContent方法;您应该验证内容类型是否是您想要的,然后返回true。然后将调用您的doContent方法,您可以使用它来打开一个窗口来处理请求。您应该返回true表示您实际上没有为现有窗口提供内容。

编辑:

如果要读取文档并就地输出其他文档,则需要注册流转换器。这是通过注册实现nsIStreamConverter接口层次结构和合同ID @mozilla.org/streamconv;1?from=<MIME>&to=<MIME>的组件来完成的。我不是100%确定,但您可能必须将to设置为*/*,然后您的GetContentType方法应返回您提供的实际内容类型。然后,您的asyncConvertData方法将传递到目标流侦听器。数据将通过基础nsIStreamListener界面提供给您,然后您可以将转换后的数据提供给目标流。