Расширение Firefox: используйте обещание в browser.webRequest.onBeforeRequest.addListener - PullRequest
0 голосов
/ 18 декабря 2018

Я работаю над расширением Firefox и использую browser.webRequest.onBeforeRequest.addListener.

Мне нужно перенаправить или освободить webRequest, пока не получу информацию от вызовов, выполненных в обработчике.

Раньше я использовал синхронный AJAX, но страница была заблокирована слишком долго, когда сеть была плохой.Если время запроса превышает 5 секунд, я хочу отменить запрос ajax.Но кажется невозможным установить тайм-аут для синхронного вызова.

В эти дни я пытаюсь использовать асинхронный ajax и использовать методы (возвращать новое обещание), предоставленные в https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onBeforeRequest. Я пробовал несколько дней, но не смог.

Мои коды:

var LOOKUP_URL = "https://a.b.c.com/";
var urlLookup = new UrlLookup(LOOKUP_URL);
var blockList = [];

browser.webRequest.onBeforeRequest.addListener(redirectAsync, {urls: ['<all_urls>']},, ["blocking"]);

function redirectAsync(details) {
    var url = details.url;
    return new Promise(function(resolve,reject){

        var urlLookupResult = urlLookup.check(url, LookupComplete);

        if(urlLookupResult.result){
            var redirectUrl = urlLookupResult.url;
            resolve({redirectUrl})
        }
    })
}

function LookupComplete(url, data, error){
    if(data.result){
        blockList.push(url);
        localStorage.setItem("blockList",JSON.stringify(blockList));

        return {
                result: true,
                url: "https://aaa.bbb.com/alerts.php?url=" + url;
            }
    }else {
        return null
    }
}

коды в urlLookup.js:

function UrlLookup(domain) {

    function check(url, callback) {
        var data;
        var http_request = new XMLHttpRequest();
        var timeId = window.setTimeout(function(){
            http_request.abort();
        },5000)
        http_request.open("GET", domain + 'url='+url);
        try {
            http_request.send();
            http_request.onreadystatechange = function(){
                if(http_request.readyState == 4 && http_request.status == 200){
                    window.clearTimeout(timeId);
                    data = JSON.parse(http_request.response);
                    return callback(url, data);
                }
            }
        } catch (e){
            return callback(url, null, "Error");
        }
    };

    return {
        check: check
    };
}

Как мне его изменить?

...