Chrome扩展程序通过tabId进行WebRequest过滤不起作用?

时间:2014-07-02 18:27:26

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

我正在重构现有的Chrome扩展程序,我打电话给chrome.webRequest.onBeforeSendHeaders,应根据当前选择的标签进行过滤。

我正在使用文档here,并且就过滤而言:

  

webRequest.RequestFilter过滤器允许限制请求   哪些事件以各种方式触发:

     

网址网址格式,例如*://www.google.com/foo*bar。类型请求   类型,例如main_frame(为顶级加载的文档)   frame),sub_frame(为嵌入式框架加载的文档),   和图像(网站上的图像)。请参阅webRequest.RequestFilter。标签   ID一个选项卡的标识符。窗口ID窗口的标识符。

据此,我理解如果我将tabid定义为侦听器的一部分,我应该根据选项卡ID筛选所有请求(因此,只捕获来自该特定选项卡的请求标头)。 / p>

问题是这不会发生。当我采用tabid:xx过滤器时,我会继续捕获来自我打开的各个标签的所有请求。

我错过了什么?

以下是后台脚本 background.html

中的示例代码
var currentTabId = -1;

chrome.tabs.getSelected(null, function(tab){ 
    currentTabId = tab.id;
    console.log("tab id in getselected "+currentTabId);

});

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(req){

        console.log("-> Request Headers received for "+req.url);

        console.log('onBeforeSendHeaders tab id: '+currentTabId)
        console.log('onBeforeSendHeaders: '+JSON.stringify(req))
    }

, { urls:["http://*/*", "https://*/*"], tabId: currentTabId }, ['requestHeaders','blocking']);

currentTabId是例如1666,而对象req中的tabId是另一个,可能来自我打开的任何一个标签,我正在使用它(它在1666年没有过滤掉)。

1 个答案:

答案 0 :(得分:3)

您的示例代码执行顺序错误; chrome.tabs.getSelected是异步的。

var currentTabId = -1;
chrome.tabs.getSelected(null, function(tab){
    currentTabId = tab.id;
    // Here, currentTabId is defined properly
    console.log("tab id in getselected "+currentTabId);
});
// Here, it is still -1

您需要将addListener来电转移到getSelected回调:

chrome.tabs.getSelected(null, function(tab){ 
    currentTabId = tab.id;
    console.log("tab id in getselected "+currentTabId);
    chrome.webRequest.onBeforeSendHeaders.addListener(/*...*/);
});