繁体   English   中英

Chrome扩展程序webRequest.onBeforeRequest取消页面

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM