Есть ли способ приостановить HTTP-запрос, используя chrome.webRequest, не блокируя весь браузер? - PullRequest
3 голосов
/ 24 января 2012

Я хотел бы отобразить заголовки, перехваченные chrome.webRequest.onBeforeSendHeaders, пользователю для редактирования, предпочтительно используя chrome.tabs.executeScript. Тем не менее, chrome.tabs.executeScript является асинхронным, и я не могу найти способ дождаться его возвращения без остановки всего браузера.

Другими словами, я стремлюсь к тому, что дает приведенный ниже код, за исключением HTML-интерфейса и без замораживания любых не связанных вкладок.

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
          var foo = prompt('User-Agent', details.requestHeaders[i].value);
          // chrome.tabs.executeScript(details.tabId,{code:""});
          //^create a nice HTML overlay & pass the user input back
          details.requestHeaders[i].value = foo;
         break;
      }
    }
    return {requestHeaders: details.requestHeaders};
  },
  {urls: ["http://*/*"], types: ["main_frame"]},
  ["blocking", "requestHeaders"]);

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

1 Ответ

0 голосов
/ 25 января 2012

Я не уверен, что это сработает, но стоит попробовать.

Вы можете настроить цикл while, который будет удерживать возврат, пока ваши исполняемые скрипты не вернут сообщение через Передача сообщений ,Кроме того, вам нужно будет использовать разрешение webRequestBlocking в своем манифесте (которое, вероятно, у вас уже есть).

chrome.webRequest.onBeforeSendHeaders.addListener(
    function(details) {
        var holdReturn = false;

        for (var i = 0; i < details.requestHeaders.length; ++i) {
            if (details.requestHeaders[i].name === 'User-Agent') {
                holdReturn = true;
                chrome.extension.onRequest.addListener(
                    function(request, sender, sendResponse) {
                        if (request.userAgentOverride) {
                            details.requestHeaders[i].value = request.userAgentOverride;
                            holdReturn = false;
                        }
                    });

                chrome.tabs.executeScript(details.tabId,{file: "user-agent-dialog.js"});
                break;
            }
        }

        while (holdReturn) {
            // waiting...
        }

        return {requestHeaders: details.requestHeaders};
     },
  {urls: ["http://*/*"], types: ["main_frame"]},
  ["blocking", "requestHeaders"]);

Файл user-agent-dialog.js будет иметь:

function onFormSubmit() {
    chrome.extension.sendRequest(null, {
        userAgentOverride: userAgentValueFromInput
    });
}

// code to create the dialog and form, this will call
// onFormSubmit() when the form is submitted to send a 
// message back to the background page.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...