Firefox'ta http talebini kimin başlattığı nasıl belirlenir?


105

Yeni bir Firefox addon geliştiriyorum uğratan tüm Firefox'un ağ trafiği ile (http (s) istekler http-on-modify-request)

Mevcut kodumla, web sayfalarından / sekmelerden ve diğer tüm bileşenlerden gelen istekleri (RSS beslemesi güncellemeleri, XPCOM bileşenlerinden XHR istekleri, uzantılar, uzantı yöneticisi vb.) Ayırabiliyorum.

Yalnızca tüm grubu değil, hassas bir şekilde sekmenin trafiğinden başka bir isteği kimin başlattığını belirlemek istiyorum. (RSS, XPCOM bileşenleri, uzantılar, uzantı yöneticisi vb.)

Örnek: varsayımsal bir özelleştirilebilen değişken requestRequestor, belirli bir eklentiyi veya RSS güncellemesini vb. Tanımlamak için bir değere sahip olacaktır.

Bu benzer soruyu buldum ama çözümsüz.

Tüm grubu tanımlamak için mevcut kod ( http değiştirme isteği bildirimini çalıştıran tarayıcıyı alma ):

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

9
Burada harika bir iş çıkardınız, bu konuyu gördünüz mü: stackoverflow.com/questions/27483651/… Katkıda bulunabileceğiniz bir konudan daha fazlası, şimdiye kadar kaynakları nasıl belirlediğinizi görmekle çok ilgileniyorum.
Noitidart

2
Bağlantınız için teşekkürler kardeşim, firefox istekleri vb. Hakkında ne kadar çok bilgiye sahip olursam, eklentim o kadar iyi olacak, gelişmiş bir güvenlik eklentisi üzerinde çalışmak kolay değil, (bu sadece eklentinin halka açık olacağı bir hobi;) sana izin vereceğim
github'da

1
Ayrıca burada loadContextAndGoodiesbiraz iyileştirme kullanabilecek yazdığım bir fonksiyon var, bir süre önce yazdım ama mümkünse lütfen geliştirin. gist.github.com/Noitidart/… Yukarıdaki kodunuzda bu pasajın daha eski bir sürümünü kullanıyor görünüyorsunuz, bu nedenle bu pasajı kullanmak yukarıdaki kodu temizleyecektir ve pasajda muhtemelen bazı geliştirmeler vardır (bilmiyorum : P)
Noitidart

2
evet, kodunuzu diğer soruda yeni ekledim ve test ettim;) gerekirse bir çekme isteği gönderecek;)
intika

Yanıtlar:


1

Haziran 2020 itibarıyla, http isteği istemcisinin filtrelemesini / tanımlamasını gerçekleştirmenin resmi bir yöntemi / yolu yoktur.

Şu anda tek olasılık, web sayfalarından / sekmelerden ve diğer Firefox bileşenlerinden (besleme güncellemeleri, uzantı istekleri, XPCOM bileşenlerinden XHR istekleri, vb.) Gelen istekleri ayıran soru kodunda yapılan şeydir.

Yorumlarda belirtildiği gibi, bu Firefox'un dahili bir sınırlamasıdır. Şu anki Firefox'un çekirdek kodu, bir talep eden izleme uygulamıyor ve bu nedenle, isteği kimin ve neden başlattığını bilmiyor. Chrome geliştirici araçlarının yakın zamanda bu özelliği aldığını bilmek faydalı olabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.