Запретить всплывающее окно, если текущий URL-адрес вкладки не разрешен в манифесте v3

#google-chrome-extension #chrome-extension-manifest-v3

Вопрос:

Я пишу расширение 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 (или где-либо еще), я хочу, чтобы всплывающее окно было отключено.

Я могу достаточно легко получить соответствующий URL-адрес:

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

…и я могу получить массив разрешенных шаблонов файлов с помощью

 chrome.runtime.getManifest().host_permissions
 

Но как я могу использовать это или что-либо еще, чтобы предотвратить всплывающее окно? Кроме того, преобразование этой дикой карты в подлинное регулярное выражение будет немного болезненным. Разве нет какого-нибудь готового метода для всего этого??

Ответ №1:

Используйте API chrome.declarativeContent, чтобы включить всплывающее окно действия для сайтов host_permissions и отключить его везде по умолчанию.

При отключении значок становится серым. При нажатии на него откроется встроенное контекстное меню chrome.действие.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.