2013-02-12 191 views
0

我正在研究一個簡單的Firefox擴展,它跟蹤所請求的URL並在後臺調用Web服務,該服務檢測URL是否可疑並基於返回的結果通過該服務,分機決定停止頁面加載並提醒用戶關於僞造或其他任何情況,並且如果用戶仍然希望轉到該頁面,則他可以將其重定向到他所請求的原始頁面Firefox擴展:當發現可疑網址時停止頁面加載

I已添加http修改請求觀察者

var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); 
observerService.addObserver(requestObserverListener.observe, "http-on-modify-request", false); 

和觀察者

var requestObserverListener = {observe: function (subject, topic, data) { 

    //alert("Inside observe"); 
    if (topic == "http-on-modify-request") { 
    subject.QueryInterface(Components.interfaces.nsIHttpChannel); 
    var url = subject.URI.spec; //url being requested. you might want this for something else 
    //alert("inside modify request"); 

    var urlbarvalue = document.getElementById("urlbar").value; 
    urlbarvalue = processUrl(urlbarvalue, url); 
    //alert("url bar: "+urlbarvalue); 
    //alert("url: "+url); 
    document.getElementById("urlbar").style.backgroundColor = "white"; 
    if(urlbarvalue == url && url != "") 
    { 
     var browser = getWindowForRequest(subject); 
     if (browser != null) { 
      //alert(""+browser.contentDocument.body.innerHTML); 
      alert("inside browser: "+url); 
      getXmlHttpRequest(url); 
     } 
    } 
    } 

}, 
} 

所以當URLbar並且請求的URL的URL匹配REST服務將通過AJAX getXmlHttpRequest(URL)被調用;方法

現在

當我運行該擴展調用,以服務,但該服務之前返回頁面被加載任何迴應,因爲用戶可能會在此期間進入他的證件,得到妥協這是不恰當的

我想先在瀏覽器選項卡上向用戶顯示一條警告消息,如果他仍然想訪問該頁面,則可以將其重定向到該頁面上的鏈接。單擊警告消息窗口中的內容

回答

3

我還沒有試過此代碼所以我不確定suspendresume將工作正常,但這是我會嘗試。您正在使用nsIRequest對象作爲您的subject,因此您可以撥打subject.suspend()。從那裏使用回調到你的XHR呼叫cancel()resume() nsIRequest。

下面是相關的(未經測試的)代碼片段。我XHR假定某種承諾.the()回報,但希望你明白的意圖:

if(urlbarvalue == url && url != "") 
    { 
     var browser = getWindowForRequest(subject); 
     if (browser != null) { 
     // suspend the pending request 
     subject.suspend(); 
     getXmlHttpRequest(url).then(
            function success() { subject.resume(); }, 
            function failure() { subject.cancel(Components.results.NS_BINDING_ABORTED); }); 
     } 
    } 

只是,你其實並不想實現這樣一個附加的一些公平的警告。

對每個HTTP請求進行遠程調用都會非常緩慢。安全瀏覽模塊只需一次呼叫即可下載被認爲是「不安全」的網站數據庫,然後可以根據HTTP請求頁面快速檢查數據庫,從而無需每次都進行單獨呼叫。

下面是對這種攔截值得一讀的一些更多的信息:https://developer.mozilla.org/en-US/docs/XUL/School_tutorial/Intercepting_Page_Loads#HTTP_Observers

而且我擔心你的XHR請求,實際上將循環,因爲XHR調用創建一個http-on-modify-request事件,使你的代碼實際上可能會檢查你的XHR請求在能夠檢查當前URL之前是有效的。您可能需要爲您的網址檢查域進行安全檢查。

而這裏的到你,可能是有用的另一個計算器類似的問題:How to block HTTP request on a particular tab?

祝你好運!

+0

subject.suspend()和subject.resume()按預期工作,但subject.cancel(Components.results。NS_BINDING_SUCCEEDED)沒有取消請求,而是請求仍然處於掛起狀態 – 2013-02-25 08:46:50

+1

哦,這可能是代碼中的複製/粘貼錯誤。我相信你想要的是:subject.cancel(Components.results.NS_BINDING_ABORTED); – 2013-03-12 19:40:54