Я работаю над расширением 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
};
}
Как мне его изменить?