簡體   English   中英

chrome.webRequest.onBeforeRequest.addListener不會阻止網址數組

[英]chrome.webRequest.onBeforeRequest.addListener not blocking an array of urls

我正在嘗試根據用戶輸入阻止一組網址。 我具有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();
                });

提前致謝。

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) 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"] );
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM