我为Windows编写了一个简单的下载管理器,我想为Firefox创建一个插件,当启用它时会拦截Firefox中的新下载并将它们发送给下载管理器。
我已经使用
为谷歌浏览器做了这个chrome.downloads.onCreated.addListener(function(details) {
// stop the download
chrome.downloads.cancel(details.id, null);
}
问题是如何使用 Firefox附加SDK 实现类似的功能。
我看到有一种拦截页面加载的方法来查看可能有用的内容/标题,但后来我不知道该请求是否会变成下载。
Firefox add-on SDK: Get http response headers
我或许可以查找不是text / html的内容类型或检查内容处置标题,但如果我没有正确处理所有情况,可能会导致问题。
是否无法使用JS SDK访问下载管理器或某种方式知道下载何时开始/正在启动并停止下载?
答案 0 :(得分:5)
链接问题讨论的http-on-examine-response
观察者是错误的方法。它涉及所有请求,而不仅仅是下载。
而是使用Downloads.jsm
观察新的下载,然后取消它们,等等。
要在SDK中加载Downloads.jsm
,请使用:
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
然后你可以添加你的听众。
let view = {
onDownloadAdded: function(download) {
console.log("Added", download);
},
onDownloadChanged: function(download) {
console.log("Changed", download);
},
onDownloadRemoved: function(download) {
console.log("Removed", download);
}
};
Task.spawn(function() {
try {
let list = yield Downloads.getList(Downloads.ALL);
yield list.addView(view);
} catch (ex) {
console.error(ex);
}
});
链接的MDN文档包含更多信息和样本。
由于您的加载项是一个无重启的SDK附加组件,因此您需要在卸载时使用.removeView
再次删除侦听器,否则会出现内存泄漏。
答案 1 :(得分:2)
这是JSM的方式。
Components.utils.import("resource://gre/modules/Downloads.jsm");
Components.utils.import("resource://gre/modules/Task.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var view = {
onDownloadChanged: function (download) {
console.log(download, 'Changed');
if (download.succeeded) {
var file = new FileUtils.File(this.target.path);
console.log('file', file);
}
}
};
var list;
Task.spawn(function () {
list = yield Downloads.getList(Downloads.ALL);
list.addView(view);
}).then(null, Components.utils.reportError);
请记住removeView
停止聆听。可以在任何地方执行此操作,例如shutdown
函数或其他任何内容,不必在Task.spawn
范围内,因此list
必须是全局变量。
list.removeView(view); //to stop listening
以旧方式,似乎仍然有效。虽然我认为他们说他们要取出旧的downloadManager:
var observerService = Components.classes["@mozilla.org/download-manager;1"].getService(Components.interfaces.nsIDownloadManager);
observerService.addListener({
onDownloadStateChange: function (state, dl) {
console.log('dl=', dl);
console.log('state=', state);
console.log('targetFile', dl.targetFile);
if (state == 7 && dl.targetFile.leafName.substr(-4) == ".txt") {
//guys just downloaded (succesfully) a .txt file
}
}
});
这是一个含有更多的mozillazine:http://forums.mozillazine.org/viewtopic.php?f=19&t=2792021