下载对话框的监听器创建了Firefox

时间:2015-05-18 06:52:28

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

我创建了一个下载管理器,现在我正在创建它的扩展。对于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中存在的方法是不可用的,因为它在下载列表中侦听下载的添加,而不是为了创建下载对话框而创建下载

0 个答案:

没有答案