chrome.webRequest.onBeforeRequest.addListener не блокирует массив URL - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь заблокировать массив URL-адресов на основе пользовательского ввода.У меня есть массив URL в формате JSON, но сайты не блокируются, когда я к ним перехожу.Если я использую только один сайт вместо массива, он будет успешно заблокирован.Вот эта функция.

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

А вот и моя функция blockUrls.

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/*"]

И, если это поможет, вот где сайты изначально устанавливаются в хранилище chrome из переменной request.newSites.

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 ]

1 голос
/ 25 апреля 2019

Есть несколько проблем с вашим кодом:

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"] );
    });
}
1 голос
/ 24 апреля 2019

chrome.storage.sync.get - асинхронная функция.Поэтому он не вернет ваш список URL.

То, что вы, вероятно, хотели сделать, было следующим:

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"]
        );
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...