Jak zidentyfikować, kto zainicjował żądanie http w przeglądarce Firefox?

105

Pracuję nad nowym dodatkiem do Firefoksa, który przechwytuje cały ruch sieciowy Firefoksa (żądania http (s) z http-on-modify-request)

Dzięki mojemu obecnemu kodowi jestem w stanie oddzielić żądania przychodzące ze stron internetowych / kart i wszystkich innych komponentów (aktualizacje kanałów RSS, żądania XHR z komponentów XPCOM, rozszerzenia, menedżer rozszerzeń itp.)

Chciałbym precyzyjnie określić, kto inicjuje żądanie inne niż ruch na karcie, a nie tylko cała grupa? (RSS, komponenty XPCOM, rozszerzenia, menedżer rozszerzeń itp.)

Przykład: hipotetyczna zmienna niestandardowa requestRequestormiałaby wartość identyfikującą określony dodatek lub aktualizację RSS itp.

Znalazłem podobne pytanie, ale bez rozwiązania.

Aktualny kod identyfikujący całą grupę ( pobieranie przeglądarki, która uruchamia powiadomienie http-on-modyfikacja-żądanie ) to:

Components.utils.import('resource://gre/modules/Services.jsm');
Services.obs.addObserver(httpObs, 'http-on-modify-request', false);
//Services.obs.removeObserver(httpObs, 'http-on-modify-request'); //uncomment this line, or run this line when you want to remove the observer

var httpObs = {
    observe: function (aSubject, aTopic, aData) {
        if (aTopic == 'http-on-modify-request') {
            /*start - do not edit here*/
            var oHttp = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); //i used nsIHttpChannel but i guess you can use nsIChannel, im not sure why though
            var interfaceRequestor = oHttp.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
            //var DOMWindow = interfaceRequestor.getInterface(Components.interfaces.nsIDOMWindow); //not to be done anymore because: https://developer.mozilla.org/en-US/docs/Updating_extensions_for_Firefox_3.5#Getting_a_load_context_from_a_request //instead do the loadContext stuff below
            var loadContext;
            try {
                loadContext = interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);
            } catch (ex) {
                try {
                    loadContext = aSubject.loadGroup.notificationCallbacks.getInterface(Components.interfaces.nsILoadContext);
                    //in ff26 aSubject.loadGroup.notificationCallbacks was null for me, i couldnt find a situation where it wasnt null, but whenever this was null, and i knew a loadContext is supposed to be there, i found that "interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);" worked fine, so im thinking in ff26 it doesnt use aSubject.loadGroup.notificationCallbacks anymore, but im not sure
                } catch (ex2) {
                    loadContext = null;
                    //this is a problem i dont know why it would get here
                }
            }
            /*end do not edit here*/
            /*start - do all your edits below here*/
            var url = oHttp.URI.spec; //can get url without needing loadContext
            if (loadContext) {
                var contentWindow = loadContext.associatedWindow; //this is the HTML window of the page that just loaded
                //aDOMWindow this is the firefox window holding the tab
                var aDOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
                var gBrowser = aDOMWindow.gBrowser; //this is the gBrowser object of the firefox window this tab is in
                var aTab = gBrowser._getTabForContentWindow(contentWindow.top); //this is the clickable tab xul element, the one found in the tab strip of the firefox window, aTab.linkedBrowser is same as browser var above //can stylize tab like aTab.style.backgroundColor = 'blue'; //can stylize the tab like aTab.style.fontColor = 'red';
                var browser = aTab.linkedBrowser; //this is the browser within the tab //this is what the example in the previous section gives
                //end getting other useful stuff
            } else {
                Components.utils.reportError('EXCEPTION: Load Context Not Found!!');
                //this is likely no big deal as the channel proably has no associated window, ie: the channel was loading some resource. but if its an ajax call you may end up here
            }
        }
    }
};
intika
źródło
9
Wow fantastyczna robota, czy widziałeś ten temat: stackoverflow.com/questions/27483651/… To bardziej temat, w którym możesz być w stanie wnieść swój wkład. Jestem bardzo zainteresowany, aby zobaczyć, jak dotychczas identyfikujesz źródła.
Noitidart
2
Dzięki bracie za link, im więcej informacji mam na temat żądań Firefoksa itp. Tym bardziej mój dodatek będzie lepszy, praca nad zaawansowanym dodatkiem bezpieczeństwa, choć nie jest to łatwe (to tylko hobby, dodatek będzie publiczny;) pozwolę ci wiedzieć na github)
intika
1
Tutaj jest również loadContextAndGoodiesfunkcja, którą napisałem, która może wymagać pewnych ulepszeń. Napisałem ją jakiś czas temu, ale proszę, ulepsz, jeśli to możliwe. gist.github.com/Noitidart/ ... wydaje się, że używasz starszej wersji tego fragmentu w powyższym kodzie, więc użycie tego fragmentu spowoduje wyczyszczenie powyższego kodu, a fragment prawdopodobnie zawiera pewne ulepszenia (nie wiem, że nie porównałem : P)
Noitidart
2
tak, widziałem twój kod w drugim pytaniu, po prostu dodałem go i przetestowałem;) w razie potrzeby
wyśle
2
dzięki za PR Zrobiłem pr na pr :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

Odpowiedzi:

1

Od czerwca 2020 r. Nie ma oficjalnej metody / sposobu filtrowania / identyfikacji żądań http.

Obecnie jedyną możliwością jest to, co jest zrobione w kodzie pytania, który oddziela żądania od stron internetowych / zakładek i innych komponentów Firefoksa (aktualizacje kanałów, żądania rozszerzeń, żądania XHR od komponentów XPCOM itp.).

Jak wspomniano w komentarzach, jest to wewnętrzne ograniczenie przeglądarki Firefox. Obecny podstawowy kod Firefoksa nie implementuje śledzenia żądającego, a zatem nie wie, kto zainicjował żądanie i dlaczego. Warto wiedzieć, że narzędzia deweloperskie Chrome otrzymały ostatnio tę funkcję .

intika
źródło