Arhn - архитектура программирования

WebRequest API расширения Chrome не работает должным образом при ответе

Итак, я пробую Chrome API webRequest. По запросу все работает нормально, но по ответу у меня возникли проблемы.

Мое тестирование довольно прямолинейно:

function func(obj)
{
    var resHeaders=obj.responseHeaders;
    for(var i=0;i<resHeaders.length;i++)
    {
        if(resHeaders[i].name=="X-Powered-By" && resHeaders[i].value.indexOf("PHP")>=0)
        {
            resHeaders[i].value="Extension";
            resHeaders.push({name:"X-Test",value:"Found"});
            chrome.pageAction.show(obj.tabId);
            break;
        }
    }
    return {responseHeaders:resHeaders};
}

chrome.webRequest.onHeadersReceived.addListener(func,{urls:["<all_urls>"]},["blocking","responseHeaders"]);

К моему удивлению, Chrome Developer Tool всегда показывает исходный заголовок, даже если заголовок правильно изменен (я должен использовать XMLHttpRequest.getAllResponseHeaders(), чтобы сказать). Это очень неудобно, потому что мне приходится делать много XHR для отладки вместо того, чтобы пробовать на реальных веб-страницах.

Редактировать: Подтверждено @RobW, это ошибка, поэтому она принадлежит crbug.com...


Более серьезная проблема заключается в том, что если изменение не было выполнено по последнему запросу перед событием загрузки, значок pageAction не будет отображаться.

Например. Если страница содержит четыре запроса:

HTML -> запускает модификацию

CSS

JS

[Загрузить событие]

HTML внутри iframe -> запускает модификацию

значок pageAction остается;

Но если страница содержит три запроса:

HTML -> запускает модификацию

CSS

JS

[Загрузить событие]

Значок pageAction появлялся и исчезал (я вижу это на медленном компьютере с XP; на быстром компьютере он просто не отображается).

Но если я затем вручную сделал XHR (запускает модификацию), значок pageAction правильно остается в адресной строке.

Эта проблема раздражает, потому что я должен сообщить пользователю (если таковой имеется), что расширение действует.


То же самое произошло на Win 7 и XP, последней версии Chrome (21+, стабильная). Это ожидаемо или я что-то не так делаю?


  • Это действительно ошибка. Четыре месяца назад я также столкнулся с этой проблемой. Сообщите об ошибке на странице new.crbug.com, если вы хотите, чтобы она была исправлена ​​(мне не удалось найти дубликат). 14.08.2012
  • @RobW Спасибо. Хотя это очень неудобно, его все же можно отлаживать. А как насчет второй проблемы (значок pageAction исчезает)? 14.08.2012
  • Содержит ли obj.tabId ожидаемое значение (не -1?). Добавьте несколько console.log и посмотрите фоновую страницу. 14.08.2012
  • @RobW Да, obj.tabId действительно содержит ожидаемое значение. Я console.log(obj.tabId+": "+JSON.stringify(resHeaders)) несколько раз перед публикацией этого вопроса. 14.08.2012
  • WebRequest API активируется до фактического отображения страницы (важно в случае main_frame). Возможно, страница выгружается после завершения работы webRequest API. Когда страница выгружается, значок pageAction удаляется. Если это так, то использование setTimeout(function(){chrome.pageAction.show(obj.tabId);}, 1000); покажет действие страницы примерно через 1 секунду после получения заголовков (никаких гарантий относительно тела ответа!). Вместо того, чтобы возиться с задержками, вы можете привязать событие chrome.tabs.onUpdated. 14.08.2012
  • @RobW Я проверил это на своем локальном хосте, где я вручную создаю все страницы ...... В любом случае, chrome.tabs.onUpdated, похоже, может обойти эту проблему (кэширует var showIconTabId={} в background.js и использует tabs.onUpdated для его обновления). Я попробую это. Большое спасибо. 14.08.2012

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..