[英]Chrome Extension webRequest.onBeforeRequest Cancel Page
我正在尝试创建一个chrome扩展程序,该扩展程序查询外部资源以作为阻止或允许通过特定页面的参考。 以下是我的代码的一部分。 我是javascript的新手,范围似乎总是让我感到困惑。
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"]
);
任何帮助将不胜感激! 谢谢。
你不能那样做。
您的代码无法按预期工作,因为XHR是异步的。 您的onreadystatechange
将在整个外部函数完成后执行。 因此,内guilt
将是不确定的,或者更糟的是(从上一个请求开始)过时。
有关更多信息,请参见以下规范问题: 在函数内部修改变量后,为什么变量未更改?
但是,如果尝试解决此问题,则会注意到您无法从异步处理程序中返回响应。
这是故意的:没有函数可以传递,然后再调用(例如Messaging API中的sendResponse
),因为Chrome 不会等待您 。 您应该以确定性和快速的方式响应阻塞呼叫。
如果可选的
opt_extraInfoSpec
数组包含字符串'blocking'
(仅允许用于特定事件),则回调函数将被同步处理。 这意味着请求将被阻塞, 直到回调函数返回为止 。
您可以尝试通过使用同步XHR调用来绕过它。 通常,这不是一个好主意,因为加载远程响应会花费很长时间,并且同步XHR被认为已弃用。 即使将查询限制为"main_frame"
请求,这仍然"main_frame"
每个负载带来不确定的延迟。
正确的方法是从服务器加载一组规则并定期更新它,并在发生请求时对照此本地规则副本对其进行验证。 这是AdBlock等方法的扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.