Описание
 Используйте 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 - разрешения