Итак, я пробую 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+, стабильная). Это ожидаемо или я что-то не так делаю?