javascript firefox扩展browser.webRequest.onBeforeRequest在获得异步响应后未重定向

14ifxucb  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(157)

下面是我代码,它调用一个函数,使用browser.webRequest.onBeforeRequest重定向页面

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

和重定向功能:

function redirect(requestDetails){
 let redirection_url = "https://google.com/";
 let type = requestDetails.type;
 let url = requestDetails.url;
 var checkurl = ""
 var final_url = '';

if(url.includes("http://")){
   checkurl = url.split('http://')[1]
   final_url = 'https://'+checkurl;
}else if(url.includes("https://")){
  final_url = url;
}else{
  final_url = 'https://'+url;
}

var xhttp = new XMLHttpRequest();
xhttp.open("GET", final_url, true);
xhttp.send();
return xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {
       return {
                cancel:true,
              };
    }else if(this.status == 0 && this.readyState == 4){
      return {
              redirectUrl: redirection_url,
            };
    }
};
}

我返回redirectUrl或cancel取决于URL是否在https上工作。如果网站上没有https,那么我想重定向到google.com,响应和代码都很好,但是响应中有一些延迟,所以侦听器在获得响应后不会重定向。
侦听器处于阻塞状态,但仍然无法工作,我在上找到了此答案
stackoverflow
我正在返回readystatechange,但它仍然不工作,真的很感谢你的帮助。谢谢

vbkedwbf

vbkedwbf1#

答案很简单,我们必须返回一个promise,所以我们有一个阻塞行为,直到我们从promise得到一个值。

function redirect(requestDetails){

return new Promise((resolve, reject) => {
let redirection_url = "https://google.com/";
let type = requestDetails.type;
let url = requestDetails.url;
var checkurl = ""
var final_url = '';

if(url.includes("http://")){
   checkurl = url.split('http://')[1]
   final_url = 'https://'+checkurl;
}else if(url.includes("https://")){
  final_url = url;
}else{
  final_url = 'https://'+url;
}

var xhttp = new XMLHttpRequest();
xhttp.open("GET", final_url, true);
xhttp.send();

var abc = setInterval(() => {
  console.log(xhttp, xhttp.status)
  if(xhttp.readyState == 4){

    if (xhttp.status == 200) {
      reject({  cancel: true });
    } else if(xhttp.status == 0 && xhttp.readyState == 4) {
      resolve({
        redirectUrl: redirection_url,
      });
    }
    clearInterval(abc)
  }
    
  
}, 1000);
});
}

相关问题