3

chrome.storage.local に保存されているデータに基づいて、Google Chrome 拡張機能で特定の Web リクエストをブロックしようとしています。ただし、「{cancel: true };」を返す方法が見つかりません。onBeforeRequest.addListener のコールバック関数内。または、chrome.Storage.local.get() の非同期的な方法により、それぞれのコールバック関数の外で storage.local からデータにアクセスする。

ここに私の関連コードがあります。

chrome.webRequest.onBeforeRequest.addListener( function(info) {

    chrome.storage.local.get({requests: []}, function (result) {

        // depending on the value of result.requests.[0].item I want to return "{cancel:  true };" in order to block the webrequest
        if(result.requests.[0].item == 0) return {cancel: true}; // however this is obviously in the wrong place

    });

    // if I put return {cancel: true} here, where it should be, I can't access the data of storage.local.get anymore
    // if(result.requests.[0].item == 0) return {cancel: true};

});

この問題の解決策はありますか? ご協力いただきありがとうございます。

4

1 に答える 1

3

コールバックを交換するだけです:

chrome.storage.local.get({requests: []}, function (cache) {
    chrome.webRequest.onBeforeRequest.addListener(function (request) {
        if(cache.requests[0].item === 0)
            return { cancel: true };
    });
});

これは、リクエストごとにストレージをリクエストするのではなく、ストレージがメモリに格納された後にのみリクエストをリッスンするため、理にかなっています。


この方法の唯一の欠点は、リッスンを開始した後にストレージを更新すると、有効にならないことです。

これを解決するには、リスナーを削除して再度追加します。

var currentCallback;

function startListening() {
    chrome.storage.local.get({requests: []}, function (cache) {
        chrome.webRequest.onBeforeRequest.addListener(function (request) {
            currentCallback = this;

            if(cache.requests[0].item === 0)
                return { cancel: true };
        });
    });
}

function update() {
    if (typeof currentCallback === "function") {
        chrome.webRequest.onBeforeRequest.removeListener(currentCallback);
        currentCallback = null;
    }

    startListening();
}
于 2013-09-02T18:31:57.647 に答える