2016-09-16 41 views
-1

我正在Chrome中開發一個插件,該插件必須有選擇地阻止通信。例如,當我在cnn.com時阻止與第三方的所有連接,或在我不在Facebook時阻止Facebook的cookie(以避免Facebook跟蹤)。如何獲取在Chrome插件中啓動連接的URL

我可以在使用攔截交通:

chrome.webRequest.onBeforeRequest.addListener(
    analyzeRequests, {urls: ['<all_urls>']}, ['blocking'] 
); 

chrome.webRequest.onBeforeSendHeaders.addListener(
    analyzeHeaders, {urls: ['<all_urls>']}, ['blocking', 'requestHeaders'] 
); 

然後,analyzeRequestsanalyzeHeaders功能我獲得請求的URL裏面,但我不能讓該選項卡的啓動,因爲連接的URL tabs.get方法是異步的。爲了避免這個問題,我一直在與每一個標籤的URL一個哈希表如下所示:Get current tab and pass it to variable in a Chrome Extension

這樣我可以有請求(url_req),併發出請求(url_main)標籤的URL的URL。

然而,這種解決方案有一個很大的問題:chrome.tabs.onUpdated已經晚觸發,第一連接完成後,並導致:

  • 當用戶去故意一個新的頁面(點擊一個鏈接或在地址欄中輸入一個新的URL)對我來說url_main仍然是上一個網站的URL。因此,在阻止第三方cnn.com的示例中,我會阻止任何嘗試轉到其他頁面的操作。

  • 對於源於新URL的第一個請求,附加組件仍認爲用戶位於上一頁。它會導致程序應用錯誤的策略。在Facebook的例子中,Facebook會在第一次連接到Facebook時阻止Facebook的cookie,因此,Facebook會將用戶重定向到登錄頁面。

  • 如果連接在iframe(或類似的)內部啓動,它也將無法應用規則。因爲我可以獲取主頁的URL,但不能獲取iframe的URL。 (但是,這個問題並不重要)。

我不知道是否有知道的方法,例如,寫在地址欄中的文本,或者monitorize(以同步的方式),當用戶從一個鏈接或鍵入一個地址欄中的新網址。

+2

我不明白爲什麼'url_main仍比上web'的網址,因爲它應該用'tabUrlsHashtable [details.tabId]被抓!== details.url && details.type =='main_frame''。我希望看到更多的代碼或者整個擴展。 – wOxxOm

+1

感謝您的意見,指出了details.type ==「main_frame」。現在我將這一行添加到我的analyzeRequest函數中: if(details.type ===「main_frame」){ console.log(「Updating URL to」+ details.url); tabIdToURL [details.tabId] =詳細信息。網址; } – user1753235

+0

@ user1753235,實際答案/答案應該發佈爲答案,而不是編輯到問題中。最好稍等一下,看看發佈已解決問題的評論的用戶是否發佈了答案,如果他們在合理的時間段內沒有這樣做(實際時間不確定),那麼您應該將答案/解決方案作爲答案發布,並提及提供信息的用戶(如對您的問題進行編輯中所述)。鼓勵自我回答的問題。 – Makyen

回答

0

下被編輯成的提問user1753235由wOxxOm基於註釋的回答:

正如wOxxOm表示,如果用戶訪問的目的頁,第一個請求被標記爲「main_frame 」。因此,添加以下代碼解決異步hastable問題:

if (details.type === "main_frame"){ 
    tabIdToURL[details.tabId] = details.url; 
} 
相關問題