代码之家  ›  专栏  ›  技术社区  ›  M.GoodMan

使用UpdateDynamicRules的ModifyHeaders在使用manifest v3的firefox上不起作用

  •  0
  • M.GoodMan  · 技术社区  · 2 年前

    我当前正在从迁移我的扩展 清单v2 清单v3 其用于修改来自HTTP请求的报头。

    所以我使用 declarativeNetRequest.updateDynamicRules 来自chromeapi,它允许设置我的扩展的规则。

    这是我阅读以实现的文档 declarativeNetRequest.updateDynamicRules : https://developer.chrome.com/docs/extensions/reference/declarativeNetRequest/

    不幸的是,它对firefox浏览器没有影响,但在使用相同代码的chrome浏览器上运行得非常好。

    这是我的manifest.json(v3):

    {
      "manifest_version": 3,
      "name": "modify-header",
      "short_name": "modify-header",
      "version": "1.0.0",  
      "icons": {
        "38": "assets/icons/icon-off.png"
      },
      "description": "Modify HTTP request ",
      "permissions": [
        "webRequest",
        "storage",
        "declarativeNetRequest",
        "declarativeNetRequestWithHostAccess",
        "tabs",
        "cookies"
      ],
      "host_permissions": [
        "<all_urls>"
      ],
      "action": {
        "default_popup": "index.html?#/popup",
        "default_title": "Modify Headers",
        "default_icon": "assets/icons/icon-off.png"
      },
      "options_page": "index.html?#/configuration", // For chrome 
      "background": {
        "service_worker": "serviceWorker.js" // For chrome 
        "scripts" : ["serviceWorker.js"] // For firefox
      }
    }
    
    

    以下是在我的serviceWorker.js中运行的代码:

    chrome.declarativeNetRequest.updateDynamicRules(
        {
            addRules: [{
                "id": 1,
                "priority": 1,
                "action": {
                    "type": "modifyHeaders" as any,
                    "requestHeaders": [
                        { "header": "h2", "operation": "set", "value": "v2" },
                        { "header": "h3", "operation": "set", "value": "v3" }
                    ] as any
                },
                "condition": {
                    "urlFilter": "*",
                    "resourceTypes": ["main_frame"] as any
                }
            }],
            removeRuleIds: [1]
        },
    ).then(() => {
        console.log('Rule has been added !');
    }).catch((error) => {
        console.log('error:', error);
    });
    

    以下是检查网络时chrome的结果:

    result on chrome

    以下是firefox在检查网络时的结果:

    result on firefox

    正如您在chrome上看到的那样,标题已经正确添加,但在firefox上没有添加任何内容。

    我还尝试使用firefox的“浏览器api”,如下所示:

    browser.declarativeNetRequest.updateDynamicRules(
        {
            addRules: [{
                "id": 1,
                "priority": 1,
                "action": {
                    "type": "modifyHeaders" as any,
                    "requestHeaders": [
                        { "header": "h2", "operation": "set", "value": "v2" },
                        { "header": "h3", "operation": "set", "value": "v3" }
                    ] as any
                },
                "condition": {
                    "urlFilter": "*",
                    "resourceTypes": ["main_frame"] as any
                }
            }],
            removeRuleIds: [1]
        },
    ).then(() => {
        console.log('Rule has been added browser !');
    }).catch((error) => {
        console.log('error:', error);
    });
    

    但在这种情况下,它不会改变任何事情。

    这是我的设置:

    显示 版本3

    铬: 版本113

    firefox: 版本114

    firefox开发版: 版本115

    附言

    我在网上读到,也许firefox上的网络控制台没有显示修改后的标题。因此,标题已经更改,但只是没有显示。但在我的情况下,这是不正确的,因为我的扩展的行为会根据标头而改变。

    动作“块”效果完美

    0 回复  |  直到 2 年前
        1
  •  1
  •   desertnaut SKZI    2 年前

    事实证明,这不是一个bug,而是萤火虫的正常行为。

    浏览器不会自动授予主机权限,因此您必须通过右键单击扩展插件的图标手动授予这些权限。

    您可以在本文中看到完整的解释和解决方案:

    https://discourse.mozilla.org/t/modifyheaders-with-updatedynamicrules-doesnt-work-on-firefox-using-manifest-v3/120530/2