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的主要内容,如果未能解决你的问题,请参考以下文章