Firefox插件 - 监控网络 [英] Firefox addon - monitoring network

查看:289
本文介绍了Firefox插件 - 监控网络的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我添加一个nsIHttpChannel观察者,有没有什么办法可以知道是什么启动了HTTP请求(脚本,iframe,图像等)。

从后台页面监控网络,你有请求类型,告诉你它是否来自iframe,脚本等...

解决方案

不要接受这个解决方案。我希望其他人可以来帮助构建这个解决方案。



我知道这确实是 正确:





我认为是正确的,通过这个我的意思是窝rks在我的测试用例中,但我不知道是否推荐的方式:



这个我不知道该怎么做我需要社区的帮助:

$ ul

  • TEST FOR image - 上的评论 识别XHR(AJAX)响应,同时听在Firefox插件http响应



    • 图像检测可以通过MIME类型完成。 Check channel.contentType







  • 解决方案正在进行:

    $ 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):n​​ull;
    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();
    }


    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:


    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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆