2015-04-01 2 views
0

Я пытаюсь создать расширение chrome, которое запрашивает внешний источник в качестве ссылки на блокировку или разрешение через определенную страницу. Следующее является частью моего кода. Я новичок в javascript, и область видимости всегда кажется чем-то, что меня заворачивает.Chrome Extension 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

ответ

1

Вы не можете этого сделать.

Ваш код не работает должным образом, так как XHR является асинхронным; ваш onreadystatechange выполняется после завершения всей внешней функции. Таким образом, guilt будет неопределенным или, что еще хуже, устаревшим (из последнего запроса).

Для получения дополнительной информации см этого канонического вопрос: Why is my variable unaltered after I modify it inside of a function?

Однако, если вы попытаетесь исправить это, вы заметите, что вы не можете вернуть ответ из обработчика асинхронного.

Это намеренное: нет функции для передачи, а затем вызвать позже (например, в sendResponse Messaging API), потому что Chrome не будет ждать вас. Ожидается, что вы будете реагировать на блокирующий вызов детерминированным и быстрым способом.

Если необязательный opt_extraInfoSpec массив содержит строку 'blocking' (разрешено только для определенных событий), функция обратного вызова обрабатывается синхронно. Это означает, что запрос заблокирован , пока функция обратного вызова не вернет.

Вы могли попытаться обойти его с помощью синхронных вызовов XHR. Это не очень хорошая идея в целом, так как загрузка удаленного ответа занимает много времени, а синхронный XHR считается устаревшим. Несмотря на то что вы ограничили свои запросы "main_frame", это все равно добавляет неопределенную задержку для каждой загрузки.

Правильный способ сделать это - загрузить набор правил с сервера и периодически обновлять его, а также когда запрос будет проверяться на соответствие этой локальной копии правил. Это расширения подхода, такие как использование AdBlock.