OLD | NEW |
---|---|
(Empty) | |
1 <h1>Options</h1> | |
2 | |
3 <p class="warning"> | |
4 This new way of writing options is only supported from Chrome 40 onwards. | |
5 <a href="options">See the old documentation</a>. | |
6 </p> | |
7 | |
8 <p> | |
9 To allow users to customize the behavior of your extension, you may wish to | |
10 provide an options page. | |
11 | |
12 <p> | |
13 If you do, an Options link will be shown on the extensions management page at | |
14 <em>chrome://extensions</em> which opens a dialogue containing your options | |
15 page: | |
16 </p> | |
17 | |
18 <img src="{{static}}/images/options_ui.png" alt="Options UI screenshot"> | |
mkearney1
2014/10/31 20:48:24
image name is options-ui.png, so image isn't showi
not at google - send to devlin
2014/10/31 21:51:39
Oops. That's so weird, works on my mac. Fixed.
| |
19 | |
20 <p> | |
21 Note: Always use the $(ref:storage.sync) API to persist your options. This will | |
mkearney1
2014/10/31 20:48:24
I'd be inclined to drop the "Note:". Just assert..
not at google - send to devlin
2014/10/31 21:51:39
Done.
| |
22 make them accessible from script within your extension, on all of your user's | |
23 devices. | |
24 </p> | |
25 | |
26 <h2 id="step-1">Step 1: Declare your options page in the manifest</h2> | |
27 | |
28 <p> | |
29 Use the <code>options_ui</code> manifest field to declare the options page and | |
30 how it should be displayed: | |
31 </p> | |
32 | |
33 <pre data-filename="manifest.json"> | |
34 { | |
35 "name": "My extension", | |
36 ... | |
37 <b>"options_ui"</b>: { | |
38 // Required. | |
39 <b>"page": "options.html"</b>, | |
40 // Recommended. | |
41 <b>"chrome_style": true,</b> | |
42 // Not recommended; only provided for backwards compatibility, | |
43 // and will be unsupported in a future version of Chrome (TBD). | |
44 <b>//"open_in_tab": true</b> | |
45 }, | |
46 ... | |
47 } | |
48 </pre> | |
49 | |
50 {{+partials.manifest_type | |
51 type:apis.extensions.extensionsManifestTypes.byName.OptionsUI /}} | |
52 | |
53 <h2 id="step-2">Step 2: Write your options page</h2> | |
54 | |
55 <p> | |
56 Here is an example options page: | |
mkearney1
2014/10/31 20:48:24
Slight rewrite:
Here's an example, including an
not at google - send to devlin
2014/10/31 21:51:40
Done. With or without the : at the end?
| |
57 </p> | |
58 | |
59 <pre data-filename="options.html"> | |
60 <!DOCTYPE html> | |
61 <html> | |
62 <head> | |
63 <title>My Test Extension Options</title> | |
64 <style> | |
65 body: { padding: 10px; } | |
66 </style> | |
67 </head> | |
68 | |
69 <body> | |
70 Favorite color: | |
71 <select id="color"> | |
72 <option value="red">red</option> | |
73 <option value="green">green</option> | |
74 <option value="blue">blue</option> | |
75 <option value="yellow">yellow</option> | |
76 </select> | |
77 | |
78 <label> | |
79 <input type="checkbox" id="like"> | |
80 I like colors. | |
81 </label> | |
82 | |
83 <div id="status"></div> | |
84 <button id="save">Save</button> | |
85 | |
86 <script src="options.js"></script> | |
87 </body> | |
88 </html> | |
89 </pre> | |
90 | |
91 <pre data-filename="options.js"> | |
92 // Saves options to chrome.storage.sync. | |
93 function save_options() { | |
94 var color = document.getElementById('color').value; | |
95 var likesColor = document.getElementById('like').checked; | |
96 chrome.storage.sync.set({ | |
97 favoriteColor: color, | |
98 likesColor: likesColor | |
99 }, function() { | |
100 // Update status to let user know options were saved. | |
101 var status = document.getElementById('status'); | |
102 status.textContent = 'Options saved.'; | |
103 setTimeout(function() { | |
104 status.textContent = ''; | |
105 }, 750); | |
106 }); | |
107 } | |
108 | |
109 // Restores select box and checkbox state using the preferences | |
110 // stored in chrome.storage. | |
111 function restore_options() { | |
112 // Use default value color = 'red' and likesColor = true. | |
113 chrome.storage.sync.get({ | |
114 favoriteColor: 'red', | |
115 likesColor: true | |
116 }, function(items) { | |
117 document.getElementById('color').value = items.favoriteColor; | |
118 document.getElementById('like').checked = items.likesColor; | |
119 }); | |
120 } | |
121 document.addEventListener('DOMContentLoaded', restore_options); | |
122 document.getElementById('save').addEventListener('click', | |
123 save_options); | |
124 </pre> | |
125 | |
126 <h2 id="considerations">Considerations</h2> | |
127 | |
128 <p> | |
129 Options pages embedded inside <em>chrome://extensions</em> have some subtle | |
130 behavior that should be considered while writing them, mostly caused by not | |
mkearney1
2014/10/31 20:48:24
Replace 'that should be considered' with 'you shou
not at google - send to devlin
2014/10/31 21:51:40
Done.
| |
131 being hosted inside their own tabs. | |
132 </p> | |
133 | |
134 <h3 id="tabs-api">Tabs API</h3> | |
135 <p> | |
136 Options page code cannot assume that they are hosted inside a tab, and this may | |
mkearney1
2014/10/31 20:48:24
'that they are' better as 'that it's'.
not at google - send to devlin
2014/10/31 21:51:40
Done.
| |
137 affect how the $(ref:tabs Tabs API) can be used. For example, | |
138 <ul> | |
139 <li>$(ref:tabs.query) will never find a tab with your extension's options | |
140 page URL.</li> | |
141 <li>$(ref:tabs.onCreated) will not fire when your options page is | |
142 opened.</li> | |
143 <li>$(ref:tabs.onUpdated) will not fire when your options page load state | |
144 changes.</li> | |
145 <li>You cannot use $(ref:tabs.connect) or $(ref:tabs.sendMessage) to | |
146 communicate with your options page.</li> | |
147 </ul> | |
148 </p> | |
149 <p> | |
150 It is easy to work around these issues or use alternative APIs. Generally | |
151 speaking you shouldn't need to manipulate the tab containing your extensions | |
152 options page. | |
153 </p> | |
154 <p> | |
155 You can use $(ref:runtime.connect) and $(ref:runtime.sendMessage) because your | |
156 options page is an extension page. | |
157 </p> | |
158 | |
159 <h3 id="messaging-api">Messaging APIs</h3> | |
160 <p> | |
161 If your options page sends a message using $(ref:runtime.connect) or | |
162 $(ref:runtime.sendMessage) then the $(ref:runtime.MessageSender.tab Tab's) URL | |
163 and $(ref:runtime.MessageSender.url MessageSender's URL) properties won't agree | |
164 - the tab URL will be of <em>chrome://settings</em> while the URL will be your | |
165 options page URL. | |
166 </p> | |
167 | |
168 <h3 id="sizing">Sizing</h3> | |
169 <p> | |
170 The embedded dialogue should automatically determine its own size based on the | |
171 options page content. However, the dialogue may not find a good size for some | |
172 types of options pages. This problem is most common for options pages that | |
173 adjust their size based on window size. | |
174 </p> | |
175 <p> | |
176 If this is an issue, we recommend that you provide fixed minimum dimensions for | |
mkearney1
2014/10/31 20:48:23
Can you drop 'we recommend that you' and go with '
not at google - send to devlin
2014/10/31 21:51:40
Done.
| |
177 the options page to ensure that the dialogue will find an appropriate size. | |
178 </p> | |
179 | |
180 <h2 id="migration">Migrating from old options pages</h2> | |
181 <p class="warning"> | |
182 At least until Chrome 40 is stable, you should specify <strong>both</strong> | |
183 the <code>options_ui</code> <strong>and</strong> the <code>options_page</code> | |
184 fields. | |
185 <br><br> | |
186 Older version of Chrome will only recognize <code>options_page</code>, | |
mkearney1
2014/10/31 20:48:24
Nit: 'Older version' should be 'Older versions'.
not at google - send to devlin
2014/10/31 21:51:40
Done.
| |
187 and only open in tabs. Chrome 40 and onwards will prefer to use the | |
mkearney1
2014/10/31 20:48:24
'will prefer' better as 'prefers'.
not at google - send to devlin
2014/10/31 21:51:39
Done.
| |
188 <code>options_ui</code> field if it's specified. | |
189 <br><br> | |
190 You can use this to provide separate options pages for compatibility. | |
mkearney1
2014/10/31 20:48:23
Do you need line 190? Seems redundant.
not at google - send to devlin
2014/10/31 21:51:40
I think it's redundant in a way, though pointing o
| |
191 </p> | |
192 | |
193 The <code>options_ui</code> manifest field and embedded extension options | |
194 were introduced in Chrome 40. Prior to these changes, options pages were always | |
195 displayed in new tabs and were declared using the <code>options_page</code> | |
196 field: | |
197 </p> | |
198 | |
199 <pre data-filename="manifest.json"> | |
200 { | |
201 "name": "My extension", | |
202 ... | |
203 "options_page": "options.html" | |
204 ... | |
205 } | |
206 </pre> | |
207 <p> | |
208 See <a href="options">this document</a> for full details. | |
209 </p> | |
210 | |
211 <p> | |
212 Chrome will continue to support extensions that use the legacy | |
213 <code>options_page</code> manifest field, but new and existing extensions | |
214 should use the <code>options_ui</code> manifest field to ensure that their | |
215 options pages are displayed as intended. | |
216 </p> | |
217 <p> | |
218 If you specify both, Chrome 40 and onwards will ignore the value of | |
219 <code>options_page</code>. | |
220 </p> | |
221 <p> | |
222 In a future version of Chrome any extension which specifies | |
mkearney1
2014/10/31 20:48:24
Nit: comma after "In a future version of Chrome".
not at google - send to devlin
2014/10/31 21:51:39
Done.
| |
223 <code>options_page</code> will change to match the <code>options_ui</code> | |
224 behavior - most importantly, they will always be embedded in | |
225 <em>chrome://extensions</em> - so migrate as soon as possible. | |
226 </p> | |
OLD | NEW |