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