chrome.webRequest.onBeforeRequest.addListener不会阻止网址数组

时间:2019-04-24 14:43:19

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

我正在尝试根据用户输入阻止一组网址。我具有JSON格式的url数组,但是当我导航到这些站点时,这些站点实际上并未被阻止。如果我只使用一个站点而不是一个阵列,则它确实会被成功阻止。这是函数。

function addListener(){
    chrome.webRequest.onBeforeRequest.addListener(
      function(){ return {cancel: true}; },
      {
        urls: blockedUrls()
      },
      ["blocking"]
    );
}

这是我的功能blockedUrls。

var blockedUrls = function () {
        chrome.storage.sync.get(['block'], function(result) {
            if (typeof result.block === 'undefined') {
                //blocks is not yet set
                var jobj = ["*://www.whatever.com/*"];
                return [jobj[0]];
                console.log("not set");
            }
            else{
                var xt = JSON.parse(result.block);
                console.log(JSON.stringify(xt.urls));
                return JSON.stringify(xt.urls);
            } 
        });
        return ["*://www.whatever.com/*"];
}

console.log确实打印出我想要的内容,这就是(显然有些只是用于测试)

["doesntexist.com","*://www.yahoo.com/*","*://www.xbox.com/*","*://www.hello.com/*","*://www.es/*"]

如果有帮助,这里是从变量request.newSites初始将站点设置到chrome存储的地方。

var jsonStr = '{"urls":["doesntexist.com"]}';

                var obj = JSON.parse(jsonStr);

                //add url matching patterns to the urls from user input
                for (var i = 0; i < request.newSite.length; i++){
                    obj['urls'].push( '*://www.' + request.newSite[i] + '/*');
                }

                jsonStr = JSON.stringify(obj);


                chrome.storage.sync.set({'block': jsonStr}, function(){
                    addListener();
                });

谢谢。

2 个答案:

答案 0 :(得分:1)

chrome.storage.sync.get是一个异步函数。因此,它不会返回您的网址列表。

您可能打算做的是以下事情:

function addListener(){
    chrome.storage.sync.get(['block'], function(result) {
        let urls;
        if (typeof result.block === 'undefined') {
            //blocks is not yet set
            var jobj = ["*://www.whatever.com/*"];
            urls = [jobj[0]];
            console.log("not set");
        }
        else{
            var xt = JSON.parse(result.block);
            console.log(JSON.stringify(xt.urls));
            urls = JSON.stringify(xt.urls);
        } 
        chrome.webRequest.onBeforeRequest.addListener(
          function(){ return {cancel: true}; },
          {
            urls: urls
          },
          ["blocking"]
        );
    });
}

答案 1 :(得分:1)

您的代码有两个问题:

1)chrome.storage.sync.get的回调函数是异步。因此,在函数blockedUrls中,返回值将始终为["*://www.whatever.com/*"],因为行return ["*://www.whatever.com/*"];将在chrome.storage.sync.get的回调函数之前运行。

2)chrome.webRequest.onBeforeRequest侦听器的第二个参数应为以下形式的对象: {urls: theUrls},其中theUrls是字符串的数组,而不是字符串。

除此之外,您还可以利用chrome.storage可以直接存储对象和数组这一事实,因此不需要对其进行字符串化。

尝试:

var obj = {urls: ['*://doesntexist.com/*']};

for (var i = 0, j = request.newSite.length; i < j; i++){
    obj.urls.push( '*://www.' + request.newSite[i] + '/*');
}

chrome.storage.sync.set({block: obj}, function(){
    addListener();
});

function addListener() {
    chrome.storage.sync.get('block', function (result) {
        var myUrls = result.block || ["*://www.whatever.com/*"];
        chrome.webRequest.onBeforeRequest.addListener(function(){
            return {cancel: true}
        },
        {urls: myUrls},
        ["blocking"] );
    });
}