#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.