我的扩展需要奇怪的行为:)
当用户输入URL或点击指向某个文档的链接时,我需要向他显示一些网页,而不是下载此文件(例如,pdf的web查看器)。换句话说,我想在内容的mimetype和action之间建立绑定。
有没有办法从特权XUL代码那里做到这一点?
PS。我知道我可以编写用于在浏览器中显示内容的插件,比如Adobe Reader插件,但我更喜欢用JS而不是C ++编写(并且不想为插件应该工作的所有平台交叉编译我的代码)。
答案 0 :(得分:1)
您可以向类别管理器注册实现nsIRUIContentListener
接口的组件。该类别为external-uricontentlisteners
。该条目是您要注册的MIME类型。该值是组件的合同ID。
或者,可以直接使用URI侦听器注册组件,但这仅在您已经在启动时加载组件时才有用。
当您的用户点击指向使用该MIME类型提供的文档的链接时(并且没有已安装的插件已经处理该类型),那么您的组件将被创建。将调用其中一个isPreferred
或canHandleContent
方法;您应该验证内容类型是否是您想要的,然后返回true。然后将调用您的doContent
方法,您可以使用它来打开一个窗口来处理请求。您应该返回true表示您实际上没有为现有窗口提供内容。
编辑:
如果要读取文档并就地输出其他文档,则需要注册流转换器。这是通过注册实现nsIStreamConverter
接口层次结构和合同ID @mozilla.org/streamconv;1?from=<MIME>&to=<MIME>
的组件来完成的。我不是100%确定,但您可能必须将to
设置为*/*
,然后您的GetContentType
方法应返回您提供的实际内容类型。然后,您的asyncConvertData
方法将传递到目标流侦听器。数据将通过基础nsIStreamListener
界面提供给您,然后您可以将转换后的数据提供给目标流。