如何在Chrome加载项中获取启动连接的URL

时间:2016-09-16 14:01:34

标签: javascript google-chrome google-chrome-extension

我在Chrome中开发了一个必须有选择地阻止通信的插件。例如,当我在cnn.com时阻止与第三方的所有连接,或者当我不在Facebook时阻止Facebook的cookie(以避免Facebook跟踪)。

我可以使用以下方法拦截流量:

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)。

然而,该解决方案存在一个很大的问题:chrome.tabs.onUpdated在第一次连接完成后被触发,导致:{/ p>

  • 当用户有意进入新页面(点击链接或在地址栏中输入新网址)时,url_main仍然是之前网站的网址。因此,在cnn.com中阻止第三方的示例中,我会阻止任何尝试转到其他页面。

  • 对于源自新URL的第一个请求,加载项仍然认为用户位于上一页中。这将导致程序应用错误的策略。在Facebook的例子中,它将在Facebook的第一个连接中阻止Facebook的cookie,因此,Facebook会将用户重定向到登录页面。

  • 如果在iframe(或类似)内部启动连接,它也将无法应用规则。因为我可以获取主页面的URL,但不能获取iframe的URL。 (但是,这个问题并不重要)。

我不知道是否有办法知道,例如,地址栏中写入的文字,或者当用户关注链接或输入新网址时(以同步方式)监控在地址栏中。

1 个答案:

答案 0 :(得分:0)

根据wOxxOm的评论,用户1753235将以下内容编辑为问题:

如wOxxOm所示,如果用户故意访问该页面,则第一个请求将标记为“main_frame”。因此,添加以下代码解决了异步hastable的问题:

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