Firefox addon 拦截/处理mime类型/文件

Firefox addon 拦截/处理mime类型/文件,firefox-addon,firefox-addon-sdk,xpcom,Firefox Addon,Firefox Addon Sdk,Xpcom,如何禁用.torrent文件/内容类型应用程序/x-bittorrent的默认操作(例如使用dialog或run program打开),而是在扩展中处理数据?有多种方法,这一切归结为nsimimimeservice/nsIHandlerService和nsimimimeinfo并设置适当的nsIHandlerInfo。例如,请参阅(通过有效地禁用所有处理程序或插件并实现流转换器),或my(与mime无关,但与协议相关,但处理程序信息内容仍然适用) 根据您处理事情的方式,您可以使用服务接口,例如,

如何禁用.torrent文件/内容类型应用程序/x-bittorrent的默认操作(例如使用dialog或run program打开),而是在扩展中处理数据?

有多种方法,这一切归结为
nsimimimeservice
/
nsIHandlerService
nsimimimeinfo
并设置适当的
nsIHandlerInfo
。例如,请参阅(通过有效地禁用所有处理程序或插件并实现流转换器),或my(与mime无关,但与协议相关,但处理程序信息内容仍然适用)

根据您处理事情的方式,您可以使用服务接口,例如,将uri(协议)或文件(mime)直接传递给某个本地或web应用程序,或者实现一个完整的流转换器,如PDF.js


理论上,还可以实现新类型的
nsIHandlerApp
派生接口,特别是实现
launchWithURI
(协议)或
launchWithFile
(mime内容类型和文件扩展名(下载))。但是,这有点棘手,因为NSHandlerService只处理内置接口。

基于@nmaiers post,您可以这样做:

如果mime类型已经存在,您可以这样做。如果它不存在,我不知道如何添加它,可能是一些寄存器函数

出于某种原因,我的
torrent
s的类型是
application/x-download
我不知道为什么。如果你想知道我是怎么知道的,我会告诉你的。因此,在下面的示例中,我将其用作文件类型

当我们
console.log(wrappedHandlerInfo)
看到它是这样的:

现在让我们枚举所有的应用程序处理程序(我从这里得到:,如果
.type=='application/x-download',让我们
break',这样我们就可以玩这个对象了

var handlerService = Cc['@mozilla.org/uriloader/handler-service;1'].getService(Ci.nsIHandlerService);

var listOfWrappedHandlers = handlerService.enumerate();
var i = 0;
while (listOfWrappedHandlers.hasMoreElements()) {
  var wrappedHandlerInfo = listOfWrappedHandlers.getNext().QueryInterface(Ci.nsIHandlerInfo);
  console.log(i, 'handler for', wrappedHandlerInfo.type, wrappedHandlerInfo);
  if (wrappedHandlerInfo.type == 'application/x-download') {
    break;
  }
  i++;
}
console.log('Listed ', i, ' handlers');
console.log('wrappedHandlerInfo=', wrappedHandlerInfo); //should be the application/x-download one as we broke the loop once it found that
现在我们必须设置它的属性,然后保存它

// Change and save mime handler settings.
wrappedHandlerInfo.alwaysAskBeforeHandling = false;
wrappedHandlerInfo.preferredAction = Ci.nsIHandlerInfo.handleInternally;
handlerService.store(wrappedHandlerInfo);
不过,我也不确定该如何更改这些属性,也许@nmaier可以就此向我们提供建议。 我们在该商店上看到:

69    * Save the preferred action, preferred handler, possible handlers, and
70    * always ask properties of the given handler info object to the datastore.
71    * Updates an existing record or creates a new one if necessary.
72    *
73    * Note: if preferred action is undefined or invalid, then we assume
74    * the default value nsIHandlerInfo::useHelperApp.
75    *
76    * @param aHandlerInfo  the handler info object
77    */
78   void store(in nsIHandlerInfo aHandlerInfo);

另一种方式 好的,我找到了一个更好的方法,这样你就不需要循环找到处理程序了

这样做:

var mimeService = Cc['@mozilla.org/mime;1'].getService(Ci.nsIMIMEService);
var CONTENT_TYPE = ''; //'application/x-download'; can leave this blank
var TYPE_EXTENSION = 'torrent';

var handlerInfo = mimeService.getFromTypeAndExtension(CONTENT_TYPE, TYPE_EXTENSION);
console.info('handlerInfo:', handlerInfo); //http://i.imgur.com/dUKox24.png

    // Change and save mime handler settings.
    handlerInfo.alwaysAskBeforeHandling = false;
    handlerInfo.preferredAction = Ci.nsIHandlerInfo.handleInternally;
    handlerService.store(handlerInfo);
这个
handlerInfo
对象稍有不同,因为它有一个
primaryExtension
属性,该属性保存torrent


两方面都有问题 这两种方法的问题是,如果mime类型不存在,您必须以某种方式注册它,我不知道如何注册。可能需要使用mime服务和一些注册函数

2014年8月3日更新 我想我找到了解决上述问题的方法(两种方法都有问题)

这是
addPossibleApplicationHandler
的代码,我们可能只需要复制它并进行编辑

2014年8月3日更新 好的,这是如何添加协议处理程序(它只添加了一个nsIWebAppHandler,但我肯定会添加一个本地的,这意味着一个nsIAppHandler它应该是类似的,只是不需要uri参数:



nsimimemeservice
:MXR::nsimimemeservice.idl

中提供的功能信息我查看了它,但我不确定。我查看了firefox如何使浏览器成为默认应用程序,它使用shell服务,请尝试在此处进行调查:我考虑过这一点。如果你想说用户从操作系统文件资源管理器中单击了一个文件,那么你必须做一些每个操作系统的东西。但如果你想当用户在firefox中点击某个具有特定扩展名的链接时,你可以通过附加组件来处理。而不是使用我之前评论中的shell方法。我必须坐下来处理这个问题,现在太累了335am!是的,我想在点击链接时覆盖firefox默认操作。我找到一些旧代码它使用观察者和过滤器过滤所有请求和响应,然后当它是torrent时内联文件附件以禁用弹出对话框,但它似乎不再工作。肯定有一种方法可以简单地注册mime类型本身的句柄吗?好的,Firefox在选项中有一个mime类型的处理程序。所以你得胡闹了有了它,我研究了它,但我不知道如何将它设置为扩展。以下是mxr上为mime类型设置处理程序的来源:感谢man的这篇文章。这不是一个填鸭式的解决方案,花了我一周左右的时间,但我记下了它。为普通用户制作了这个简单的附加组件,以MailToHandl的形式安装webmamil客户端呃..我相信你的“协议XPCOM教育:P
235   addPossibleApplicationHandler: function(aNewHandler) {
236     var possibleApps = this.possibleApplicationHandlers.enumerate();
237     while (possibleApps.hasMoreElements()) {
238       if (possibleApps.getNext().equals(aNewHandler))
239         return;
240     }
241     this.possibleApplicationHandlers.appendElement(aNewHandler, false);
242   },
243