Firefox插件 - 监控网络 [英] Firefox addon - monitoring network
问题描述
从后台页面监控网络,你有请求类型,告诉你它是否来自iframe,脚本等...
不要接受这个解决方案。我希望其他人可以来帮助构建这个解决方案。
我知道这确实是 正确:
- TEST FOR:XHR - 在firefox插件中监听http响应时识别XHR(ajax)响应
- 获取请求的加载上下文,该HTML窗口,XUL窗口) - Firefox插件pageMod,捕获contentScriptFile中完成的AJAX (这是标记为可选的,但在下面的代码中它需要一个辅助函数: https://gist.github.com/Noitidart/644494bdc26f996739ef )
我认为是正确的,通过这个我的意思是窝rks在我的测试用例中,但我不知道是否推荐的方式:
- TEST FOR:框架或整页加载 - 我们可以在firefox插件中用Ci区分框架和非框架载入的内容
这个我不知道该怎么做我需要社区的帮助:
$ ul
-
图像检测可以通过MIME类型完成。 Check channel.contentType
解决方案正在进行: 当然要开始观察: 并停止: 观察所有的请求(例如在你的插件启动时) 重要的是停止观察(确保至少在关闭插件时运行这个,你不想让注册的观察者因为内存原因) If I add an nsIHttpChannel observer, is there any way I can know what initiated the HTTP request(script, iframe, image etc..) In chrome when monitoring the network from the background page you have the request type telling you if it came from an iframe, script etc... Don't accept this as solution yet. I hope some other people can come and help build this solution. I know this is for sure correct: This I think is correct, by this i mean it works in my test cases but I'm not sure if its the recommended way: This I don't know how to do so I need help from community on this:
$ p $ var myobserve = function(aSubject,aTopic,aData ){
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
//开始 - 测试xhr
var isXHR;
尝试{
var callbacks = httpChannel.notificationCallbacks;
var xhr =回调? callbacks.getInterface(Ci.nsIXMLHttpRequest):null;
isXHR = !! xhr;
} catch(e){
isXHR = false;
}
//结束 - 测试如果xhr
//开始 - 测试if帧或整页加载
var isFrameLoad;
var isFullPageLoad;
if(httpChannel.loadFlags& Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI){
isFullPageLoad = true;
isFrameLoad = false;
} else if(httpChannel.loadFlags& Ci.nsIHttpChannel.LOAD_DOCUMENT_URI){
isFrameLoad = true;
isFullPageLoad = false;
}
//结束 - 测试如果帧或整页加载
//开始 - 测试如果图像
var isImg;
var isCss;
var isJs;
var isAudio;
//可以继续在这里
var mimeType = httpChannel.contentType;
if(/^image/i.test(mimeType)){
isImg = true;
}
if(/^audio/i.test(mimeType)){
isAudio = true;
if(/\/css$/i.test(mimeType)){
isCss = true;
if(/\/js$/i.test(mimeType)){
isJs = true;
}
//结束 - 测试如果图像
//开始 - 可选使用loadContext获得一堆好东西
//必须从这里粘贴函数:https://gist.github.com/Noitidart/644494bdc26f996739ef在你的代码中
var goodies = loadContextAndGoodies(aSubject,true);
/ *
// goodies是一个包含以下信息的对象:
var goodies = {
loadContext:loadContext,
DOMWindow:DOMWindow,
gBrowser:gBrowser,
contentWindow:contentWindow,
浏览器,
标签:标签
};
* /
//测试是否正在加载的资源(如图像或其他)正在进入框架[也可以用作测试帧加载或整页的方式]
var itemDestinationIsFrame;
var itemDestinationIsTopWin;
if(goodies.contentWindow){
if(goodies.contentWindow.frameElement){
itemDestinationIsFrame = true;
itemDestinationIsTopWin = false;
} else {
itemDestinationIsFrame = false;
itemDestinationIsTopWin = true;
// end - 可选的使用loadContext获得一堆好东西
$ / code>
Services.obs.addObserver(myobserve, 'http-on-modify-request',false);
Services.obs.removeObserver(myobserve,'http-on-modify-request',false);
开始观察
for(var o in observers){
观察员[O]的.reg();
停止观察
for(var o in observers){
observers [o] .unreg();
}
Image detection can be done through the MIME type. Check channel.contentType
Solution in progress:
var myobserve = function(aSubject, aTopic, aData) {
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
//start - test if xhr
var isXHR;
try {
var callbacks = httpChannel.notificationCallbacks;
var xhr = callbacks ? callbacks.getInterface(Ci.nsIXMLHttpRequest) : null;
isXHR = !!xhr;
} catch (e) {
isXHR = false;
}
//end - test if xhr
//start - test if frame OR full page load
var isFrameLoad;
var isFullPageLoad;
if (httpChannel.loadFlags & Ci.nsIHttpChannel.LOAD_INITIAL_DOCUMENT_URI) {
isFullPageLoad = true;
isFrameLoad = false;
} else if (httpChannel.loadFlags & Ci.nsIHttpChannel.LOAD_DOCUMENT_URI) {
isFrameLoad = true;
isFullPageLoad = false;
}
//end - test if frame OR full page load
//start - test if image
var isImg;
var isCss;
var isJs;
var isAudio;
//can keep going here
var mimeType = httpChannel.contentType;
if (/^image/i.test(mimeType)) {
isImg = true;
}
if (/^audio/i.test(mimeType)) {
isAudio = true;
}
if (/\/css$/i.test(mimeType)) {
isCss = true;
}
if (/\/js$/i.test(mimeType)) {
isJs = true;
}
//end - test if image
//start - OPTIONAL use loadContext to get a bunch of good stuff
//must paste the function from here: https://gist.github.com/Noitidart/644494bdc26f996739ef somewhere in your code
var goodies = loadContextAndGoodies(aSubject, true);
/*
//goodies is an object that holds the following information:
var goodies = {
loadContext: loadContext,
DOMWindow: DOMWindow,
gBrowser: gBrowser,
contentWindow: contentWindow,
browser: browser,
tab: tab
};
*/
// test if resource (such as image, or whatever) is being loaded is going into a frame [can also be used as altnerative way to test if frame load or full page]
var itemDestinationIsFrame;
var itemDestinationIsTopWin;
if (goodies.contentWindow) {
if (goodies.contentWindow.frameElement) {
itemDestinationIsFrame = true;
itemDestinationIsTopWin = false;
} else {
itemDestinationIsFrame = false;
itemDestinationIsTopWin = true;
}
}
//end - OPTIONAL use loadContext to get a bunch of good stuff
}
Of course to start observing:
Services.obs.addObserver(myobserve, 'http-on-modify-request', false);
and to stop:
Services.obs.removeObserver(myobserve, 'http-on-modify-request', false);
To start observing
To start start obseving all requests do this (for example on startup of your addon)
for (var o in observers) {
observers[o].reg();
}
To stop observing
Its important to stop observring (make sure to run this at least on shutdown of addon, you dont want to leave the observer registered for memory reasons)
for (var o in observers) {
observers[o].unreg();
}
这篇关于Firefox插件 - 监控网络的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!