【发布时间】: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”);
任何帮助将不胜感激。
【问题讨论】: