Wie kann festgestellt werden, wer die http-Anforderung in Firefox initiiert hat?

105

Ich entwickle ein neues Firefox-Addon, das den gesamten Netzwerkverkehr von Firefox abfängt (http (s) -Anfragen mit http-on-modify-request).

Mit meinem aktuellen Code kann ich Anforderungen von Webseiten / Registerkarten und allen anderen Komponenten (RSS-Feed-Updates, XHR-Anforderungen von XPCOM-Komponenten, Erweiterungen, Erweiterungsmanager usw.) trennen.

Ich möchte identifizieren, wer eine andere Anfrage als den Datenverkehr auf der Registerkarte mit Präzision initiiert, nicht nur die gesamte Gruppe. (RSS, XPCOM-Komponenten, Erweiterungen, Erweiterungsmanager usw.)

Beispiel: Eine hypothetische benutzerdefinierte Variable requestRequestorhätte einen Wert, um ein bestimmtes Addon oder RSS-Update usw. zu identifizieren.

Ich fand diese ähnliche Frage, aber ohne Lösung.

Der aktuelle Code zur Identifizierung der gesamten Gruppe ( Abrufen des Browsers, der die Benachrichtigung über die Anforderung einer Änderung beim Ändern auslöst ) lautet:

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
quelle
9
Wow, fantastische Arbeit hier, haben Sie dieses Thema gesehen: stackoverflow.com/questions/27483651/… Es ist eher ein Thema, zu dem Sie möglicherweise beitragen können. Ich bin sehr interessiert zu sehen, wie Sie bisher Quellen identifizieren.
Noitidart
2
Vielen Dank, Bruder, für deinen Link. Je mehr Informationen ich über Firefox-Anfragen usw. habe, desto besser wird mein Addon. Ich arbeite an einem erweiterten Sicherheits-Addon, was allerdings nicht einfach ist weiß auf Github)
Intika
1
Hier ist auch eine loadContextAndGoodiesFunktion, die ich geschrieben habe und die einige Verbesserungen gebrauchen kann. Ich habe sie vor einiger Zeit geschrieben, aber bitte verbessern Sie sie, wenn möglich. gist.github.com/Noitidart/… Sie scheinen eine ältere Version dieses Snippets in Ihrem obigen Code zu verwenden. Wenn Sie also dieses Snippet verwenden, wird der obige Code bereinigt, und das Snippet weist wahrscheinlich einige Verbesserungen auf (ich weiß nicht, dass ich nicht verglichen habe : P)
Noitidart
2
Ja, ich habe Ihren Code in der anderen Frage gesehen, habe ihn gerade hinzugefügt und getestet;) wird bei Bedarf eine Pull-Anfrage stellen;)
Intika
2
danke für die PR Ich habe einen PR auf deinem PR gemacht :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

Antworten:

1

Ab Juni 2020 gibt es keine offizielle Methode / Methode zur Filterung / Identifizierung von http-Anforderungsanforderern.

Derzeit besteht die einzige Möglichkeit darin, den Code der Frage zu bearbeiten, der Anforderungen von Webseiten / Registerkarten und den anderen Firefox-Komponenten (Feed-Updates, Erweiterungsanforderungen, XHR-Anforderungen von XPCOM-Komponenten usw.) trennt.

Wie in den Kommentaren erwähnt, ist dies eine interne Einschränkung von Firefox. Der aktuelle Code von Firefox implementiert keine Anfordererverfolgung und weiß daher nicht, wer die Anforderung initiiert hat und warum. Es kann nützlich sein zu wissen, dass Chrome-Entwicklungstools kürzlich diese Funktion erhalten haben .

Intika
quelle