我在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']
);
然后,在analyzeRequests
和analyzeHeaders
函数内部,我获取了请求的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。 (但是,这个问题并不重要)。
我不知道是否有办法知道,例如,地址栏中写入的文字,或者当用户关注链接或输入新网址时(以同步方式)监控在地址栏中。
答案 0 :(得分:0)
根据wOxxOm的评论,用户1753235将以下内容编辑为问题:
如wOxxOm所示,如果用户故意访问该页面,则第一个请求将标记为“main_frame”。因此,添加以下代码解决了异步hastable的问题:
if (details.type === "main_frame"){
tabIdToURL[details.tabId] = details.url;
}