仅在一台主机上启用 Chrome 扩展操作按钮
Enable Chrome extension action button only on one host
我一直在尝试将我的 Chrome 扩展之一迁移到清单 v3,但我遇到了 page_action
的问题。在 manifest v3 中,page_action
和 browser_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.enable
和 chrome.action.disable
方法来模拟这种行为,但对于这样一个简单的用例来说似乎有点过分了。
实际上,即使在其他页面上可用的操作也不会以任何方式中断,但我想让我的用户更清楚地知道,该扩展程序只在 https://example.com 上执行,其他任何地方都不会执行。也许这甚至不是正确的方法;如果不是,我也接受它作为答案。
TLDR;如何仅在具有清单 v3 的特定主机上启用(页面)操作?
我自己也遇到了同样的问题,我刚刚解决了!
我通过在添加激活规则之前禁用处理程序中的扩展来修复它。为了简洁起见,我删除了实际的处理程序。
chrome.runtime.onInstalled.addListener(() => {
chrome.action.disable(); // The important line!
// actual handler...
});
我猜 ShowPageAction
默认情况下不再禁用扩展。
我一直在尝试将我的 Chrome 扩展之一迁移到清单 v3,但我遇到了 page_action
的问题。在 manifest v3 中,page_action
和 browser_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.enable
和 chrome.action.disable
方法来模拟这种行为,但对于这样一个简单的用例来说似乎有点过分了。
实际上,即使在其他页面上可用的操作也不会以任何方式中断,但我想让我的用户更清楚地知道,该扩展程序只在 https://example.com 上执行,其他任何地方都不会执行。也许这甚至不是正确的方法;如果不是,我也接受它作为答案。
TLDR;如何仅在具有清单 v3 的特定主机上启用(页面)操作?
我自己也遇到了同样的问题,我刚刚解决了!
我通过在添加激活规则之前禁用处理程序中的扩展来修复它。为了简洁起见,我删除了实际的处理程序。
chrome.runtime.onInstalled.addListener(() => {
chrome.action.disable(); // The important line!
// actual handler...
});
我猜 ShowPageAction
默认情况下不再禁用扩展。