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

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

Реализация необязательных разрешений
Шаг 1: Определите, какие разрешения являются обязательными, а какие — необязательными.
Расширение может объявлять как обязательные, так и необязательные разрешения. В целом, следует:
- Используйте необходимые разрешения только тогда, когда они требуются для базовой функциональности вашего расширения.
- Используйте дополнительные разрешения, когда они необходимы для работы дополнительных функций вашего расширения.
Преимущества обязательных разрешений:
- Меньше запросов: расширение может запросить у пользователя подтверждение всех разрешений один раз.
- Упрощенная разработка: гарантировано наличие всех необходимых разрешений.
Преимущества дополнительных разрешений:
- Повышенная безопасность: расширения работают с меньшим количеством разрешений, поскольку пользователи включают только необходимые права доступа.
- Более информативное объяснение для пользователей: расширение может объяснить, почему ему требуется то или иное разрешение, когда пользователь включает соответствующую функцию.
- Упрощенное обновление: при обновлении расширения Chrome не отключит его для пользователей, если обновление добавляет необязательные, а не обязательные разрешения.
Шаг 2: Объявите необязательные разрешения в манифесте.
Укажите необязательные разрешения в манифесте расширения с помощью ключа optional_permissions , используя тот же формат, что и поле 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 . |
"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в манифесте, а также те, которые связаны с Content Scripts . - разрешения
строка[] необязательный
Список именованных разрешений (не включает хосты или источники).
Методы
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Проверяет, имеет ли расширение указанные разрешения.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(result: boolean) => void
- результат
логический
Возвращает true, если расширение имеет указанные разрешения. Если источник указан как в качестве необязательного разрешения, так и в качестве шаблона соответствия скрипта содержимого, то будет возвращено
falseесли оба разрешения не предоставлены.
Возвраты
Promise<boolean>
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
getAll()
chrome.permissions.getAll(
callback?: function,
): Promise<Permissions>
Получает текущий набор разрешений расширения.
Параметры
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(permissions: Permissions) => void
- разрешения
Активные разрешения расширения. Обратите внимание, что свойство
originsбудет содержать предоставленные источники, указанные в ключахpermissionsиoptional_permissionsв манифесте, а также источники, связанные с Content Scripts .
Возвраты
Promise< Permissions >
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Удаляет доступ к указанным разрешениям. В случае возникновения проблем с удалением разрешений, промис будет отклонен.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(removed: boolean) => void
- удаленный
логический
Верно, если разрешения были сняты.
Возвраты
Promise<boolean>
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Запрашивает доступ к указанным разрешениям, при необходимости отображая пользователю запрос. Эти разрешения должны быть либо определены в поле optional_permissions манифеста, либо являться обязательными разрешениями, которые были скрыты пользователем. Пути, указанные в шаблонах источника, будут игнорироваться. Вы можете запросить подмножества необязательных разрешений источника; например, если вы укажете *://*\/* в разделе optional_permissions манифеста, вы можете запросить http://example.com/ . Если возникнут какие-либо проблемы с запросом разрешений, промис будет отклонен.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(granted: boolean) => void
- предоставленный
логический
Возвращает true, если пользователь предоставил указанные разрешения.
Возвраты
Promise<boolean>
Chrome 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
- разрешения
Описание
Используйте API chrome.permissions для запроса объявленных необязательных разрешений во время выполнения, а не во время установки, чтобы пользователи понимали, зачем нужны эти разрешения, и предоставляли только те, которые необходимы.
Обзор
Предупреждения о разрешениях существуют для описания возможностей, предоставляемых API, но некоторые из этих предупреждений могут быть неочевидными. API разрешений позволяет разработчикам объяснять предупреждения о разрешениях и постепенно вводить новые функции, обеспечивая пользователям безопасное знакомство с расширением. Таким образом, пользователи могут указать, какой уровень доступа они готовы предоставить и какие функции они хотят включить.
Например, основная функциональность дополнительного расширения для управления разрешениями заключается в переопределении страницы новой вкладки. Одна из функций — отображение цели пользователя на день. Для этой функции требуется только разрешение на доступ к хранилищу , которое не сопровождается предупреждением. Расширение имеет дополнительную функцию, которую пользователи могут включить, нажав следующую кнопку:

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

Реализация необязательных разрешений
Шаг 1: Определите, какие разрешения являются обязательными, а какие — необязательными.
Расширение может объявлять как обязательные, так и необязательные разрешения. В целом, следует:
- Используйте необходимые разрешения только тогда, когда они требуются для базовой функциональности вашего расширения.
- Используйте дополнительные разрешения, когда они необходимы для работы дополнительных функций вашего расширения.
Преимущества обязательных разрешений:
- Меньше запросов: расширение может запросить у пользователя подтверждение всех разрешений один раз.
- Упрощенная разработка: гарантировано наличие всех необходимых разрешений.
Преимущества дополнительных разрешений:
- Повышенная безопасность: расширения работают с меньшим количеством разрешений, поскольку пользователи включают только необходимые права доступа.
- Более информативное объяснение для пользователей: расширение может объяснить, почему ему требуется то или иное разрешение, когда пользователь включает соответствующую функцию.
- Упрощенное обновление: при обновлении расширения Chrome не отключит его для пользователей, если обновление добавляет необязательные, а не обязательные разрешения.
Шаг 2: Объявите необязательные разрешения в манифесте.
Укажите необязательные разрешения в манифесте расширения с помощью ключа optional_permissions , используя тот же формат, что и поле 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 . |
"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в манифесте, а также те, которые связаны с Content Scripts . - разрешения
строка[] необязательный
Список именованных разрешений (не включает хосты или источники).
Методы
contains()
chrome.permissions.contains(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Проверяет, имеет ли расширение указанные разрешения.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(result: boolean) => void
- результат
логический
Возвращает true, если расширение имеет указанные разрешения. Если источник указан как в качестве необязательного разрешения, так и в качестве шаблона соответствия скрипта содержимого, то будет возвращено
falseесли оба разрешения не предоставлены.
Возвраты
Promise<boolean>
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
getAll()
chrome.permissions.getAll(
callback?: function,
): Promise<Permissions>
Получает текущий набор разрешений расширения.
Параметры
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(permissions: Permissions) => void
- разрешения
Активные разрешения расширения. Обратите внимание, что свойство
originsбудет содержать предоставленные источники, указанные в ключахpermissionsиoptional_permissionsв манифесте, а также источники, связанные с Content Scripts .
Возвраты
Promise< Permissions >
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
remove()
chrome.permissions.remove(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Удаляет доступ к указанным разрешениям. В случае возникновения проблем с удалением разрешений, промис будет отклонен.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(removed: boolean) => void
- удаленный
логический
Верно, если разрешения были сняты.
Возвраты
Promise<boolean>
Chrome 96+Поддержка промисов доступна только для Manifest V3 и более поздних версий; для других платформ необходимо использовать колбэки.
request()
chrome.permissions.request(
permissions: Permissions,
callback?: function,
): Promise<boolean>
Requests access to the specified permissions, displaying a prompt to the user if necessary. These permissions must either be defined in the optional_permissions field of the manifest or be required permissions that were withheld by the user. Paths on origin patterns will be ignored. You can request subsets of optional origin permissions; for example, if you specify *://*\/* in the optional_permissions section of the manifest, you can request http://example.com/ . If there are any problems requesting the permissions, the promise will be rejected.
Параметры
- разрешения
- перезвонить
функция необязательна
Параметр
callbackвыглядит следующим образом:(granted: boolean) => void
- предоставленный
логический
Возвращает true, если пользователь предоставил указанные разрешения.
Возвраты
Promise<boolean>
Chrome 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
- разрешения