Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Firefox本机消息进行异步webRequest.onBeforeRequest URL检查_Javascript_Firefox Addon Webextensions_Chrome Native Messaging - Fatal编程技术网

Javascript 使用Firefox本机消息进行异步webRequest.onBeforeRequest URL检查

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); 控制台日志(“过帐完成”); }

我正在尝试使用Firefox本机消息创建URL检查器。问题是,当本机应用程序发送裁决时,onBeforeRequest侦听器已经释放了请求,因此不会发生重定向。 如果回答为“0”,请您帮助我的分机等待回复长达2秒,并重定向请求,好吗

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"]
);