2014-03-26 35 views
1

我有一個簡單的firefox插件(addon-sdk),它監聽http resposes並在響應的內容類型與一組內容類型匹配時阻止。現在,當我對收聽圖像,javascript文件和ajax(XHR)響應不感興趣時​​,觀察者會收聽所有的響應。我能以某種方式過濾或至少發現該響應屬於XHR請求,這樣我就不會浪費資源來處理響應。在firefox插件中監聽http響應時確定XHR(ajax)響應

類似的東西可以在Chrome瀏覽器擴展來實現,其中「details.type」可以main_frame,圖像,XHR等

httpResponseObserver = 
{ 
    observe: function(subject, topic, data) 
    { 

    if (topic == "http-on-examine-response") 
    { 
     var channel = subject.QueryInterface(Ci.nsIHttpChannel); 
     var contentType; 
     try { 
       contentType = channel.getResponseHeader('Content-Type'); 
       if (/\b(?:xml|rss|javascript|vnd|json|html|text|image|ocsp|x-shockwave-flash)\b/.test(contentType)) 
       { 
        return; 
       } 
      } 
     catch(error) { 
       return; 
      } 
} 
} 

回答

3

請求從nsIXMLHttpRequest接口的任何調查結果notificationCallbacks

var isXHR; 

try{ 
    var channel = subject.QueryInterface(Ci.nsIHttpChannel); 
    var callbacks = channel.notificationCallbacks; 
    var xhr = callbacks ? callbacks.getInterface(Ci.nsIXMLHttpRequest) : null; 
    isXHR = !!xhr; 
} 
catch(e){ 
    isXHR = false; 
} 
+0

棒極了!我們可以用圖像做到這一點嗎?我們可以用Ci來區分幀和非幀加載嗎?我們可以做什麼呢?我使用的標誌對我來說是一個令人困惑的解決方案。 – Noitidart

+0

我猜try try是因爲回調可能爲空?這是真的?所以如果null,那麼沒有getInterace? – Noitidart

+1

圖像檢測可以通過MIME類型完成。 'getInterface'需要try catch,如果沒有找到請求的接口,將會拋出。我不確定框架/非框架問題,他們不會返回一個不同的DOM窗口嗎? – paa

1

channel.cancel(Components.results.NS_BINDING_ABORTED);

如果你回線之前,所以把這個:)

檢測u有什麼樣的要求,即圖像AJAX的檢查標誌: 看到代碼這裏做處置按Ctrl + F看看那些標誌

爲Ajax/XHR一些測試,我以前做了一段時間,這是標誌的組合,以確定它:

LOAD_REQUESTMASK | 
LOAD_BACKGROUND | 
INHIBIT_PIPELINE | 
LOAD_EXPLICIT_CREDENTIALS | 
DISPOSITION_ATTACHMENT 
//so tested on w3schools, if flags come out to be this above, then it is an ajax request, can have INHIBIT_CACHING flag 

PLZ分享你所擁有的IM即時通訊有興趣學習過

+0

它只是代碼的一部分,我已經做了,我只是想確定XHR響應 –

+0

啊我看你這個篩選出基於標誌。我不知道阿賈克斯,但你必須找到一些組合,當你做,請讓我知道我感興趣。您可以使用標誌輕鬆檢測圖像等。以上編輯解決方案 – Noitidart