Расширение Vivaldi - прослушиватель chrome.webRequest не может изменить userAgent
Вот полная ошибка, которая регистрируется, когда мое расширение запускается на странице, заголовки которой должны быть изменены:
Error in event handler: TypeError: Error in invocation of webRequestInternal.eventHandled(string eventName, string subEventName, string requestId, integer webViewInstanceId, optional webRequest.BlockingResponse response): Error at parameter 'response': Error at property 'requestHeaders': Error at index 1: Error at property 'value': Invalid type: expected string, found object.
at subEventCallback (extensions::webRequestEvent:82:28)
Он регистрируется один раз при каждом вызове обработчика, и, как вы понимаете, запрос не может быть успешно изменен.
Кроме того, точно такой же код работал раньше, но когда я изменил остальную часть расширения, он перестал работать. Итак, я должен предположить, что это какая-то глупая маленькая ошибка, но даже когда я отменил изменения, проблема не исчезла. К сожалению, я не использовал контроль версий, потому что я глуп, но я усвоил урок.
А вот код и соответствующие файлы. Проблема связана с обработчиком в ua-req.js. Я заменил некоторые детали описанием того, какие данные есть, и они заключены в угловые скобки.
manifest.json
{
"manifest_version": 2,
"name": "<name>",
"version": "<version>",
"background": {
"scripts": [
"constants.js",
"ua-cache.js",
"ua-req.js"
],
"persistent": true
},
"permissions": [
"cookies",
"storage",
"webRequest",
"webRequestBlocking",
"*://*.<URL>.com/*"
]
}
ua-cache.js
// Since getting the user agent from storage is async, it will only get done
// in time and be accessible from our listener if it's fetched and cached
// in a separate script that's loaded before it
// after this, cachedUA will be a string
var cachedUA = FB_UA;
const UA_LIST = "<STORAGE_KEY>";
(function() {
chrome.storage.local.get(UA_LIST, (res) => {
cachedUA = res[UA_LIST] || EDGE_UA; // or in case of a cache miss
});
})();
ua-req.js
chrome.webRequest.onBeforeSendHeaders.addListener(
function(details) {
for (let i = 0; i < details.requestHeaders.length; ++i) {
if (details.requestHeaders[i].name == "User-Agent") {
details.requestHeaders[i].value = cachedUA;
break;
}
}
return {requestHeaders: details.requestHeaders};
}, {urls: [URL_FILTER]}, ["blocking", "requestHeaders"]);
constants.js
// fallback user agent if pastes cannot be fetched
const FB_UA = "<FALLBACK_USERAGENT>";
// domain of search engine
const ENGINE_TLD = "<URL>.com";
const URL_FILTER = `*://*.${ENGINE_TLD}/*`;
Кроме того, я запускаю это расширение в Vivaldi и не пробовал его в других браузерах - проблема может не воспроизводиться в обычном Chrome. Мне он нужен для работы в Vivaldi, так как это расширение для личного использования, а Vivaldi - мой браузер, который я использую ежедневно.
Заранее спасибо.