You are viewing extension docs in chrome via the 'file:' scheme: are you expecting to see local changes when you refresh? You'll need run chrome with --allow-file-access-from-files.
WARNING: This is the BETA documentation. It may not work with the stable release of Chrome.
WARNING: This is unofficial documentation. It may not work with the current release of Chrome.

Google Chrome Extensions (Labs)

Optional Permissions

Optional Permissions

Use the chrome.permissions module to implement optional permissions. You can request optional permissions during your extension's regular application flow rather than at install time, so users understand why the permissions are needed and use only those that are necessary.

For general information about permissions and details about each permission, see the permissions section of the manifest documentation.

Implementing optional permissions

Step 1: Decide which permissions are optional and required

Extensions should generally require permissions when they are needed for the extension's basic functionality and employ optional permissions for optional features.

Advantages of optional permissions:

  • Users run with less permissions since they enable only what is needed.
  • The extension can help explain why it needs particular permissions by requesting them when the user enables the relevant feature.
  • Chrome can avoid disabling extensions that upgrade if they add permissions as optional rather than required.

Advantages of required permissions:

  • The extension can prompt the user once to accept all permissions.
  • They simplify extension development by guaranteeing which permissions are present.

Step 2: Declare optional permissions in the manifest

Declare optional permissions in your extension manifest with the optional_permissions key, using the same format as the permissions field:

{
  "name": "My extension",
  ...
  "optional_permissions": [ "tabs", "http://www.google.com/" ],
  ...
}

You can specify any of the following as optional permissions:

  • host permissions
  • appNotifications
  • background
  • bookmarks
  • clipboardRead
  • clipboardWrite
  • contentSettings
  • contextMenus
  • cookies
  • debugger
  • history
  • idle
  • management
  • notifications
  • pageCapture
  • tabs
  • topSites
  • webNavigation
  • webRequest
  • webRequestBlocking

Version note: This list is correct as of Chrome 17. More optional permissions might be allowed in future releases.

Step 3: Request optional permissions

Request the permissions from within a user gesture using permissions.request():

document.querySelector('#my-button').addEventListener('click', function(event) {
  // Permissions must be requested from inside a user gesture, like a button's
  // click handler.
  chrome.permissions.request({
    permissions: ['tabs'],
    origins: ['http://www.google.com/']
  }, function(granted) {
    // The callback argument will be true if the user granted the permissions.
    if (granted) {
      doSomething();
    } else {
      doSomethingElse();
    }
  });
});

Chrome prompts the user if adding the permissions results in different warning messages than the user has already seen and accepted. For example, the previous code might result in a prompt like this:

example permission confirmation prompt

Step 4: Check the extension's current permissions

To check whether your extension has a specific permission or set of permissions, use permission.contains():

chrome.permissions.contains({
  permissions: ['tabs'],
  origins: ['http://www.google.com/']
}, function(result) {
  if (result) {
    // The extension has the permissions.
  } else {
    // The extension doesn't have the permissions.
  }
});

Step 5: Remove the permissions

You should remove permissions when you no longer need them. After a permission has been removed, calling permissions.request() usually adds the permission back without prompting the user.

chrome.permissions.remove({
  permissions: ['tabs'],
  origins: ['http://www.google.com/']
}, function(removed) {
  if (removed) {
    // The permissions have been removed.
  } else {
    // The permissions have not been removed (e.g., you tried to remove
    // required permissions).
  }
});

API reference: chrome.permissions

Methods

contains

chrome.permissions.contains(Permissions permissions, function callback)

Checks if the extension has the specified permissions.

Parameters

permissions
Undocumented.
callback
( function )
Undocumented.

Callback function

The callback parameter should specify a function that looks like this:

function(boolean result) {...};
result
( boolean )
True if the extension has the specified permissions.

getAll

chrome.permissions.getAll(function callback)

Gets the extension's current set of permissions.

Parameters

callback
( function )
Undocumented.

Callback function

The callback parameter should specify a function that looks like this:

function(Permissions permissions) {...};
permissions
The extension's active permissions.

remove

chrome.permissions.remove(Permissions permissions, function callback)

Removes access to the specified permissions. If there are any problems removing the permissions, chrome.extension.lastError will be set.

Parameters

permissions
Undocumented.
callback
( optional function )
Undocumented.

Callback function

If you specify the callback parameter, it should specify a function that looks like this:

function(boolean removed) {...};
removed
( boolean )
True if the permissions were removed.

request

chrome.permissions.request(Permissions permissions, function callback)

Requests access to the specified permissions. These permissions must be defined in the optional_permissions field of the manifest. If there are any problems requesting the permissions, chrome.extension.lastError will be set.

Parameters

permissions
Undocumented.
callback
( optional function )
Undocumented.

Callback function

If you specify the callback parameter, it should specify a function that looks like this:

function(boolean granted) {...};
granted
( boolean )
True if the user granted the specified permissions.

Events

onAdded

chrome.permissions.onAdded.addListener(function(Permissions permissions) {...});

Fired when the extension acquires new permissions.

Listener parameters

permissions
The newly acquired permissions.

onRemoved

chrome.permissions.onRemoved.addListener(function(Permissions permissions) {...});

Fired when access to permissions has been removed from the extension.

Listener parameters

permissions
The permissions that have been removed.

Types

Permissions

( object )
Undocumented.
permissions
( optional array of string )
List of named permissions (does not include hosts or origins).
origins
( optional array of string )
List of origin permissions.