【问题标题】:NS_ERROR_FAILURENS_ERROR_FAILURE
【发布时间】:2011-01-11 03:39:03
【问题描述】:

我正在尝试实现"Ashita" 中描述的基本 XHR 侦听器,但是,当加载带有扩展名的 firefox 时,每当页面尝试加载时都会收到此错误,这会阻止任何内容加载:Error: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIBinaryInputStream.readBytes]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: chrome://xhrlogger/content/overlay.js :: anonymous :: line 68" data: no]

我的 overlay.js 是:

if (typeof Cc == "undefined") {
    var Cc = Components.classes;
}
if (typeof Ci == "undefined") {
        var Ci = Components.interfaces;
}
if (typeof CCIN == "未定义") {
    功能CCIN(cName,ifaceName){
        返回 Cc[cName].createInstance(Ci[ifaceName]);
    }
}
if (typeof CCSV == "未定义") {
    函数 CCSV(cName, ifaceName){
        如果(抄送[cName])
            // 如果 fbs 加载失败,错误可能是 _CC[cName] has no properties
            返回 Cc[cName].getService(Ci[ifaceName]);
        别的
            dump("CCSV 对于 cName 失败:" + cName);
    };
}

var httpRequestObserver = {

    观察:函数(请求,aTopic,aData){
            if (aTopic == "http-on-examine-response") {
                var newListener = new TracingListener();
                request.QueryInterface(Ci.nsITraceableChannel);
                newListener.originalListener = request.setNewListener(newListener);
        }
    },

    查询接口:函数(aIID){
        if (aIID.equals(Ci.nsIObserver) ||
        aIID.equals(Ci.nsISupports)) {
            返回这个;
        }

        抛出 Components.results.NS_NOINTERFACE;

    },
};


函数跟踪侦听器(){
    this.receivedData = []; //初始化数组
}

TracingListener.prototype =
{
    原始侦听器:空,
    receivedData: null, // 将是传入数据的数组。

    onDataAvailable: 函数(请求、上下文、输入流、偏移量、计数){
       var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1",
                                 "nsIBinaryInputStream");
        binaryInputStream.setInputStream(inputStream);

        var storageStream = CCIN("@mozilla.org/storagestream;1",
                                 "nsIStorageStream");
        //8192是以字节为单位的段大小,count是以字节为单位的流的最大大小
        storageStream.init(8192, count, null);

    var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1",
                                 "nsIBinaryOutputStream");
        binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));

        // 复制接收到的数据。
        var data = binaryInputStream.readBytes(count);

        this.receivedData.push(data);

        binaryOutputStream.writeBytes(数据,计数);

        //沿链向下传递
        this.originalListener.onDataAvailable(request, context, inputStream, offset, count);
    },

    onStartRequest:函数(请求,上下文){
        this.originalListener.onStartRequest(request, context);
    },

    onStopRequest:函数(请求,上下文,状态码){
    尝试
    {
                //QueryInterface 进入 HttpChannel 以访问 originalURI 和 requestMethod 属性
        request.QueryInterface(Ci.nsIHttpChannel);

            变量数据=空;
            if (request.requestMethod.toLowerCase() == "post")
            {
                var postText = this.readPostTextFromRequest(request, context);
                如果(后文)
                    数据 = ((String)(postText)).parseQuery();

            }

                        //将响应组合成一个字符串
            var responseSource = this.receivedData.join('');

            //修复前导空格错误
            //(FM 偶尔会在其 ajax 响应的开头添加空格...
                        //这会破坏XML)
            responseSource = responseSource.replace(/^\s+(\S[\s\S]+)/, "$1");

                        //从请求的响应头中获取日期。
                        //对于 PirateQuesting,这比用户机器上的日期更受欢迎
            var date = Date.parse(request.getResponseHeader("Date"));

                        //又是一个 PQ 特定的函数调用,但作为示例。
                        //这只是传递一个字符串URL,响应的文本,
                        //日期和 POST 请求中的数据(如果适用)
/* piratequesting.ProcessRawResponse(request.originalURI.spec,
                                               响应源,
                                               日期,
                                               数据); */
            转储(日期);
            转储(数据);
            转储(响应源);
    }
    抓住 (e)
    {
        //标准函数将错误的格式化版本转储到控制台
        转储(e);
    }

        this.originalListener.onStopRequest(request, context, statusCode);
    },
    readPostTextFromRequest:函数(请求,上下文){
        尝试
        {
            var is = request.QueryInterface(Ci.nsIUploadChannel).uploadStream;
            如果是)
            {
                var ss = is.QueryInterface(Ci.nsISeekableStream);
                var prevOffset;
                如果 (ss)
                {
                    prevOffset = ss.tell();
                    ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
                }

                // 从流中读取数据..
            var charset = "UTF-8";
            var text = this.readFromStream(is, charset, true);

                if (ss && prevOffset == 0)
                    ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);

                返回文本;
            }
        别的 {
            dump("查询上传流接口失败。\n");
        }
        }
        捕获(不包括)
        {
            转储(不包括);
        }

        返回空值;
    },

    查询接口:函数(aIID){
        if (aIID.equals(Ci.nsIStreamListener) ||
            aIID.equals(Ci.nsISupports)) {
            返回这个;
        }
        抛出 Components.results.NS_NOINTERFACE;
    },
    readFromStream :函数(流,字符集,noClose){

        var sis = CCSV("@mozilla.org/binaryinputstream;1",
                            "nsIBinaryInputStream");
        sis.setInputStream(流);

        var 段 = [];
        for (var count = stream.available(); count; count = stream.available())
            段.push(sis.readBytes(count));

        if (!noClose)
            sis.close();

        var text = segments.join("");
        返回文本;
    }

}

var observerService = Cc["@mozilla.org/observer-service;1"]
    .getService(Ci.nsIObserverService);

observerService.addObserver(httpRequestObserver,
    “http-on-examine-response”,假);

转储(“WTFBBQ”);

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript firefox-addon


    【解决方案1】:

    我的似乎用更少的代码工作得很好。尝试将您的 onDataAvailable 函数代码替换为:

        var binaryInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
        binaryInputStream.setInputStream(inputStream);
        this.receivedData.push(binaryInputStream.readBytes(count));
    

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多