NS_ERROR_FAILURE

Posted

技术标签:

【中文标题】NS_ERROR_FAILURE【英文标题】: 【发布时间】:2011-01-11 03:39:03 【问题描述】:

我正在尝试实现"Ashita" 中描述的基本 XHR 侦听器,但是,当加载带有扩展名的 firefox 时,每当页面尝试加载时都会收到此错误,这会阻止任何内容加载:Error: uncaught exception: [Exception... "Component returned failure code: 0x80004005 () [nsIBinaryInputStream.readBytes]" nsresult: "0x80004005 ()" 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”);

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于NS_ERROR_FAILURE的主要内容,如果未能解决你的问题,请参考以下文章