Javascript 使用Firefox本机消息进行异步webRequest.onBeforeRequest URL检查
我正在尝试使用Firefox本机消息创建URL检查器。问题是,当本机应用程序发送裁决时,onBeforeRequest侦听器已经释放了请求,因此不会发生重定向。 如果回答为“0”,请您帮助我的分机等待回复长达2秒,并重定向请求,好吗Javascript 使用Firefox本机消息进行异步webRequest.onBeforeRequest URL检查,javascript,firefox-addon-webextensions,chrome-native-messaging,Javascript,Firefox Addon Webextensions,Chrome Native Messaging,我正在尝试使用Firefox本机消息创建URL检查器。问题是,当本机应用程序发送裁决时,onBeforeRequest侦听器已经释放了请求,因此不会发生重定向。 如果回答为“0”,请您帮助我的分机等待回复长达2秒,并重定向请求,好吗 var-port=browser.runtime.connectNative(“乒乓球”); 函数检查URL(请求详细信息){ 控制台日志(“加载:”); port.postMessage(requestDetails.url); 控制台日志(“过帐完成”); }
var-port=browser.runtime.connectNative(“乒乓球”);
函数检查URL(请求详细信息){
控制台日志(“加载:”);
port.postMessage(requestDetails.url);
控制台日志(“过帐完成”);
}
port.onMessage.addListener((响应)=>{
控制台日志(“已接收:”;
如果(响应=“1”)
{
log(“好的url!!!”);
}
其他的
{
log(“错误的url-重定向!!!”;
返回{
重定向URL:“https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif"
};
}
});
browser.webRequest.onBeforeRequest.addListener(
检查URL,
{URL:[“”]},
[“封锁”]
);
根本没有办法。从Firefox 52开始,这是可能的,请参阅。这在Chrome上仍然是不可能的
本机消息传递是一种异步API。发布消息后,只有返回事件循环(例如,当前代码终止),您才会收到回复
但是,阻止WebRequestAPI需要同步回复。这是一个核心限制,因为异步应答可能永远不会出现或在不确定的延迟之后出现,并且网络堆栈不会等待这种情况发生。我的意思是,它可以,但是API的设计故意禁止它
基本上:即使回复已经准备好,您的代码也不会收到它,直到inspectURL
终止,此时WebRequest已经在执行请求。使它同步。根本没有办法。从Firefox 52开始,这是可能的,请参阅。这在Chrome上仍然是不可能的
本机消息传递是一种异步API。发布消息后,只有返回事件循环(例如,当前代码终止),您才会收到回复
但是,阻止WebRequestAPI需要同步回复。这是一个核心限制,因为异步应答可能永远不会出现或在不确定的延迟之后出现,并且网络堆栈不会等待这种情况发生。我的意思是,它可以,但是API的设计故意禁止它
基本上:即使回复已经准备好,您的代码也不会收到它,直到inspectURL
终止,此时WebRequest已经在执行请求。使其同步。Firefox
Firefox支持从Firefox 52开始的异步webRequest
阻止/修改侦听器。为此(MDN:(和多个其他页面)):
从Firefox 52开始,监听器不必返回BlockingResponse
,而可以返回一个由BlockingResponse
解析的。这使侦听器能够异步处理请求
因此,在您的wrbRequest.onBeforeRequest
侦听器中,您将返回一个承诺,并使用BlockingResponse
解决该承诺
您需要存储从端口请求信息的请求列表。来自端口的响应
需要唯一标识其响应的请求。请记住,这都是异步的,因此您可以同时处理多个请求。您必须适当地跟踪这些承诺,并且只解决相应的承诺。假设来自端口的响应不会快速更改,您应该存储已检查的URL列表(好的和坏的),以便可以立即响应已检查的URL
铬
你想要的东西在Chrome中是不可能的。您需要以其他方式解决问题。Firefox
Firefox支持从Firefox 52开始的异步webRequest
阻止/修改侦听器。为此(MDN:(和多个其他页面)):
从Firefox 52开始,监听器不必返回BlockingResponse
,而可以返回一个由BlockingResponse
解析的。这使侦听器能够异步处理请求
因此,在您的wrbRequest.onBeforeRequest
侦听器中,您将返回一个承诺,并使用BlockingResponse
解决该承诺
您需要存储从端口请求信息的请求列表。来自端口的响应
需要唯一标识其响应的请求。请记住,这都是异步的,因此您可以同时处理多个请求。您必须适当地跟踪这些承诺,并且只解决相应的承诺。假设来自端口的响应不会快速更改,您应该存储已检查的URL列表(好的和坏的),以便可以立即响应已检查的URL
铬
你想要的东西在Chrome中是不可能的。您需要以其他方式解决您的问题
var port = browser.runtime.connectNative("ping_pong");
function inspectURL(requestDetails) {
console.log("Loading: <" + requestDetails.url + ">");
port.postMessage(requestDetails.url);
console.log("Posting complete <" + requestDetails.url + ">");
}
port.onMessage.addListener((response) = > {
console.log("Received: <" + response + ">");
if (response == "1")
{
console.log("Good url!!!");
}
else
{
console.log("BAD url - redirecting!!!");
return {
redirectUrl: "https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif"
};
}
});
browser.webRequest.onBeforeRequest.addListener(
inspectURL,
{ urls: ["<all_urls>"] },
["blocking"]
);