我有一个简单的插件,可以使用Downloads.jsm和Task.jsm截取新的下载,就像我在前面的问题中建议的那样:
其想法是,外接程序应该执行以下操作:
使用下面的代码,我可以拦截下载并获取它的信息,比如源和目的地,但是取消和删除下载会给我带来一些问题。
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Task.spawn(function() {
let list = yield Downloads.getList(Downloads.ALL);
let view = {
onDownloadAdded: download => {
console.log("Added", download);
// cancel the download
download.cancel();
// finialize (remove partial data)
download.finalize(true);
// delete the partial data
download.removePartialData();
// remove it from the list
list.remove(download);
},
onDownloadChanged: download => console.log("Changed", download),
onDownloadRemoved: download => console.log("Removed", download)
};
yield list.addView(view);
});我应该需要的DownloadList和Download对象公开所有函数,但是有些东西没有像预期的那样工作。
尽管下载已从Firefox下载列表中删除,而且在下载库中,我可以将下载视为“取消”,但对finalize(true)的调用并不会删除部分文件下载(removePartialData也不会)。
我相信这是因为下载没有被正确删除。即使它们在库中显示为取消,如果我浏览到我的下载文件夹,我可以看到.part文件在增长,就好像下载还在进行中一样。
我怀疑这可能是因为我试图在下载真正启动之前取消它,所以下载可能没有正确地处理cancel()调用?
发布于 2014-06-28 14:30:26
好的,这些API方法返回承诺,也就是说,它或多或少会立即返回并承诺在将来的某个时候执行所请求的操作。因此,你需要等待承诺真正实现(或被拒绝)。再次使用Task.jsm:
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
let view = {
onDownloadAdded: download => {
Task.spawn(function() {
try {
console.log("Added", download);
// cancel the download
yield download.cancel();
// delete the partial data
yield download.removePartialData();
// remove it from the list
yield list.remove(download);
} catch (ex) {
console.error(ex);
}
});
},
onDownloadChanged: download => console.log("Changed", download),
onDownloadRemoved: download => console.log("Removed", download)
};
Task.spawn(function() {
let list = yield Downloads.getList(Downloads.ALL);
yield list.addView(view);
});https://stackoverflow.com/questions/24467443
复制相似问题