Chrome 扩展清单 v3:仅在单击扩展图标时加载内容脚本(最小化权限)

jas*_*ram 3 google-chrome-extension chrome-extension-manifest-v3

我正在将功能正常的浏览器扩展迁移到清单 v3。问题:我希望仅在单击浏览器扩展图标时加载内容脚本。但是,脚本始终会加载。当我尝试上传到 chrome 商店时,我收到以下消息,这是我想避免的:

由于主机权限的原因,您的扩展程序可能需要深入审查,这将延迟发布。

我怀疑这与“行动”有关,但我不知道如何解决这个问题。这是清单:

{
    "manifest_version": 3,
    "name": "__MSG_extName__",
    "description": "__MSG_extDescription__",
    "key": "...",
    "version": "1.0.0",
    "icons": { ... },
    "background": {
        "service_worker": "/background.js"
    },
    "permissions": [
        "storage"
    ],
    "content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "/content.js"
            ]
        }
    ],
    "web_accessible_resources": [
        {
            "resources": [
                "/assets/*",
                "/options.html"
            ],
            "matches": [
                "<all_urls>"
            ]
        }
    ],
    "options_page": "options.html",
    "action": {}
}
Run Code Online (Sandbox Code Playgroud)

最后一点:我认为我需要activeTab许可。但同样,我的问题是我想最小化所需的权限。

提前致谢!

jas*_*ram 8

我最终想通了。基本上,我必须删除“content_scripts”部分。相反,我需要使用操作处理程序显式注入内容脚本。我错误地认为我可以使用正确的权限限制 content_scripts 部分。

为此,我必须设置 activeTab 和脚本权限,这里是新权限:

"permissions": [
    "storage",
    "activeTab",
    "scripting"
],
Run Code Online (Sandbox Code Playgroud)

我的 Service Worker (background.js) 中已经有一个操作处理程序,现在如下所示:

chrome.action.onClicked.addListener(async (tab) => {
  await chrome.scripting.executeScript({
    target: { tabId: tab.id, allFrames: true },
    files: ["content.js"],
  });
  // Do other stuff...
});
Run Code Online (Sandbox Code Playgroud)

我希望这个答案能帮助某人、某处!