2016-09-16 42 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; 
} 
相关问题