Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / common / extensions / docs / templates / intros / permissions.html
blobd7d2c479136bd0fe5ac4b7a458eceb307d439201
1 <h2 id="howto"> Implementing optional permissions </h2>
3 <h3 id="types">
4 Step 1: Decide which permissions are required and which are optional
5 </h3>
7 <p>
8 An extension can declare both required and optional permissions. In general, you should:
9 <ul>
10 <li>Use required permissions when they are needed for your extension’s basic functionality.</li>
11 <li>Use optional permissions when they are needed for optional features in your extension.</li>
12 </ul>
13 </p>
15 <p>
16 Advantages of <em>required</em> permissions:
17 <ul>
18 <li><strong>Fewer prompts:</strong>
19 An extension can prompt the user once to accept all permissions.</li>
20 <li><strong>Simpler development:</strong>
21 Required permissions are guaranteed to be present.</li>
22 </ul>
23 </p>
25 <p>
26 Advantages of <em>optional</em> permissions:
27 <ul>
28 <li><strong>Better security:</strong>
29 Extensions run with fewer permissions since users only enable permissions that are needed.</li>
30 <li><strong>Better information for users:</strong>
31 An extension can explain why it needs a particular permission when the user enables the relevant feature.</li>
32 <li><strong>Easier upgrades:</strong>
33 When you upgrade your extension, Chrome will not disable it for your users if the upgrade adds optional rather than required permissions.</li>
34 </ul>
35 </p>
37 <h3 id="manifest"> Step 2: Declare optional permissions in the manifest </h3>
38 <p>
39 Declare optional permissions in your <a href="manifest">extension
40 manifest</a> with the <code>optional_permissions</code> key, using the
41 same format as the <a href="declare_permissions#manifest">permissions</a>
42 field:
43 </p>
45 <pre data-filename="manifest.json">
47 "name": "My extension",
48 ...
49 <b>"optional_permissions": [ "tabs", "http://www.google.com/" ],</b>
50 ...
52 </pre>
54 <p>
55 You can specify any of the following as optional
56 <a href="declare_permissions">permissions</a>:
57 <ul>
58 <li><i>host permissions</i></li>
59 <li>background</li>
60 <li>bookmarks</li>
61 <li>clipboardRead</li>
62 <li>clipboardWrite</li>
63 <li>contentSettings</li>
64 <li>contextMenus</li>
65 <li>cookies</li>
66 <li>debugger</li>
67 <li>history</li>
68 <li>idle</li>
69 <li>management</li>
70 <li>notifications</li>
71 <li>pageCapture</li>
72 <li>tabs</li>
73 <li>topSites</li>
74 <li>webNavigation</li>
75 <li>webRequest</li>
76 <li>webRequestBlocking</li>
77 </ul>
78 </p>
80 <p>If you want to request hosts that you only discover at runtime, include
81 <code>"http://*/"</code> and/or <code>"https://*/"</code> as an
82 <code>optional_permission</code>. This lets you specify any origin in
83 $(ref:Permissions.origins) as long as it has a matching scheme.
84 </p>
86 <h3 id="request"> Step 3: Request optional permissions </h3>
87 <p>
88 Request the permissions from within a user gesture using
89 <code>permissions.request()</code>:
90 <pre>
91 document.querySelector('#my-button').addEventListener('click', function(event) {
92 // Permissions must be requested from inside a user gesture, like a button's
93 // click handler.
94 chrome.permissions.request({
95 permissions: ['tabs'],
96 origins: ['http://www.google.com/']
97 }, function(granted) {
98 // The callback argument will be true if the user granted the permissions.
99 if (granted) {
100 doSomething();
101 } else {
102 doSomethingElse();
106 </pre>
107 </p>
110 Chrome prompts the user if adding the permissions results in different
111 <a href="permission_warnings">warning messages</a> than the user has
112 already seen and accepted. For example, the previous code might result in
113 a prompt like this:
114 </p>
116 <p style="text-align: center">
117 <img src="{{static}}/images/perms-optional.png"
118 alt="example permission confirmation prompt"
119 width="490" height="193">
120 </p>
122 <h3 id="contains"> Step 4: Check the extension's current permissions </h3>
124 To check whether your extension has a specific permission or set of
125 permissions, use <code>permission.contains()</code>:
126 </p>
128 <pre>
129 chrome.permissions.contains({
130 permissions: ['tabs'],
131 origins: ['http://www.google.com/']
132 }, function(result) {
133 if (result) {
134 // The extension has the permissions.
135 } else {
136 // The extension doesn't have the permissions.
139 </pre>
141 <h3 id="remove"> Step 5: Remove the permissions </h3>
143 You should remove permissions when you no longer need them.
144 After a permission has been removed, calling
145 <code>permissions.request()</code> usually adds the permission back without
146 prompting the user.
147 </p>
149 <pre>
150 chrome.permissions.remove({
151 permissions: ['tabs'],
152 origins: ['http://www.google.com/']
153 }, function(removed) {
154 if (removed) {
155 // The permissions have been removed.
156 } else {
157 // The permissions have not been removed (e.g., you tried to remove
158 // required permissions).
161 </pre>