user1372314
user1372314

Reputation: 81

Firefox addon - monitoring network

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...

Upvotes: 6

Views: 690

Answers (1)

Noitidart
Noitidart

Reputation: 37228

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();
}

Upvotes: 7

Related Questions