我创建了一个下载管理器,现在我正在创建它的扩展。对于firefox扩展,问题是我找不到一个体面的方式,我可以听取创建下载,然后停止创建并将URL重定向到我的应用程序。所以这里有两种方法我已经尝试过它们的缺点:
1。使用Downloads.jsm
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
let list;
let view = {
onDownloadAdded: download => {
Task.spawn(function () {
try {
// Send download.source.url to my application
yield download.finalize(true);
yield list.remove(download);
} catch (ex) {
console.error(ex);
}
});
}
};
Task.spawn(function () {
list = yield Downloads.getList(Downloads.ALL);
yield list.addView(view);
}).then(null, Cu.reportError);
exports.onUnload = function (reason) {
list.removeView(view);
};

问题:这种方法的问题是用户必须先点击另存为对话框,然后点击我的下载管理器上的开始按钮,这是完全不可接受的。如果我必须使用这种方法,我需要一些方法来删除此另存为对话框。并且因为我在取消下载时取消下载显示为已取消"显示所有下载" firefox中的对话框。
2。使用http-on-modify-request
var dlExtensions = [".exe", ".iso"];
const {components, Cc, Ci} = require("chrome");
httpRequestObserver =
{
observe: function (aSubject, aTopic, aData) {
if (aTopic == "http-on-modify-request") {
let url;
aSubject.QueryInterface(Ci.nsIHttpChannel);
url = aSubject.URI.spec;
for (var x in dlExtensions) {
if (url.endsWith(dlExtensions[x])) {
aSubject.cancel(components.results.NS_BINDING_ABORTED);
// Send url to my application
break;
}
}
}
}
};
var observerService = components.classes["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
observerService.addObserver(httpRequestObserver, "http-on-modify-request", false);

问题:此代码按预期工作,但问题是我必须定义要下载的所有文件的下载扩展名,并且它们太多了。
要求:所以基本上我需要一个监听器来监听firefox中的下载创建,以及我可以停止定期下载对话框并让我的代码执行的方式。(注意监听器方法1中存在的方法是不可用的,因为它在下载列表中侦听下载的添加,而不是为了创建下载对话框而创建下载