拦截Firefox Addon SDK中的新下载

时间:2014-06-28 10:53:53

标签: javascript firefox-addon firefox-addon-sdk

我为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访问下载管理器或某种方式知道下载何时开始/正在启动并停止下载?

2 个答案:

答案 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