Дополнение Firefox - мониторинг сети

Если я добавлю наблюдателя nsIHttpChannel, могу ли я узнать, что инициировало HTTP-запрос (скрипт, iframe, изображение и т. д.)

В chrome при мониторинге сети с фоновой страницы у вас есть тип запроса, сообщающий вам, пришел ли он из iframe, скрипта и т. д.


person user1372314    schedule 15.12.2014    source источник


Ответы (1)


Пока не принимайте это как решение. Я надеюсь, что некоторые другие люди могут прийти и помочь построить это решение.

Я знаю, что это наверняка верно:

Это я думаю правильно, под этим я подразумеваю, что это работает в моих тестовых примерах, но я не уверен, что это рекомендуемый способ:

  • ТЕСТ ДЛЯ: Кадр или полная загрузка страницы - firefox-addon/22678462#22678462">Можем ли мы различать фреймовые и нефреймовые загрузки с помощью Ci в аддоне Firefox

Я не знаю, как это сделать, поэтому мне нужна помощь сообщества в этом:


Выполняется решение:

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

Чтобы начать наблюдать

Чтобы начать наблюдать за всеми запросами, сделайте это (например, при запуске вашего аддона)

for (var o in observers) {
    observers[o].reg();
}

Чтобы перестать наблюдать

Важно прекратить наблюдение (убедитесь, что вы запускаете это хотя бы при выключении аддона, вы не хотите оставлять наблюдателя зарегистрированным по причинам памяти)

for (var o in observers) {
    observers[o].unreg();
}
person Noitidart    schedule 15.12.2014
comment
удивительный синтез, большое спасибо еще раз! ... интересные темы, которые вы связали здесь - person intika; 30.06.2015
comment
Синтез @intika - это то, на что я так надеюсь! Я действительно очень жду, когда вы поделитесь своими работами, как в этой теме, это было бы действительно для сравнения и противопоставления. :) - person Noitidart; 30.06.2015