获取有关上载文件的信息

时间:2015-01-28 13:59:11

标签: firefox-addon firefox-addon-sdk

我正在尝试为Firefox编写一个插件,显示正在上传到网站的文件的当前百分比(类似于chrome的工作方式)。我遇到的问题是我从未使用过Addons for Firefox,所以我有点困惑。

我查看了2011年发布的this Addon的来源,该开发人员引用了以下文件:

Components.utils.import("resource://gre/modules/DownloadUtils.jsm");
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/PluralForm.jsm");

我在浏览源代码时发现的另一段有趣的代码是:

Components.classes["@mozilla.org/network/http-activity-distributor;1"],

我已经对这些模块/类进行了一些研究,但我想知道在过去的4年里技术是否发生了变化,Firefox使得获取文件上传信息变得容易一些。

根据我在Web开发方面的经验,您可以使用XMLHttpRequest()addEventListener("progress", <function>, false);但是Firefox插件可以实现吗?它会与上传到网站的任何文件一起使用吗?

我很丢失,你可以看到,任何帮助将不胜感激。非常感谢你!!

1 个答案:

答案 0 :(得分:0)

实际上看起来你需要的所有代码都在那个插件中,我从你在这里发布的插件中取出了这个:https://addons.mozilla.org/en-US/firefox/files/browse/125019/file/components/uploads.js#top

init: function() {
        //dump(">>>>>>>>>>>>>>>>>>>>>> INITIALIZED\n");
        // add observer
        var hao = Ci.nsIHttpActivityObserver;
        var _self = this;
        this.observer = {
            observeActivity: function(aHttpChannel, aActivityType,
                aActivitySubtype, aTimestamp, aExtraSizeData, aExtraStringData) {
                if ((aActivityType == hao.ACTIVITY_TYPE_SOCKET_TRANSPORT) &&
                    (aActivitySubtype == 0x804b0005)) { // STATUS_SENDING_TO
                    //dump("UPDATE STATUS: ["+aTimestamp+"] *" + aHttpChannel + "*\n");
                    _self.updateStatus(aHttpChannel, aTimestamp, aExtraSizeData);
                }
                if (aActivityType == hao.ACTIVITY_TYPE_HTTP_TRANSACTION) {
                    switch (aActivitySubtype) {
                        //case hao.ACTIVITY_SUBTYPE_RESPONSE_COMPLETE:
                        case hao.ACTIVITY_SUBTYPE_TRANSACTION_CLOSE:
                            //dump("REMOVE: *" + aHttpChannel + "*\n");
                            _self.removeUpload(aHttpChannel);
                            break;
                        case hao.ACTIVITY_SUBTYPE_REQUEST_HEADER:
                            //dump("CREATE: *" + aHttpChannel + "*\n");
                            _self.createUpload(aHttpChannel);
                            break;
                    }
                }
            }
        };
        Cc["@mozilla.org/network/http-activity-distributor;1"]
            .getService(Ci.nsIHttpActivityDistributor)
            .addObserver(this.observer);
    },
    shutdown: function() {
        Cc["@mozilla.org/network/http-activity-distributor;1"]
            .getService(Ci.nsIHttpActivityDistributor)
            .removeObserver(this.observer);
    },