Firefox addon Firefox插件-监控网络

Firefox addon Firefox插件-监控网络,firefox-addon,Firefox Addon,如果我添加一个nsIHttpChannel观察器,是否有任何方法可以知道是什么启动了HTTP请求(脚本、iframe、图像等) 在chrome中,当从后台页面监控网络时,您的请求类型会告诉您它是否来自iframe、脚本等。暂时不要接受此解决方案。我希望其他人能来帮助构建这个解决方案 我知道这肯定是正确的: 测试:XHR- 获取请求的加载上下文(如哪个选项卡、哪个html窗口、哪个xul窗口)-(虽然在下面的代码中它需要一个helper函数,但标记为可选:) 我认为这是正确的,我的意思是它在我

如果我添加一个nsIHttpChannel观察器,是否有任何方法可以知道是什么启动了HTTP请求(脚本、iframe、图像等)


在chrome中,当从后台页面监控网络时,您的请求类型会告诉您它是否来自iframe、脚本等。

暂时不要接受此解决方案。我希望其他人能来帮助构建这个解决方案

我知道这肯定是正确的:

  • 测试:XHR-
  • 获取请求的加载上下文(如哪个选项卡、哪个html窗口、哪个xul窗口)-(虽然在下面的代码中它需要一个helper函数,但标记为可选:)
我认为这是正确的,我的意思是它在我的测试用例中工作,但我不确定它是否是推荐的方式:

  • 测试:帧或整页负载-
这我不知道怎么做,所以我需要社区的帮助:

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


正在进行的解决方案:

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
}
当然要开始观察:

Services.obs.addObserver(myobserve, 'http-on-modify-request', false);
并停止:

Services.obs.removeObserver(myobserve, 'http-on-modify-request', false);
开始观察 要开始观察所有请求,请执行此操作(例如,在启动加载项时)

停止观察 停止观察非常重要(请确保至少在插件关闭时运行此操作,因为内存原因,您不想让观察者注册)


惊人的合成再次非常感谢!。。。你链接的有趣话题here@intika合成是我所希望的!我真的很期待你分享你迄今为止的工作,就像在这个主题中一样,这将是真正的比较和对比。:)
for (var o in observers) {
    observers[o].reg();
}
for (var o in observers) {
    observers[o].unreg();
}