在我的Chrome扩展程序中,我检查了特定域下的每个Web请求。如果该URL符合特定条件,并且,并且存在一个与另一个URL匹配的现有打开标签,则我想返回{cancel: true}
,这意味着该请求已被阻止。
所以我的代码以这种方式工作:如果请求的URL符合我的条件,请检查所有打开的选项卡。如果其中一个打开的选项卡符合我的(第二个)条件,我想从我的初始(外部)功能返回{cancel: true}
。
问题:在检查所有选项卡(=在执行所有return
循环之前)之前,外部函数的forEach
会触发,因此它总是返回{cancel: false}
。
[我知道与此相关的问题很多,其中一个主要的解决方案包括回调函数,但特别是在我的情况下,我尚未成功完成这项工作。] >
代码:
function onBeforeRequestHandler (details) {
var cancel = false;
var url = details.url;
// condition 1
if (url.indexOf("condition_1") > -1){
// check all open windows/tabs
chrome.windows.getAll({populate:true}, function(windows){
windows.forEach(function(single_window){
single_window.tabs.forEach(function(tab){
// condition 2
if (tab.url.indexOf("condition_2") > -1){
cancel = true;
// this is less important - updating the tab works
chrome.tabs.update(tab.id, {url: url});
}
});
});
});
// always getting cancel = false here because it fires too quickly
return {cancel: cancel};
}
else
return {cancel: false};
}
chrome.webRequest.onBeforeRequest.addListener(onBeforeRequestHandler, {urls: ["some_domain"]}, ["blocking"]);
答案 0 :(得分:1)
当前,您无法基于Google Chrome中的异步功能取消请求。
在Firefox中,它已经支持Promise的异步功能,您可以像以下代码一样实现该功能。
function onBeforeRequestHandler (details) {
var cancel = false;
var url = details.url;
// condition 1
if (url.indexOf("condition_1") > -1){
// check all open windows/tabs
// return Promise which will be resolved after populate windows/tabs
return browser.windows.getAll({populate:true})
.then(function(windows) {
windows.forEach(function(single_window) {
single_window.tabs.forEach(function(tab) {
// condition 2
if (tab.url.indexOf("condition_2") > -1) {
// this is less important - updating the tab works
browser.tabs.update(tab.id, {url: url});
return { cancel: true }
}
});
});
})
}
else
return {cancel: false};
}
根据MDN中的webRequest.onBeforeRequest
。
从Firefox 52开始,侦听器可以返回一个Promise,该Promise由BlockingResponse解决,而不是返回BlockingResponse。这使侦听器能够异步处理请求。 Using AWS Lambda Functions with Amazon Connect
已经在Chrome上报告了类似Firefox的功能请求,但该票证尚未关闭。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/onBeforeRequest