仅在一台主机上启用 Chrome 扩展操作按钮

Enable Chrome extension action button only on one host

我一直在尝试将我的 Chrome 扩展之一迁移到清单 v3,但我遇到了 page_action 的问题。在 manifest v3 中,page_actionbrowser_action 合并到 action 中,这一切都很好,但我不清楚如何才能获得以前使用新 API 时的行为。

一些背景知识;有问题的扩展只应该在一台主机上 运行(比方说 https://example.com)。因此,我想将具有不同主机的页面上的图标变灰。它有一个带有一些设置的弹出窗口,但主要功能是通过内容脚本插入的(这有效)。

使用清单 v2 的旧扩展

{
    "manifest_version": 2,
    "name": "...",
    "description": "...",
    "version": "...",
    "permissions": ["declarativeContent", "storage", "https://example.com/", "tabs"],
    "page_action": {
        "default_icon": { ... },
        "default_popup": "popup.html"
    },
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    },
    "icons": { ... },
    "content_scripts": [{
        "js": ["content.js"],
        "matches": ["https://example.com/*", "https://www.example.com/*"]
    }]
}

background.js中我使用了

chrome.runtime.onInstalled.addListener(function(){
    const pageUrl = {hostEquals: 'www.example.com'};
    const {
        onPageChanged,
        PageStateMatcher,
        ShowPageAction
    } = chrome.declarativeContent;

    onPageChanged.removeRules(undefined, function(){
        onPageChanged.addRules([{
            conditions: [new PageStateMatcher({pageUrl})],
            actions: [new ShowPageAction()]
        }]);
    });
});

这很好用,图标变灰了,https://example.com 除外。迁移时,清单看起来像

{
    "manifest_version": 3,
    "name": ...,
    "description": ...,
    "version": ...,
    "permissions": ["storage", "tabs", "declarativeContent", "activeTab"],
    "background": {"service_worker": "service-worker.js"},
    "action": {
        "default_icon": { ... },
        "default_popup": "popup/index.html"
    },
    "icons": { ... },
    "content_scripts": [{
        "matches": ["*://*.example.com/*"],
        "js": ["content/detect-theme.js"]
    }]
}

我似乎无法让它正常工作。我尝试添加 host_permissions,删除 declarativeContent 相关代码(因为它似乎不会影响图标),但扩展在所有主机上仍然可用。我知道我可以使用 chrome.action.enablechrome.action.disable 方法来模拟这种行为,但对于这样一个简单的用例来说似乎有点过分了。

实际上,即使在其他页面上可用的操作也不会以任何方式中断,但我想让我的用户更清楚地知道,该扩展程序只在 https://example.com 上执行,其他任何地方都不会执行。也许这甚至不是正确的方法;如果不是,我也接受它作为答案。

TLDR;如何仅在具有清单 v3 的特定主机上启用(页面)操作?

我自己也遇到了同样的问题,我刚刚解决了!

我通过在添加激活规则之前禁用处理程序中的扩展来修复它。为了简洁起见,我删除了实际的处理程序。

chrome.runtime.onInstalled.addListener(() => {

    chrome.action.disable(); // The important line!

    // actual handler...
});

我猜 ShowPageAction 默认情况下不再禁用扩展。