拦截Firefox Addon SDK中的新下载

ant*_*tfx 4 javascript firefox-addon firefox-addon-sdk

我已经为Windows编写了一个简单的下载管理器,我想为Firefox创建一个插件,当启用它时会拦截Firefox中的新下载并将它们发送到下载管理器.

我已经使用以下方法为Google Chrome做了这个:

chrome.downloads.onCreated.addListener(function(details) {
    // stop the download
    chrome.downloads.cancel(details.id, null);
}
Run Code Online (Sandbox Code Playgroud)

问题是如何使用Firefox附加SDK实现类似的功能.

我看到有一种拦截页面加载的方法来查看可能有用的内容/标题,但后来我不知道请求是否会变成下载.

Firefox附加SDK:获取http响应头

我也许可以查找不是text/html的内容类型或检查内容处理标题,但如果我没有正确处理所有情况,可能会导致问题.

有没有办法使用JS SDK访问下载管理器或某种方式知道下载何时开始/正在启动并停止下载?

nma*_*ier 5

http-on-examine-response链接问题讨论的观察者是错误的方法.它涉及所有请求,而不仅仅是下载.

而是使用Downloads.jsm观察新的下载,然后取消它们,等等.

要加载Downloads.jsmSDK,请使用:

const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Run Code Online (Sandbox Code Playgroud)

然后你可以添加你的听众.

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

链接的MDN文档包含更多信息和示例.

由于您的加载项是一个无重启的SDK附加组件,因此您需要.removeView在卸载时再次删除侦听器,否则会出现内存泄漏.