0

我正在编写一个 chrome 扩展,我想完全禁用弹出窗口,或者如果当前选项卡的 url 不允许通过 v3 清单的host_permissions属性显示,则显示一条消息。

这是一个开发支持工具,我们不希望它为生产 URL 启用。所以如果我设置:

"host_permissions": [
  "http://localhost:3000/",
  "https://*.dev.some-site.com/",
  "https://www.uat.some-site.com/"
]

...然后,如果用户在www.some-site.com(或其他任何地方)上,我希望禁用弹出窗口。

我可以很容易地获得相关的网址:

let [currentTab] = await chrome.tabs.query({ active: true, currentWindow: true });
const { url } = currentTab;
const cookieUrl = url.match(/https?:\/\/[^/]+\//)?.[0];

...我可以通过以下方式获得允许的文件模式数组

chrome.runtime.getManifest().host_permissions

但是我怎样才能使用这个或其他任何东西来防止弹出?此外,将该通配符转换为真正的正则表达式会有点痛苦。难道没有一些开箱即用的方法来做这一切吗?

4

1 回答 1

1

默认情况下,使用chrome.declarativeContent API 启用站点的操作弹出窗口host_permissions并在其他任何地方禁用它。

禁用时,图标变为灰色。单击它会显示内置的上下文菜单,不会触发 chrome.action.onClicked。拼图菜单中的扩展名也显示为灰色。

清单.json:

  "action": {"default_icon": "icon.png"},
  "permissions": ["declarativeContent"],

背景脚本:

chrome.action.disable();

chrome.runtime.onInstalled.addListener(() => {
  chrome.declarativeContent.onPageChanged.removeRules(() => {
    chrome.declarativeContent.onPageChanged.addRules([{
      conditions: chrome.runtime.getManifest().host_permissions.map(h => {
        const [, sub, host] = h.match(/:\/\/(\*\.)?([^/]+)/);
        return new chrome.declarativeContent.PageStateMatcher({
          pageUrl: sub ? {hostSuffix: '.' + host} : {hostEquals: host},
        });
      }),
      actions: [new chrome.declarativeContent.ShowAction()],
    }]);
  });
});

为简单起见,我不限制 PageStateMatcher 的方案

于 2021-10-16T19:56:29.190 回答