Описание
Используйте API chrome.permissions
для запроса объявленных необязательных разрешений во время выполнения, а не во время установки, чтобы пользователи понимали, зачем нужны разрешения, и предоставляли только необходимые.
Концепции и использование
Предупреждения о разрешениях предназначены для описания возможностей, предоставляемых API, но некоторые из них могут быть неочевидны. API разрешений позволяет разработчикам объяснять предупреждения о разрешениях и постепенно добавлять новые функции, что обеспечивает пользователям безопасное знакомство с расширением. Таким образом, пользователи могут указать, какой объем прав доступа они готовы предоставить и какие функции хотят включить.
Например, основная функциональность расширения с дополнительными разрешениями переопределяет страницу новой вкладки. Одна из функций — отображение цели пользователя на день. Эта функция требует только разрешения на хранилище , которое не включает предупреждение. Расширение имеет дополнительную функцию, которую пользователи могут включить, нажав следующую кнопку:

Для отображения самых популярных сайтов пользователя требуется разрешение topSites , которое имеет следующее предупреждение.

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 . |
"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
в манифесте, а также те, которые связаны со скриптами содержимого . - разрешения
строка[] необязательная
Список поименованных разрешений (не включает хосты и источники).
Методы
addHostAccessRequest()
chrome.permissions.addHostAccessRequest(
request: object,
): Promise<void>
Добавляет запрос на доступ к хосту. Запрос будет отправлен пользователю только в том случае, если расширению предоставлен доступ к хосту в запросе. Запрос будет сброшен при переходе между источниками. При принятии предоставляется постоянный доступ к основному источнику сайта.
Параметры
- запрос
объект
- documentId
строка необязательная
Идентификатор документа, в котором могут отображаться запросы на доступ к хосту. Должен быть документом верхнего уровня на вкладке. Если указан, запрос отображается на вкладке указанного документа и удаляется при переходе документа на новый источник. Добавление нового запроса переопределит любой существующий запрос для
tabId
. Необходимо указать этот илиtabId
. - шаблон
строка необязательная
Шаблон URL, по которому могут отображаться запросы на доступ к хосту. Если он указан, запросы на доступ к хосту будут отображаться только по URL, соответствующим этому шаблону.
- tabId
номер необязательно
Идентификатор вкладки, на которой могут отображаться запросы на доступ к хосту. Если этот идентификатор указан, запрос отображается на указанной вкладке и удаляется при переходе вкладки на новый источник. Добавление нового запроса переопределит существующий запрос для
documentId
. Необходимо указать этот илиdocumentId
.
Возврат
Обещание<void>
contains()
chrome.permissions.contains(
permissions: Permissions,
): Promise<boolean>
Проверяет, имеет ли расширение указанные разрешения.
Параметры
- разрешения
Возврат
Обещание<логическое>
Хром 96+
getAll()
chrome.permissions.getAll(): Promise<Permissions>
Получает текущий набор разрешений расширения.
Возврат
Обещание< Разрешения >
Хром 96+
remove()
chrome.permissions.remove(
permissions: Permissions,
): Promise<boolean>
Закрывает доступ к указанным разрешениям. При возникновении проблем с удалением разрешений будет установлена ошибка runtime.lastError
.
Параметры
- разрешения
Возврат
Обещание<логическое>
Хром 96+
removeHostAccessRequest()
chrome.permissions.removeHostAccessRequest(
request: object,
): Promise<void>
Удаляет запрос на доступ к хосту, если таковой имеется.
Параметры
- запрос
объект
- documentId
строка необязательная
Идентификатор документа, из которого будет удалён запрос на доступ к хосту. Должен быть документом верхнего уровня на вкладке. Необходимо указать этот идентификатор или
tabId
. - шаблон
строка необязательная
Шаблон URL, из которого будет удалён запрос на доступ к хосту. Если он указан, он должен точно соответствовать шаблону существующего запроса на доступ к хосту.
- tabId
номер необязательно
Идентификатор вкладки, в которой будет удалён запрос на доступ к хосту. Необходимо указать этот идентификатор или
documentId
.
Возврат
Обещание<void>
request()
chrome.permissions.request(
permissions: Permissions,
): Promise<boolean>
Запрашивает доступ к указанным разрешениям, при необходимости отображая пользователю запрос. Эти разрешения должны быть либо определены в поле optional_permissions
манифеста, либо являться обязательными разрешениями, которые были отозваны пользователем. Пути, соответствующие шаблонам источников, будут игнорироваться. Вы можете запросить подмножества необязательных разрешений источников; например, если указать *://*\/*
в разделе optional_permissions
манифеста, можно запросить http://example.com/
. При возникновении проблем с запросом разрешений будет установлена ошибка runtime.lastError
.
Параметры
- разрешения
Возврат
Обещание<логическое>
Хром 96+
События
onAdded
chrome.permissions.onAdded.addListener(
callback: function,
)
Срабатывает, когда расширение получает новые разрешения.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(permissions: Permissions) => void
- разрешения
onRemoved
chrome.permissions.onRemoved.addListener(
callback: function,
)
Срабатывает, когда у расширения удален доступ к разрешениям.
Параметры
- перезвонить
функция
Параметр
callback
выглядит так:(permissions: Permissions) => void
- разрешения