2015-04-01 122 views
0

我正在尝试创建一个查询外部源的chrome扩展,作为阻止或允许通过特定页面的引用。以下是我的代码的一部分。我是JavaScript新手,范围似乎总是让我兴奋不已。Chrome扩展webRequest.onBeforeRequest取消页面

chrome.webRequest.onBeforeRequest.addListener(
    function(details) { 

     var http = new XMLHttpRequest(); 
     var url = "http://xxx.xx.xxxx"; 
     var params = "urlCheck="+encodeString_(details.url); 
     http.open("POST", url, true); 
     //Send the proper header information along with the request 
     http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 

     http.onreadystatechange = function() { 
      if(http.readyState == 4 && http.status == 200) { 
       guilt = 0; 
       console.log(guilt); 
      }else if(http.readyState == 4 && http.status == 404){ 
       guilt = 1; 
       console.log(guilt); 
      } 
     } 
     http.send(params); 

    if(guilt == 1){ 
     return {cancel: true}; 
     }else{ 
     return {cancel: false}; 
     } 

    }, 
    {urls: ["<all_urls>"], 
    types:["main_frame"] 
    }, 
    ["blocking"] 
    ); 

任何帮助将不胜感激!谢谢。

+0

那么你真正的问题是什么?什么不工作或者你是否收到错误信息,如果是这样,告诉我们它是什么 – RiggsFolly 2015-04-01 15:06:42

回答

1

你不能那样做。

您的代码无法按预期工作,因为XHR是异步的;整个外部函数完成后执行您的onreadystatechange。所以guilt将是未定义的,或者更糟糕的是(从最后的请求)陈旧。

欲了解更多信息,请参阅本规范的问题:Why is my variable unaltered after I modify it inside of a function?

但是,如果你试图解决这个问题,你会发现,你不能返回从异步处理程序中的响应。

这是故意的:没有功能可以通过,然后稍后调用(如消息API中的sendResponse),因为Chrome 不会等你。您需要以确定性和快速的方式响应阻塞呼叫。

如果可选opt_extraInfoSpec阵列包含字符串'blocking'(只允许为特定事件),回调函数是同步处理。这意味着请求被阻止,直到回调函数返回

可能尝试通过使用同步XHR调用绕过它。这通常不是一个好主意,因为加载远程响应需要很长时间,并且同步XHR被认为已被弃用。尽管您将查询限制为"main_frame"请求,但这仍会给每个负载添加不确定的延迟。

正确的做法是从服务器加载一组规则并定期进行更新,并在请求发生时根据此规则的本地副本进行验证。这是AdBlock使用的扩展方法。