Описание
Используйте API chrome.permissions
для запроса объявленных необязательных разрешений во время выполнения, а не во время установки, чтобы пользователи понимали, зачем нужны разрешения, и предоставляли только необходимые.
Обзор
Предупреждения о разрешениях предназначены для описания возможностей, предоставляемых API, но некоторые из них могут быть неочевидны. API разрешений позволяет разработчикам объяснять предупреждения о разрешениях и постепенно добавлять новые функции, что обеспечивает пользователям безопасное знакомство с расширением. Таким образом, пользователи могут указать, какой объем прав доступа они готовы предоставить и какие функции хотят включить.
Например, основная функциональность расширения с дополнительными разрешениями переопределяет страницу новой вкладки. Одна из функций — отображение цели пользователя на день. Эта функция требует только разрешения на хранилище , которое не включает предупреждение. Расширение имеет дополнительную функцию, которую пользователи могут включить, нажав следующую кнопку:
Для отображения самых популярных сайтов пользователя требуется разрешение topSites , которое имеет следующее предупреждение.
Реализация необязательных разрешений
Шаг 1: Решите, какие разрешения необходимы, а какие необязательны.
Расширение может объявлять как обязательные, так и необязательные разрешения. В общем случае следует:
- Используйте требуемые разрешения, когда они необходимы для основных функций вашего расширения.
- Используйте дополнительные разрешения, когда они необходимы для дополнительных функций вашего расширения.
Преимущества необходимых разрешений:
- Меньше запросов: расширение может один раз запросить у пользователя принятие всех разрешений.
- Более простая разработка: гарантированно присутствуют все необходимые разрешения.
Преимущества дополнительных разрешений:
- Повышенная безопасность: расширения работают с меньшим количеством разрешений, поскольку пользователи включают только те разрешения, которые необходимы.
- Более подробная информация для пользователей: расширение может объяснить, почему ему требуется определенное разрешение, когда пользователь включает соответствующую функцию.
- Более простые обновления: при обновлении расширения Chrome не отключит его для ваших пользователей, если обновление добавляет необязательные, а не обязательные разрешения.
Шаг 2: Объявите необязательные разрешения в манифесте
Объявите необязательные разрешения в манифесте расширения с помощью ключа optional_permissions
, используя тот же формат, что и поле разрешений :
{
"name": "My extension",
...
"optional_permissions": ["tabs"],
"optional_host_permissions": ["https://www.google.com/"],
...
}
Если вы хотите запрашивать хосты, которые обнаруживаются только во время выполнения, добавьте "https://*/*"
в поле optional_host_permissions
вашего расширения. Это позволит вам указать любой источник в Permissions.origins , если у него есть соответствующая схема.
Разрешения, которые не могут быть указаны как необязательные
Большинство разрешений расширений Chrome можно указать как необязательные, за исключением следующих.
Разрешение | Описание |
---|---|
"debugger" | API chrome.debugger служит альтернативным транспортом для протокола удаленной отладки Chrome. |
"declarativeNetRequest" | Предоставляет расширению доступ к API chrome.declarativeNetRequest . |
"devtools" | Позволяет расширить функциональность Chrome DevTools . |
"experimental" | Только для каналов Canary и Dev . Предоставляет расширению доступ к API chrome.experimental . |
"geolocation" | Позволяет расширению использовать API геолокации HTML5. |
"mdns" | Предоставляет расширению доступ к API chrome.mdns . |
"proxy" | Предоставляет расширению доступ к API chrome.proxy для управления настройками прокси-сервера Chrome. |
"tts" | API chrome.tts воспроизводит синтезированный текст в речь (TTS). |
"ttsEngine" | API chrome.ttsEngine реализует механизм преобразования текста в речь (TTS) с помощью расширения. |
"wallpaper" | Только для ChromeOS . Используйте API chrome.wallpaper для смены обоев ChromeOS. |
Дополнительную информацию о доступных разрешениях и их предупреждениях см. в разделах Объявление разрешений и Предупреждение пользователей .
Шаг 3: Запросите дополнительные разрешения
Запросите разрешения из жеста пользователя, используя permissions.request()
:
document.querySelector('#my-button').addEventListener('click', (event) => {
// Permissions must be requested from inside a user gesture, like a button's
// click handler.
chrome.permissions.request({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (granted) => {
// The callback argument will be true if the user granted the permissions.
if (granted) {
doSomething();
} else {
doSomethingElse();
}
});
});
Chrome выводит предупреждение пользователю, если добавление разрешений приводит к появлению предупреждений, отличных от тех, которые пользователь уже видел и принял. Например, предыдущий код может привести к такому запросу:
Шаг 4: Проверьте текущие разрешения расширения.
Чтобы проверить, имеет ли ваше расширение определенное разрешение или набор разрешений, используйте permission.contains()
:
chrome.permissions.contains({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (result) => {
if (result) {
// The extension has the permissions.
} else {
// The extension doesn't have the permissions.
}
});
Шаг 5: Удалите разрешения
Разрешения следует удалять, когда они больше не нужны. После удаления разрешения вызов permissions.request()
обычно возвращает его обратно без запроса у пользователя.
chrome.permissions.remove({
permissions: ['tabs'],
origins: ['https://www.google.com/']
}, (removed) => {
if (removed) {
// The permissions have been removed.
} else {
// The permissions have not been removed (e.g., you tried to remove
// required permissions).
}
});
Типы
Permissions
Характеристики
- происхождение
строка[] необязательная
Список разрешений хоста, включая те, которые указаны в ключах
optional_permissions
илиpermissions
в манифесте, а также те, которые связаны со скриптами содержимого . - разрешения
строка[] необязательная
Список поименованных разрешений (не включает хосты и источники).
Методы
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Проверяет, имеет ли расширение указанные разрешения.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callback
выглядит так:(result: boolean) => void
- результат
булев
True, если у расширения есть указанные разрешения. Если источник указан и как необязательное разрешение, и как шаблон соответствия скрипту контента, будет возвращено
false
если не предоставлены оба разрешения.
Возврат
Обещание<логическое>
Хром 96+Обещания поддерживаются только для Manifest V3 и более поздних версий, на других платформах необходимо использовать обратные вызовы.
getAll()
chrome.permissions.getAll(
callback?: function,
): Promise<Permissions>
Получает текущий набор разрешений расширения.
Параметры
- перезвонить
функция необязательна
Параметр
callback
выглядит так:(permissions: Permissions) => void
- разрешения
Активные разрешения расширения. Обратите внимание, что свойство
origins
будет содержать предоставленные разрешения из тех, что указаны в ключахpermissions
иoptional_permissions
в манифесте, а также из тех, что связаны со скриптами контента .
Возврат
Обещание< Разрешения >
Хром 96+Обещания поддерживаются только для Manifest V3 и более поздних версий, на других платформах необходимо использовать обратные вызовы.
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Закрывает доступ к указанным разрешениям. При возникновении проблем с удалением разрешений будет установлена ошибка runtime.lastError
.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callback
выглядит так:(removed: boolean) => void
- удаленный
булев
True, если разрешения были удалены.
Возврат
Обещание<логическое>
Хром 96+Обещания поддерживаются только для Manifest V3 и более поздних версий, на других платформах необходимо использовать обратные вызовы.
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Запрашивает доступ к указанным разрешениям, при необходимости отображая пользователю запрос. Эти разрешения должны быть либо определены в поле optional_permissions
манифеста, либо являться обязательными разрешениями, которые были отозваны пользователем. Пути, соответствующие шаблонам источников, будут игнорироваться. Вы можете запросить подмножества необязательных разрешений источников; например, если указать *://*\/*
в разделе optional_permissions
манифеста, можно запросить http://example.com/
. При возникновении проблем с запросом разрешений будет установлена ошибка runtime.lastError
.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callback
выглядит так:(granted: boolean) => void
- предоставленный
булев
True, если пользователь предоставил указанные разрешения.
Возврат
Обещание<логическое>
Хром 96+Обещания поддерживаются только для Manifest V3 и более поздних версий, на других платформах необходимо использовать обратные вызовы.
События
onAdded
chrome.permissions.onAdded.addListener(
callback: function,
)
Срабатывает, когда расширение получает новые разрешения.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(permissions: Permissions) => void
- разрешения
onRemoved
chrome.permissions.onRemoved.addListener(
callback: function,
)
Срабатывает, когда у расширения удален доступ к разрешениям.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(permissions: Permissions) => void
- разрешения