首页 > 解决方案 > 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 中的处理程序。我已经用对那里的数据的描述替换了一些细节,这些数据在尖括号中。

清单.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"]);

常量.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 是我的日常浏览器。

提前致谢。

标签: javascriptgoogle-chromegoogle-chrome-extensionvivaldi

解决方案


推荐阅读