Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Side by Side Diff: chrome/common/extensions/docs/overview.html

Issue 10642015: Basic setup for generating app docs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 <!DOCTYPE html><!-- This page is a placeholder for generated extensions api doc. Note:
2 1) The <head> information in this page is significant, should be uniform
3 across api docs and should be edited only with knowledge of the
4 templating mechanism.
5 3) All <body>.innerHTML is genereated as an rendering step. If viewed in a
6 browser, it will be re-generated from the template, json schema and
7 authored overview content.
8 4) The <body>.innerHTML is also generated by an offline step so that this
9 page may easily be indexed by search engines.
10 --><html xmlns="http://www.w3.org/1999/xhtml"><head>
11 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
12 <link href="css/ApiRefStyles.css" rel="stylesheet" type="text/css">
13 <link href="css/print.css" rel="stylesheet" type="text/css" media="print">
14 <script type="text/javascript" src="../../../third_party/jstemplate/jstempla te_compiled.js">
15 </script>
16 <script type="text/javascript" src="../../../../third_party/json_minify/mini fy-sans-regexp.js">
17 </script>
18 <script type="text/javascript" src="js/api_page_generator.js"></script>
19 <script type="text/javascript" src="js/bootstrap.js"></script>
20 <script type="text/javascript" src="js/sidebar.js"></script>
21 <title>Overview - Google Chrome Extensions - Google Code</title></head>
22 <body> <div id="devModeWarning" class="displayModeWarning">
23 You are viewing extension docs in chrome via the 'file:' scheme: are you exp ecting to see local changes when you refresh? You'll need run chrome with --allo w-file-access-from-files.
24 </div>
25 <div id="branchWarning" class="displayModeWarning">
26 <span>WARNING: This is the <span id="branchName">BETA</span> documentation.
27 It may not work with the stable release of Chrome.</span>
28 <select id="branchChooser">
29 <option>Choose a different version...
30 </option><option value="">Stable
31 </option><option value="beta">Beta
32 </option><option value="dev">Dev
33 </option><option value="trunk">Trunk
34 </option></select>
35 </div>
36 <div id="unofficialWarning" class="displayModeWarning">
37 <span>WARNING: This is unofficial documentation. It may not work with the
38 current release of Chrome.</span>
39 <button id="goToOfficialDocs">Go to the official docs</button>
40 </div>
41 <div id="gc-container" class="labs">
42 <!-- SUBTEMPLATES: DO NOT MOVE FROM THIS LOCATION -->
43 <!-- In particular, sub-templates that recurse, must be used by allowing
44 jstemplate to make a copy of the template in this section which
45 are not operated on by way of the jsskip="true" -->
46 <!-- /SUBTEMPLATES -->
47 <a id="top"></a>
48 <div id="skipto">
49 <a href="#gc-pagecontent">Skip to page content</a>
50 <a href="#gc-toc">Skip to main navigation</a>
51 </div>
52 <!-- API HEADER -->
53 <table id="header" width="100%" cellspacing="0" border="0">
54 <tbody><tr>
55 <td valign="middle"><a href="http://code.google.com/"><img src="images/c ode_labs_logo.gif" height="43" width="161" alt="Google Code Labs" style="border: 0; margin:0;"></a></td>
56 <td valign="middle" width="100%" style="padding-left:0.6em;">
57 <form action="http://www.google.com/cse" id="cse" style="margin-top:0. 5em">
58 <div id="gsc-search-box">
59 <input type="hidden" name="cx" value="002967670403910741006:61_cvz fqtno">
60 <input type="hidden" name="ie" value="UTF-8">
61 <input type="text" name="q" value="" size="55">
62 <input class="gsc-search-button" type="submit" name="sa" value="Se arch">
63 <br>
64 <span class="greytext">e.g. "page action" or "tabs"</span>
65 </div>
66 </form>
67 <script type="text/javascript" src="https://www.google.com/jsapi"></sc ript>
68 <script type="text/javascript">google.load("elements", "1", {packages: "transliteration"});</script>
69 <script type="text/javascript" src="https://www.google.com/coop/cse/t1 3n?form=cse&amp;t13n_langs=en"></script>
70 <script type="text/javascript" src="https://www.google.com/coop/cse/br and?form=cse&amp;lang=en"></script>
71 </td>
72 </tr>
73 </tbody></table>
74 <div id="codesiteContent" class="">
75 <a id="gc-topnav-anchor"></a>
76 <div id="gc-topnav">
77 <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Lab s</a>)</h1>
78 <ul id="home" class="gc-topnav-tabs">
79 <li id="home_link">
80 <a href="index.html" title="Google Chrome Extensions home page">Home </a>
81 </li>
82 <li id="docs_link">
83 <a href="docs.html" title="Official Google Chrome Extensions documen tation">Docs</a>
84 </li>
85 <li id="faq_link">
86 <a href="faq.html" title="Answers to frequently asked questions abou t Google Chrome Extensions">FAQ</a>
87 </li>
88 <li id="samples_link">
89 <a href="samples.html" title="Sample extensions (with source code)"> Samples</a>
90 </li>
91 <li id="group_link">
92 <a href="http://groups.google.com/a/chromium.org/group/chromium-exte nsions" title="Google Chrome Extensions developer forum">Group</a>
93 </li>
94 <li id="so_link">
95 <a href="http://stackoverflow.com/questions/tagged/google-chrome-ext ension" title="[google-chrome-extension] tag on Stack Overflow">Questions?</a>
96 </li>
97 </ul>
98 </div> <!-- end gc-topnav -->
99 <div class="g-section g-tpl-170">
100 <!-- SIDENAV -->
101 <div class="g-unit g-first" id="gc-toc">
102 <ul>
103 <li><a href="getstarted.html">Getting Started</a></li>
104 <li class="leftNavSelected">Overview</li>
105 <li><a href="whats_new.html">What's New?</a></li>
106 <li><h2><a href="devguide.html">Developer's Guide</a></h2>
107 <ul>
108 <li>Browser UI
109 <ul>
110 <li><a href="browserAction.html">Browser Actions</a></li>
111 <li><a href="contextMenus.html">Context Menus</a></li>
112 <li><a href="notifications.html">Desktop Notifications</a></li >
113 <li><a href="omnibox.html">Omnibox</a></li>
114 <li><a href="options.html">Options Pages</a></li>
115 <li><a href="override.html">Override Pages</a></li>
116 <li><a href="pageAction.html">Page Actions</a></li>
117 </ul>
118 </li>
119 <li>Browser Interaction
120 <ul>
121 <li><a href="bookmarks.html">Bookmarks</a></li>
122 <li><a href="cookies.html">Cookies</a></li>
123 <li><a href="devtools.html">Developer Tools</a></li>
124 <li><a href="events.html">Events</a></li>
125 <li><a href="history.html">History</a></li>
126 <li><a href="management.html">Management</a></li>
127 <li><a href="tabs.html">Tabs</a></li>
128 <li><a href="windows.html">Windows</a></li>
129 </ul>
130 </li>
131 <li>Implementation
132 <ul>
133 <li><a href="a11y.html">Accessibility</a></li>
134 <li><a href="background_pages.html">Background Pages</a></li>
135 <li><a href="content_scripts.html">Content Scripts</a></li>
136 <li><a href="xhr.html">Cross-Origin XHR</a></li>
137 <li><a href="i18n.html">Internationalization</a></li>
138 <li><a href="messaging.html">Message Passing</a></li>
139 <li><a href="permissions.html">Optional Permissions</a></li>
140 <li><a href="npapi.html">NPAPI Plugins</a></li>
141 </ul>
142 </li>
143 <li>Finishing
144 <ul>
145 <li><a href="hosting.html">Hosting</a></li>
146 <li><a href="external_extensions.html">Other Deployment Option s</a></li>
147 </ul>
148 </li>
149 </ul>
150 </li>
151 <li><h2><a href="apps.html">Packaged Apps</a></h2></li>
152 <li><h2><a href="tutorials.html">Tutorials</a></h2>
153 <ul>
154 <li><a href="tut_debugging.html">Debugging</a></li>
155 <li><a href="tut_analytics.html">Google Analytics</a></li>
156 <li><a href="tut_oauth.html">OAuth</a></li>
157 </ul>
158 </li>
159 <li><h2>Reference</h2>
160 <ul>
161 <li>Formats
162 <ul>
163 <li><a href="manifest.html">Manifest Files</a></li>
164 <li><a href="match_patterns.html">Match Patterns</a></li>
165 </ul>
166 </li>
167 <li><a href="permission_warnings.html">Permission Warnings</a></li >
168 <li><a href="api_index.html">chrome.* APIs</a></li>
169 <li><a href="api_other.html">Other APIs</a></li>
170 </ul>
171 </li>
172 <li><h2><a href="samples.html">Samples</a></h2></li>
173 <div class="line"> </div>
174 <li><h2>More</h2>
175 <ul>
176 <li><a href="http://code.google.com/chrome/webstore/docs/index.htm l">Chrome Web Store</a></li>
177 <li><a href="http://code.google.com/chrome/apps/docs/developers_gu ide.html">Hosted Apps</a></li>
178 <li><a href="themes.html">Themes</a></li>
179 </ul>
180 </li>
181 </ul>
182 </div>
183 <script>
184 initToggles();
185 </script>
186 <div class="g-unit" id="gc-pagecontent">
187 <div id="pageTitle">
188 <h1 class="page_title">Overview</h1>
189 </div>
190 <!-- TABLE OF CONTENTS -->
191 <div id="toc">
192 <h2>Contents</h2>
193 <ol>
194 <li>
195 <a href="#what">The basics</a>
196 <ol>
197 <li>
198 <a href="#extension-ui">Extension UIs</a>
199 </li><li>
200 <a href="#packagedapp-ui">Packaged app UIs</a>
201 </li>
202 </ol>
203 </li><li>
204 <a href="#files">Files</a>
205 <ol>
206 <li>
207 <a href="#relative-urls">Referring to files</a>
208 </li><li>
209 <a href="#H3-5">The manifest file</a>
210 </li>
211 </ol>
212 </li><li>
213 <a href="#arch">Architecture</a>
214 <ol>
215 <li>
216 <a href="#background_page">The background page</a>
217 </li><li>
218 <a href="#pages">UI pages</a>
219 </li><li>
220 <a href="#contentScripts">Content scripts</a>
221 </li>
222 </ol>
223 </li><li>
224 <a href="#apis"> Using the chrome.* APIs </a>
225 <ol>
226 <li>
227 <a href="#sync"> Asynchronous vs. synchronous methods </a>
228 </li><li>
229 <a href="#sync-example"> Example: Using a callback </a>
230 </li><li>
231 <a href="#chrome-more"> More details </a>
232 </li>
233 </ol>
234 </li><li>
235 <a href="#pageComm">Communication between pages </a>
236 <ol>
237 </ol>
238 </li><li>
239 <a href="#incognito"> Saving data and incognito mode </a>
240 <ol>
241 </ol>
242 </li><li>
243 <a href="#now-what"> Now what? </a>
244 <ol>
245 </ol>
246 </li>
247 </ol>
248 </div>
249 <!-- /TABLE OF CONTENTS -->
250 <!-- Standard content lead-in for experimental API pages -->
251 <!-- STATIC CONTENT PLACEHOLDER -->
252 <div id="static"><div id="pageData-name" class="pageData">Overview</div>
253 <div id="pageData-showTOC" class="pageData">true</div>
254 <p>
255 Once you've finished this page
256 and the
257 <a href="getstarted.html">Getting Started</a> tutorial,
258 you'll be all set to start writing extensions and packaged apps.
259 </p>
260 <p class="caution">
261 <strong>Note:</strong>
262 <em>Packaged apps</em> are implemented as extensions,
263 so unless otherwise stated,
264 everything in this page applies to packaged apps.
265 </p>
266 <h2 id="what">The basics</h2>
267 <p>
268 An extension is a zipped bundle of files—HTML,
269 CSS, JavaScript, images, and anything else you need—that
270 adds functionality to the Google Chrome browser.
271 Extensions are essentially web pages,
272 and they can use all the
273 <a href="api_other.html">APIs that the browser provides to web pages</a>,
274 from XMLHttpRequest to JSON to HTML5.
275 </p>
276 <p>
277 Extensions can interact with web pages or servers using
278 <a href="content_scripts.html">content scripts</a> or
279 <a href="xhr.html">cross-origin XMLHttpRequests</a>.
280 Extensions can also interact programmatically
281 with browser features such as
282 <a href="bookmarks.html">bookmarks</a>
283 and <a href="tabs.html">tabs</a>.
284 </p>
285 <h3 id="extension-ui">Extension UIs</h3>
286 <p>
287 Many extensions—but not packaged apps—add
288 UI to Google Chrome in the form of
289 <a href="browserAction.html">browser actions</a>
290 or <a href="pageAction.html">page actions</a>.
291 Each extension can have at most one browser action or page action.
292 Choose a <b>browser action</b> when the extension is relevant to most pages.
293 Choose a <b>page action</b> when the extension's icon
294 should appear or disappear,
295 depending on the page.
296 </p>
297 <table class="columns">
298 <tbody><tr>
299 <td width="33%">
300 <img src="images/overview/browser-action.png" width="147" height="100" alt=" screenshot">
301 </td>
302 <td width="33%">
303 <img src="images/overview/page-action.png" width="147" height="100" alt="scr eenshot">
304 </td>
305 <td>
306 <img src="images/overview/browser-action-with-popup.png" width="147" height= "100" alt="screenshot">
307 </td>
308 </tr>
309 <tr>
310 <td>
311 This <a href="samples.html#gmail">mail extension</a>
312 uses a <em>browser action</em>
313 (icon in the toolbar).
314 </td>
315 <td>
316 This <a href="samples.html#mappy">map extension</a>
317 uses a <em>page action</em>
318 (icon in the address bar)
319 and <em>content script</em>
320 (code injected into a web page).
321 </td>
322 <td>
323 This <a href="samples.html#news">news extension</a>
324 features a browser action that,
325 when clicked,
326 shows a <em>popup</em>.
327 </td>
328 </tr>
329 </tbody></table>
330 <p>
331 Extensions (and packaged apps) can also present a UI in other ways,
332 such as adding to the Chrome context menu,
333 providing an options page,
334 or using a content script that changes how pages look.
335 See the <a href="devguide.html">Developer's Guide</a>
336 for a complete list of extension features,
337 with links to implementation details
338 for each one.
339 </p>
340 <h3 id="packagedapp-ui">Packaged app UIs</h3>
341 <p>
342 A packaged app usually presents its main functionality using
343 an HTML page that's bundled into the app.
344 For example, the following packaged app
345 displays a Flash file within an HTML page.
346 </p>
347 <img src="images/overview/flash-app.png" width="372" height="300" alt="screensho t">
348 <p>
349 For more information,
350 see <a href="apps.html">Packaged Apps</a>.
351 </p>
352 <h2 id="files">Files</h2>
353 <p>
354 Each extension has the following files:
355 <!-- PENDING: This could use a picture -->
356 </p>
357 <ul>
358 <li>A <b>manifest file</b></li>
359 <li>One or more <b>HTML files</b> (unless the extension is a theme)</li>
360 <li><em>Optional:</em> One or more <b>JavaScript files</b></li>
361 <li><em>Optional:</em> Any other files your extension needs—for
362 example, image files</li>
363 </ul>
364 <p>
365 While you're working on your extension,
366 you put all these files into a single folder.
367 When you distribute your extension,
368 the contents of the folder are packaged into a special ZIP file
369 that has a <code>.crx</code> suffix.
370 If you upload your extension using the
371 <a href="https://chrome.google.com/webstore/developer/dashboard">Chrome Develope r Dashboard</a>,
372 the <code>.crx</code> file is created for you.
373 For details on distributing extensions,
374 see <a href="hosting.html">Hosting</a>.
375 </p>
376 <h3 id="relative-urls">Referring to files</h3>
377 <p>
378 You can put any file you like into an extension,
379 but how do you use it?
380 Usually,
381 you can refer to the file using a relative URL,
382 just as you would in an ordinary HTML page.
383 Here's an example of referring to
384 a file named <code>myimage.png</code>
385 that's in a subfolder named <code>images</code>.
386 </p>
387 <pre>&lt;img <b>src="images/myimage.png"</b>&gt;
388 </pre>
389 <p>
390 As you might notice while you use the Google Chrome debugger,
391 every file in an extension is also accessible by an absolute URL like this:
392 </p>
393 <blockquote>
394 <b>chrome-extension://</b><em>&lt;extensionID&gt;</em><b>/</b><em>&lt;pathToFile &gt;</em>
395 </blockquote>
396 <p>
397 In that URL, the <em>&lt;extensionID&gt;</em> is a unique identifier
398 that the extension system generates for each extension.
399 You can see the IDs for all your loaded extensions
400 by going to the URL <b>chrome://extensions</b>.
401 The <em>&lt;pathToFile&gt;</em> is the location of the file
402 under the extension's top folder;
403 it's the same as the relative URL.
404 </p>
405 <p>
406 While you're working on an extension
407 (before it's packaged),
408 the extension ID can change.
409 Specifically, the ID of an unpacked extension will change
410 if you load the extension from a different directory;
411 the ID will change again when you package the extension.
412 If your extension's code
413 needs to specify the full path to a file within the extension,
414 you can use the <code>@@extension_id</code>
415 <a href="i18n.html#overview-predefined">predefined message</a>
416 to avoid hardcoding the ID during development.
417 </p>
418 <p>
419 When you package an extension
420 (typically, by uploading it with the dashboard),
421 the extension gets a permanent ID,
422 which remains the same even after you update the extension.
423 Once the extension ID is permanent,
424 you can change all occurrences of
425 <code>@@extension_id</code> to use the real ID.
426 </p>
427 <a name="H3-5"></a><h3>The manifest file</h3>
428 <p>
429 The manifest file, called <code>manifest.json</code>,
430 gives information about the extension,
431 such as the most important files
432 and the capabilities that the extension might use.
433 Here's a typical manifest file for a browser action
434 that uses information from google.com:
435 </p>
436 <pre>{
437 "name": "My Extension",
438 "version": "2.1",
439 "description": "Gets information from Google.",
440 "icons": { "128": "icon_128.png" },
441 "background": {
442 "scripts": ["bg.js"]
443 },
444 "permissions": ["http://*.google.com/", "https://*.google.com/"],
445 "browser_action": {
446 "default_title": "",
447 "default_icon": "icon_19.png",
448 "default_popup": "popup.html"
449 }
450 }</pre>
451 <p>
452 For details, see
453 <a href="manifest.html">Manifest Files</a>.
454 </p>
455 <h2 id="arch">Architecture</h2>
456 <p>
457 Many extensions have a <em>background page</em>,
458 an invisible page
459 that holds the main logic of the extension.
460 An extension can also contain other pages
461 that present the extension's UI.
462 If an extension needs to interact with web pages that the user loads
463 (as opposed to pages that are included in the extension),
464 then the extension must use a content script.
465 </p>
466 <h3 id="background_page">The background page</h3>
467 <p>
468 The following figure shows a browser
469 that has at least two extensions installed:
470 a browser action (yellow icon)
471 and a page action (blue icon).
472 Both the browser action and the page action
473 have background pages.
474 This figure shows the browser action's background page,
475 which is defined by <code>background.html</code>
476 and has JavaScript code that controls
477 the behavior of the browser action in both windows.
478 </p>
479 <img src="images/overview/arch-1.gif" width="232" height="168" alt="Two windows and a box representing a background page (background.html). One window has a yel low icon; the other has both a yellow icon and a blue icon. The yellow icons are connected to the background page.">
480 <p>
481 Although background pages can be useful,
482 don't use one if you don't need it.
483 Background pages are always open,
484 so when a user installs many extensions that have background pages,
485 Chrome's performance can suffer.
486 </p>
487 <!-- PENDING: Perhaps show a picture of many background page processes.
488 This could build on a figure that shows the process architecture,
489 and perhaps the differences between packaged apps and extensions. -->
490 <p>
491 Here are some examples of extensions that usually
492 <em>do not need</em> a background page:
493 </p>
494 <ul>
495 <li> An extension with a browser action that
496 presents its UI solely through a popup
497 (and perhaps an options page).
498 </li>
499 <li>
500 An extension that provides an <em>override page</em>—a
501 page that replaces a standard Chrome page.
502 </li>
503 <li>
504 An extension with a content script
505 that <em>doesn't use</em> localStorage or
506 <a href="#apis">extension APIs</a>.
507 </li>
508 <li>
509 An extension that has no UI except for an options page.
510 </li>
511 </ul>
512 <p>
513 See <a href="background_pages.html">Background Pages</a>
514 for more details.
515 </p>
516 <h3 id="pages">UI pages</h3>
517 <p>
518 Extensions can contain ordinary HTML pages that display the extension's UI.
519 For example, a browser action can have a popup,
520 which is implemented by an HTML file.
521 Any extension can have an options page,
522 which lets users customize how the extension works.
523 Another type of special page is the override page.
524 And finally, you can
525 use <a href="tabs.html#method-create">chrome.tabs.create()</a>
526 or <code>window.open()</code>
527 to display any other HTML files that are in the extension.
528 </p>
529 <p>
530 The HTML pages inside an extension
531 have complete access to each other's DOMs,
532 and they can invoke functions on each other.
533 </p>
534 <!-- PENDING: Change the following example and figure
535 to use something that's not a popup?
536 (It might lead people to think that popups need background pages.) -->
537 <p>
538 The following figure shows the architecture
539 of a browser action's popup.
540 The popup's contents are a web page
541 defined by an HTML file
542 (<code>popup.html</code>).
543 This extension also happens to have a background page
544 (<code>background.html</code>).
545 The popup doesn't need to duplicate code
546 that's in the background page
547 because the popup can invoke functions on the background page.
548 </p>
549 <img src="images/overview/arch-2.gif" width="256" height="168" alt="A browser wi ndow containing a browser action that's displaying a popup. The popup's HTML fil e (popup.html) can communicate with the extension's background page (background. html).">
550 <p>
551 See <a href="browserAction.html">Browser Actions</a>,
552 <a href="options.html">Options</a>,
553 <a href="override.html">Override Pages</a>,
554 and the <a href="#pageComm">Communication between pages</a> section
555 for more details.
556 </p>
557 <h3 id="contentScripts">Content scripts</h3>
558 <p>
559 If your extension needs to interact with web pages,
560 then it needs a <em>content script</em>.
561 A content script is some JavaScript
562 that executes in the context of a page
563 that's been loaded into the browser.
564 Think of a content script as part of that loaded page,
565 not as part of the extension it was packaged with
566 (its <em>parent extension</em>).
567 </p>
568 <!-- [PENDING: Consider explaining that the reason content scripts are separated from the extension is due to chrome's multiprocess design. Something like:
569 Each extension runs in its own process.
570 To have rich interaction with a web page, however,
571 the extension must be able to
572 run some code in the web page's process.
573 Extensions accomplish this with content scripts.]
574 -->
575 <p>
576 Content scripts can read details of the web pages the browser visits,
577 and they can make changes to the pages.
578 In the following figure,
579 the content script
580 can read and modify
581 the DOM for the displayed web page.
582 It cannot, however, modify the DOM of its parent extension's background page.
583 </p>
584 <img src="images/overview/arch-3.gif" width="238" height="169" alt="A browser wi ndow with a browser action (controlled by background.html) and a content script (controlled by contentscript.js).">
585 <p>
586 Content scripts aren't completely cut off from their parent extensions.
587 A content script can exchange messages with its parent extension,
588 as the arrows in the following figure show.
589 For example, a content script might send a message
590 whenever it finds an RSS feed in a browser page.
591 Or a background page might send a message
592 asking a content script to change the appearance of its browser page.
593 </p>
594 <img src="images/overview/arch-cs.gif" width="238" height="194" alt="Like the pr evious figure, but showing more of the parent extension's files, as well as a co mmunication path between the content script and the parent extension.">
595 <!-- [PENDING: Add overview of message passing.] -->
596 <p>
597 For more information,
598 see <a href="content_scripts.html">Content Scripts</a>.
599 </p>
600 <h2 id="apis"> Using the chrome.* APIs </h2>
601 <p>
602 In addition to having access to all the APIs that web pages and apps can use,
603 extensions can also use Chrome-only APIs
604 (often called <em>chrome.* APIs</em>)
605 that allow tight integration with the browser.
606 For example, any extension or web app can use the
607 standard <code>window.open()</code> method to open a URL.
608 But if you want to specify which window that URL should be displayed in,
609 your extension can use the Chrome-only
610 <a href="tabs.html#method-create">chrome.tabs.create()</a>
611 method instead.
612 </p>
613 <h3 id="sync"> Asynchronous vs. synchronous methods </h3>
614 <p>
615 Most methods in the chrome.* APIs are <b>asynchronous</b>:
616 they return immediately, without waiting for the operation to finish.
617 If you need to know the outcome of that operation,
618 then you pass a callback function into the method.
619 That callback is executed later (potentially <em>much</em> later),
620 sometime after the method returns.
621 Here's an example of the signature for an asynchronous method:
622 </p>
623 <p>
624 <code>
625 chrome.tabs.create(object <em>createProperties</em>, function <em>callback</em>)
626 </code>
627 </p>
628 <p>
629 Other chrome.* methods are <b>synchronous</b>.
630 Synchronous methods never have a callback
631 because they don't return until they've completed all their work.
632 Often, synchronous methods have a return type.
633 Consider the
634 <a href="extension.html#method-getBackgroundPage">chrome.extensions.getBackgroun dPage()</a> method:
635 </p>
636 <p>
637 <code>
638 Window chrome.extension.getBackgroundPage()
639 </code>
640 </p>
641 <p>
642 This method has no callback and a return type of <code>Window</code>
643 because it synchronously returns the background page
644 and performs no other, asynchronous work.
645 </p>
646 <h3 id="sync-example"> Example: Using a callback </h3>
647 <p>
648 Say you want to navigate
649 the user's currently selected tab to a new URL.
650 To do this, you need to get the current tab's ID
651 (using <a href="tabs.html#method-getSelected">chrome.tabs.getSelected()</a>)
652 and then make that tab go to the new URL
653 (using <a href="tabs.html#method-update">chrome.tabs.update()</a>).
654 </p>
655 <p>
656 If <code>getSelected()</code> were synchronous,
657 you might write code like this:
658 </p>
659 <pre> <b>//THIS CODE DOESN'T WORK</b>
660 <span class="linenumber">1: </span>var tab = chrome.tabs.getSelected(null); <b>/ /WRONG!!!</b>
661 <span class="linenumber">2: </span>chrome.tabs.update(tab.id, {url:newUrl});
662 <span class="linenumber">3: </span>someOtherFunction();
663 </pre>
664 <p>
665 That approach fails
666 because <code>getSelected()</code> is asynchronous.
667 It returns without waiting for its work to complete,
668 and it doesn't even return a value
669 (although some asynchronous methods do).
670 You can tell that <code>getSelected()</code> is asynchronous
671 by the <em>callback</em> parameter in its signature:
672 </p><p>
673 <code>
674 chrome.tabs.getSelected(integer <em>windowId</em>, function <em>callback</em>)
675 </code>
676 </p>
677 <p>
678 To fix the preceding code,
679 you must use that callback parameter.
680 The following code shows
681 how to define a callback function
682 that gets the results from <code>getSelected()</code>
683 (as a parameter named <code>tab</code>)
684 and calls <code>update()</code>.
685 </p>
686 <pre> <b>//THIS CODE WORKS</b>
687 <span class="linenumber">1: </span>chrome.tabs.getSelected(null, <b>function(tab ) {</b>
688 <span class="linenumber">2: </span> chrome.tabs.update(tab.id, {url:newUrl});
689 <span class="linenumber">3: </span><b>}</b>);
690 <span class="linenumber">4: </span>someOtherFunction();
691 </pre>
692 <p>
693 In this example, the lines are executed in the following order: 1, 4, 2.
694 The callback function specified to <code>getSelected</code> is called
695 (and line 2 executed)
696 only after information about the currently selected tab is available,
697 which is sometime after <code>getSelected()</code> returns.
698 Although <code>update()</code> is asynchronous,
699 this example doesn't use its callback parameter,
700 since we don't do anything about the results of the update.
701 </p>
702 <h3 id="chrome-more"> More details </h3>
703 <p>
704 For more information, see the
705 <a href="api_index.html">chrome.* API docs</a>
706 and watch this video:
707 </p>
708 <p>
709 <iframe title="YouTube video player" width="640" height="390" src="http://www.yo utube.com/embed/bmxr75CV36A?rel=0" frameborder="0" allowfullscreen=""></iframe>
710 </p>
711 <h2 id="pageComm">Communication between pages </h2>
712 <p>
713 The HTML pages within an extension often need to communicate.
714 <!-- [PENDING: For example, ...] -->
715 Because all of an extension's pages
716 execute in same process on the same thread,
717 the pages can make direct function calls to each other.
718 </p>
719 <p>
720 To find pages in the extension, use
721 <a href="extension.html"><code>chrome.extension</code></a>
722 methods such as
723 <code>getViews()</code> and
724 <code>getBackgroundPage()</code>.
725 Once a page has a reference to other pages within the extension,
726 the first page can invoke functions on the other pages,
727 and it can manipulate their DOMs.
728 </p>
729 <!-- [PENDING: Here's an example of communication between xyz and the background page. (code example goes here)] -->
730 <h2 id="incognito"> Saving data and incognito mode </h2>
731 <p>
732 Extensions can save data using
733 the HTML5 <a href="http://dev.w3.org/html5/webstorage/">web storage API</a>
734 (such as <code>localStorage</code>)
735 or by making server requests that result in saving data.
736 Whenever you want to save something,
737 first consider whether it's
738 from a window that's in incognito mode.
739 By default, extensions don't run in incognito windows,
740 and packaged apps <em>do</em>.
741 You need to consider what a user expects
742 from your extension or packaged app
743 when the browser is incognito.
744 </p>
745 <p>
746 <em>Incognito mode</em> promises that the window will leave no tracks.
747 When dealing with data from incognito windows,
748 do your best to honor this promise.
749 For example, if your extension normally
750 saves browsing history to the cloud,
751 don't save history from incognito windows.
752 On the other hand, you can store
753 your extension's settings from any window,
754 incognito or not.
755 </p>
756 <p class="note">
757 <b>Rule of thumb:</b>
758 If a piece of data might show where a user
759 has been on the web or what the user has done,
760 don't store it if it's from an incognito window.
761 </p>
762 <p>
763 To detect whether a window is in incognito mode,
764 check the <code>incognito</code> property of the relevant
765 <a href="tabs.html#type-Tab">Tab</a> or
766 <a href="windows.html#type-Window">Window</a> object.
767 For example:
768 </p>
769 <pre>var bgPage = chrome.extension.getBackgroundPage();
770 function saveTabData(tab, data) {
771 if (tab.incognito) {
772 bgPage[tab.url] = data; // Persist data ONLY in memory
773 } else {
774 localStorage[tab.url] = data; // OK to store data
775 }
776 </pre>
777 <h2 id="now-what"> Now what? </h2>
778 <p>
779 Now that you've been introduced to extensions,
780 you should be ready to write your own.
781 Here are some ideas for where to go next:
782 </p>
783 <ul>
784 <li> <a href="getstarted.html">Tutorial: Getting Started</a> </li>
785 <li> <a href="tut_debugging.html">Tutorial: Debugging</a> </li>
786 <li> <a href="devguide.html">Developer's Guide</a> </li>
787 <li> <a href="http://dev.chromium.org/developers/design-documents/extensions/s amples">Samples</a> </li>
788 <li> <a href="http://www.youtube.com/view_play_list?p=CA101D6A85FE9D4B">Videos </a>,
789 such as
790 <a href="http://www.youtube.com/watch?v=B4M_a7xejYI&amp;feature=PlayList&amp ;p=CA101D6A85FE9D4B&amp;index=6">Extension Message Passing</a>
791 </li>
792 </ul>
793 </div>
794 <!-- API PAGE -->
795 <!-- /apiPage -->
796 </div> <!-- /gc-pagecontent -->
797 </div> <!-- /g-section -->
798 </div> <!-- /codesiteContent -->
799 <div id="gc-footer" --="">
800 <div class="text">
801 <p>
802 Except as otherwise <a href="http://code.google.com/policies.html#restrictions ">noted</a>,
803 the content of this page is licensed under the <a rel="license" href="http://c reativecommons.org/licenses/by/3.0/">Creative Commons
804 Attribution 3.0 License</a>, and code samples are licensed under the
805 <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD Lic ense</a>.
806 </p>
807 <p>
808 ©2011 Google
809 </p>
810 <!-- begin analytics -->
811 <script src="https://www.google-analytics.com/urchin.js" type="text/javascript"> </script>
812 <script src="https://www.google-analytics.com/ga.js" type="text/javascript"></sc ript>
813 <script type="text/javascript">
814 // chrome doc tracking
815 try {
816 var engdocs = _gat._getTracker("YT-10763712-2");
817 engdocs._trackPageview();
818 } catch(err) {}
819 // code.google.com site-wide tracking
820 try {
821 _uacct="UA-18071-1";
822 _uanchor=1;
823 _uff=0;
824 urchinTracker();
825 }
826 catch(e) {/* urchinTracker not available. */}
827 </script>
828 <!-- end analytics -->
829 </div>
830 </div> <!-- /gc-footer -->
831 </div> <!-- /gc-container -->
832 </body></html>
OLDNEW
« no previous file with comments | « chrome/common/extensions/docs/override.html ('k') | chrome/common/extensions/docs/packaging.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698