Javascript 如何让Firefox插件从页面监听xmlhttprequests?
背景Javascript 如何让Firefox插件从页面监听xmlhttprequests?,javascript,xmlhttprequest,firefox-addon,Javascript,Xmlhttprequest,Firefox Addon,背景 我有一个现有的扩展,设计用于基于浏览器的游戏(扩展是我的,游戏不是)。扩展一直在抓取页面以获取所需的数据,并发出ajax请求以执行任何操作 问题 游戏开发人员最近改变了网站上的一些操作以使用ajax请求,到目前为止,我无法从这些请求中获取数据 到目前为止我拥有的 function TracingListener() { } TracingListener.prototype = { originalListener: null, receivedData: [], /
我有一个现有的扩展,设计用于基于浏览器的游戏(扩展是我的,游戏不是)。扩展一直在抓取页面以获取所需的数据,并发出ajax请求以执行任何操作 问题
游戏开发人员最近改变了网站上的一些操作以使用ajax请求,到目前为止,我无法从这些请求中获取数据 到目前为止我拥有的
function TracingListener() {
}
TracingListener.prototype =
{
originalListener: null,
receivedData: [], // array for incoming data.
onDataAvailable: function(request, context, inputStream, offset, count)
{
var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream");
var storageStream = CCIN("@mozilla.org/storagestream;1", "nsIStorageStream");
binaryInputStream.setInputStream(inputStream);
storageStream.init(8192, count, null);
var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1",
"nsIBinaryOutputStream");
binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
// Copy received data as they come.
var data = binaryInputStream.readBytes(count);
this.receivedData.push(data);
binaryOutputStream.writeBytes(data, count);
this.originalListener.onDataAvailable(request, context,storageStream.newInputStream(0), offset, count);
},
onStartRequest: function(request, context) {
this.originalListener.onStartRequest(request, context);
},
onStopRequest: function(request, context, statusCode)
{
try {
if (request.originalURI && piratequesting.baseURL == request.originalURI.prePath && request.originalURI.path.indexOf("/index.php?ajax=") == 0) {
dump("\nProcessing: " + request.originalURI.spec + "\n");
var date = request.getResponseHeader("Date");
var responseSource = this.receivedData.join();
dump("\nResponse: " + responseSource + "\n");
piratequesting.ProcessRawResponse(request.originalURI.spec, responseSource, date);
}
} catch(e) { dumpError(e);}
this.originalListener.onStopRequest(request, context, statusCode);
},
QueryInterface: function (aIID) {
if (aIID.equals(Ci.nsIStreamListener) ||
aIID.equals(Ci.nsISupports)) {
return this;
}
throw Components.results.NS_NOINTERFACE;
}
}
hRO = {
observe: function(aSubject, aTopic, aData){
try {
if (aTopic == "http-on-examine-response") {
if (aSubject.originalURI && piratequesting.baseURL == aSubject.originalURI.prePath && aSubject.originalURI.path.indexOf("/index.php?ajax=") == 0) {
var newListener = new TracingListener();
aSubject.QueryInterface(Ci.nsITraceableChannel);
newListener.originalListener = aSubject.setNewListener(newListener);
dump("\n\nObserver Processing: " + aSubject.originalURI.spec + "\n");
for (var i in aSubject) {
dump("\n\trequest." + i);
}
}
}
} catch (e) {
dumpError(e);
}
},
QueryInterface: function(aIID){
if (aIID.equals(Ci.nsIObserver) ||
aIID.equals(Ci.nsISupports)) {
return this;
}
throw Components.results.NS_NOINTERFACE;
}
};
var observerService = Cc["@mozilla.org/observer-service;1"] .getService(Ci.nsIObserverService);
observerService.addObserver(hRO, "http-on-examine-response", false);
发生了什么事处理http请求时,会正确地通知上述代码。uri也是可用的并且是正确的(它通过了域/路径检查),但是被转储的
responseSource
,据我所知,总是浏览器打开后发出的第一个http请求的内容,显然不是我所期望的
上面的代码大部分来自于。我真的希望这只是一件我忽略了的小事,但我已经在这件事上用头撞桌子好几天了,所以现在我转向so的智慧。有什么想法吗
但是得到的响应资源
据我所知,被抛弃是,
始终是第一个http的内容
浏览器打开后发出的请求
而且,很明显,我不是这样的人
期待
上面的代码有问题。“receivedData”成员在prototype对象上声明,并分配了空数组。这导致TracingListener类的每个实例化都使用内存中的同一对象作为receivedData。将代码更改为可能会解决以下问题:
function TracingListener() {
this.receivedData = [];
}
TracingListener.prototype =
{
originalListener: null,
receivedData: null, // array for incoming data.
/* skipped */
}
我不确定这是否能解决你原来的问题。+1天哪,你是对的。几个月前我也遇到过同样的问题,我想我只是忘记了。诀窍是在onStartRequest中分配数组。在构造函数中分配数组也可以(当然),在onStartRequest中分配数组只是确保分配不会过早发生