Firefox addon 拦截/处理mime类型/文件
如何禁用.torrent文件/内容类型应用程序/x-bittorrent的默认操作(例如使用dialog或run program打开),而是在扩展中处理数据?有多种方法,这一切归结为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无关,但与协议相关,但处理程序信息内容仍然适用) 根据您处理事情的方式,您可以使用服务接口,例如,
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