Index: chrome/common/extensions/docs/overview.html |
diff --git a/chrome/common/extensions/docs/overview.html b/chrome/common/extensions/docs/overview.html |
deleted file mode 100644 |
index c919dd368480367c8c798f3d4926f653f1d22676..0000000000000000000000000000000000000000 |
--- a/chrome/common/extensions/docs/overview.html |
+++ /dev/null |
@@ -1,832 +0,0 @@ |
-<!DOCTYPE html><!-- This page is a placeholder for generated extensions api doc. Note: |
- 1) The <head> information in this page is significant, should be uniform |
- across api docs and should be edited only with knowledge of the |
- templating mechanism. |
- 3) All <body>.innerHTML is genereated as an rendering step. If viewed in a |
- browser, it will be re-generated from the template, json schema and |
- authored overview content. |
- 4) The <body>.innerHTML is also generated by an offline step so that this |
- page may easily be indexed by search engines. |
---><html xmlns="http://www.w3.org/1999/xhtml"><head> |
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
- <link href="css/ApiRefStyles.css" rel="stylesheet" type="text/css"> |
- <link href="css/print.css" rel="stylesheet" type="text/css" media="print"> |
- <script type="text/javascript" src="../../../third_party/jstemplate/jstemplate_compiled.js"> |
- </script> |
- <script type="text/javascript" src="../../../../third_party/json_minify/minify-sans-regexp.js"> |
- </script> |
- <script type="text/javascript" src="js/api_page_generator.js"></script> |
- <script type="text/javascript" src="js/bootstrap.js"></script> |
- <script type="text/javascript" src="js/sidebar.js"></script> |
- <title>Overview - Google Chrome Extensions - Google Code</title></head> |
- <body> <div id="devModeWarning" class="displayModeWarning"> |
- 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. |
- </div> |
- <div id="branchWarning" class="displayModeWarning"> |
- <span>WARNING: This is the <span id="branchName">BETA</span> documentation. |
- It may not work with the stable release of Chrome.</span> |
- <select id="branchChooser"> |
- <option>Choose a different version... |
- </option><option value="">Stable |
- </option><option value="beta">Beta |
- </option><option value="dev">Dev |
- </option><option value="trunk">Trunk |
- </option></select> |
- </div> |
- <div id="unofficialWarning" class="displayModeWarning"> |
- <span>WARNING: This is unofficial documentation. It may not work with the |
- current release of Chrome.</span> |
- <button id="goToOfficialDocs">Go to the official docs</button> |
- </div> |
- <div id="gc-container" class="labs"> |
- <!-- SUBTEMPLATES: DO NOT MOVE FROM THIS LOCATION --> |
- <!-- In particular, sub-templates that recurse, must be used by allowing |
- jstemplate to make a copy of the template in this section which |
- are not operated on by way of the jsskip="true" --> |
- <!-- /SUBTEMPLATES --> |
- <a id="top"></a> |
- <div id="skipto"> |
- <a href="#gc-pagecontent">Skip to page content</a> |
- <a href="#gc-toc">Skip to main navigation</a> |
- </div> |
- <!-- API HEADER --> |
- <table id="header" width="100%" cellspacing="0" border="0"> |
- <tbody><tr> |
- <td valign="middle"><a href="http://code.google.com/"><img src="images/code_labs_logo.gif" height="43" width="161" alt="Google Code Labs" style="border:0; margin:0;"></a></td> |
- <td valign="middle" width="100%" style="padding-left:0.6em;"> |
- <form action="http://www.google.com/cse" id="cse" style="margin-top:0.5em"> |
- <div id="gsc-search-box"> |
- <input type="hidden" name="cx" value="002967670403910741006:61_cvzfqtno"> |
- <input type="hidden" name="ie" value="UTF-8"> |
- <input type="text" name="q" value="" size="55"> |
- <input class="gsc-search-button" type="submit" name="sa" value="Search"> |
- <br> |
- <span class="greytext">e.g. "page action" or "tabs"</span> |
- </div> |
- </form> |
- <script type="text/javascript" src="https://www.google.com/jsapi"></script> |
- <script type="text/javascript">google.load("elements", "1", {packages: "transliteration"});</script> |
- <script type="text/javascript" src="https://www.google.com/coop/cse/t13n?form=cse&t13n_langs=en"></script> |
- <script type="text/javascript" src="https://www.google.com/coop/cse/brand?form=cse&lang=en"></script> |
- </td> |
- </tr> |
- </tbody></table> |
- <div id="codesiteContent" class=""> |
- <a id="gc-topnav-anchor"></a> |
- <div id="gc-topnav"> |
- <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</h1> |
- <ul id="home" class="gc-topnav-tabs"> |
- <li id="home_link"> |
- <a href="index.html" title="Google Chrome Extensions home page">Home</a> |
- </li> |
- <li id="docs_link"> |
- <a href="docs.html" title="Official Google Chrome Extensions documentation">Docs</a> |
- </li> |
- <li id="faq_link"> |
- <a href="faq.html" title="Answers to frequently asked questions about Google Chrome Extensions">FAQ</a> |
- </li> |
- <li id="samples_link"> |
- <a href="samples.html" title="Sample extensions (with source code)">Samples</a> |
- </li> |
- <li id="group_link"> |
- <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions" title="Google Chrome Extensions developer forum">Group</a> |
- </li> |
- <li id="so_link"> |
- <a href="http://stackoverflow.com/questions/tagged/google-chrome-extension" title="[google-chrome-extension] tag on Stack Overflow">Questions?</a> |
- </li> |
- </ul> |
- </div> <!-- end gc-topnav --> |
- <div class="g-section g-tpl-170"> |
- <!-- SIDENAV --> |
- <div class="g-unit g-first" id="gc-toc"> |
- <ul> |
- <li><a href="getstarted.html">Getting Started</a></li> |
- <li class="leftNavSelected">Overview</li> |
- <li><a href="whats_new.html">What's New?</a></li> |
- <li><h2><a href="devguide.html">Developer's Guide</a></h2> |
- <ul> |
- <li>Browser UI |
- <ul> |
- <li><a href="browserAction.html">Browser Actions</a></li> |
- <li><a href="contextMenus.html">Context Menus</a></li> |
- <li><a href="notifications.html">Desktop Notifications</a></li> |
- <li><a href="omnibox.html">Omnibox</a></li> |
- <li><a href="options.html">Options Pages</a></li> |
- <li><a href="override.html">Override Pages</a></li> |
- <li><a href="pageAction.html">Page Actions</a></li> |
- </ul> |
- </li> |
- <li>Browser Interaction |
- <ul> |
- <li><a href="bookmarks.html">Bookmarks</a></li> |
- <li><a href="cookies.html">Cookies</a></li> |
- <li><a href="devtools.html">Developer Tools</a></li> |
- <li><a href="events.html">Events</a></li> |
- <li><a href="history.html">History</a></li> |
- <li><a href="management.html">Management</a></li> |
- <li><a href="tabs.html">Tabs</a></li> |
- <li><a href="windows.html">Windows</a></li> |
- </ul> |
- </li> |
- <li>Implementation |
- <ul> |
- <li><a href="a11y.html">Accessibility</a></li> |
- <li><a href="background_pages.html">Background Pages</a></li> |
- <li><a href="content_scripts.html">Content Scripts</a></li> |
- <li><a href="xhr.html">Cross-Origin XHR</a></li> |
- <li><a href="i18n.html">Internationalization</a></li> |
- <li><a href="messaging.html">Message Passing</a></li> |
- <li><a href="permissions.html">Optional Permissions</a></li> |
- <li><a href="npapi.html">NPAPI Plugins</a></li> |
- </ul> |
- </li> |
- <li>Finishing |
- <ul> |
- <li><a href="hosting.html">Hosting</a></li> |
- <li><a href="external_extensions.html">Other Deployment Options</a></li> |
- </ul> |
- </li> |
- </ul> |
- </li> |
- <li><h2><a href="apps.html">Packaged Apps</a></h2></li> |
- <li><h2><a href="tutorials.html">Tutorials</a></h2> |
- <ul> |
- <li><a href="tut_debugging.html">Debugging</a></li> |
- <li><a href="tut_analytics.html">Google Analytics</a></li> |
- <li><a href="tut_oauth.html">OAuth</a></li> |
- </ul> |
- </li> |
- <li><h2>Reference</h2> |
- <ul> |
- <li>Formats |
- <ul> |
- <li><a href="manifest.html">Manifest Files</a></li> |
- <li><a href="match_patterns.html">Match Patterns</a></li> |
- </ul> |
- </li> |
- <li><a href="permission_warnings.html">Permission Warnings</a></li> |
- <li><a href="api_index.html">chrome.* APIs</a></li> |
- <li><a href="api_other.html">Other APIs</a></li> |
- </ul> |
- </li> |
- <li><h2><a href="samples.html">Samples</a></h2></li> |
- <div class="line"> </div> |
- <li><h2>More</h2> |
- <ul> |
- <li><a href="http://code.google.com/chrome/webstore/docs/index.html">Chrome Web Store</a></li> |
- <li><a href="http://code.google.com/chrome/apps/docs/developers_guide.html">Hosted Apps</a></li> |
- <li><a href="themes.html">Themes</a></li> |
- </ul> |
- </li> |
- </ul> |
- </div> |
- <script> |
- initToggles(); |
- </script> |
- <div class="g-unit" id="gc-pagecontent"> |
- <div id="pageTitle"> |
- <h1 class="page_title">Overview</h1> |
- </div> |
- <!-- TABLE OF CONTENTS --> |
- <div id="toc"> |
- <h2>Contents</h2> |
- <ol> |
- <li> |
- <a href="#what">The basics</a> |
- <ol> |
- <li> |
- <a href="#extension-ui">Extension UIs</a> |
- </li><li> |
- <a href="#packagedapp-ui">Packaged app UIs</a> |
- </li> |
- </ol> |
- </li><li> |
- <a href="#files">Files</a> |
- <ol> |
- <li> |
- <a href="#relative-urls">Referring to files</a> |
- </li><li> |
- <a href="#H3-5">The manifest file</a> |
- </li> |
- </ol> |
- </li><li> |
- <a href="#arch">Architecture</a> |
- <ol> |
- <li> |
- <a href="#background_page">The background page</a> |
- </li><li> |
- <a href="#pages">UI pages</a> |
- </li><li> |
- <a href="#contentScripts">Content scripts</a> |
- </li> |
- </ol> |
- </li><li> |
- <a href="#apis"> Using the chrome.* APIs </a> |
- <ol> |
- <li> |
- <a href="#sync"> Asynchronous vs. synchronous methods </a> |
- </li><li> |
- <a href="#sync-example"> Example: Using a callback </a> |
- </li><li> |
- <a href="#chrome-more"> More details </a> |
- </li> |
- </ol> |
- </li><li> |
- <a href="#pageComm">Communication between pages </a> |
- <ol> |
- </ol> |
- </li><li> |
- <a href="#incognito"> Saving data and incognito mode </a> |
- <ol> |
- </ol> |
- </li><li> |
- <a href="#now-what"> Now what? </a> |
- <ol> |
- </ol> |
- </li> |
- </ol> |
- </div> |
- <!-- /TABLE OF CONTENTS --> |
- <!-- Standard content lead-in for experimental API pages --> |
- <!-- STATIC CONTENT PLACEHOLDER --> |
- <div id="static"><div id="pageData-name" class="pageData">Overview</div> |
-<div id="pageData-showTOC" class="pageData">true</div> |
-<p> |
-Once you've finished this page |
-and the |
-<a href="getstarted.html">Getting Started</a> tutorial, |
-you'll be all set to start writing extensions and packaged apps. |
-</p> |
-<p class="caution"> |
-<strong>Note:</strong> |
-<em>Packaged apps</em> are implemented as extensions, |
-so unless otherwise stated, |
-everything in this page applies to packaged apps. |
-</p> |
-<h2 id="what">The basics</h2> |
-<p> |
-An extension is a zipped bundle of files—HTML, |
-CSS, JavaScript, images, and anything else you need—that |
-adds functionality to the Google Chrome browser. |
-Extensions are essentially web pages, |
-and they can use all the |
-<a href="api_other.html">APIs that the browser provides to web pages</a>, |
-from XMLHttpRequest to JSON to HTML5. |
-</p> |
-<p> |
-Extensions can interact with web pages or servers using |
-<a href="content_scripts.html">content scripts</a> or |
-<a href="xhr.html">cross-origin XMLHttpRequests</a>. |
-Extensions can also interact programmatically |
-with browser features such as |
-<a href="bookmarks.html">bookmarks</a> |
-and <a href="tabs.html">tabs</a>. |
-</p> |
-<h3 id="extension-ui">Extension UIs</h3> |
-<p> |
-Many extensions—but not packaged apps—add |
-UI to Google Chrome in the form of |
-<a href="browserAction.html">browser actions</a> |
-or <a href="pageAction.html">page actions</a>. |
-Each extension can have at most one browser action or page action. |
-Choose a <b>browser action</b> when the extension is relevant to most pages. |
-Choose a <b>page action</b> when the extension's icon |
-should appear or disappear, |
-depending on the page. |
-</p> |
-<table class="columns"> |
-<tbody><tr> |
- <td width="33%"> |
- <img src="images/overview/browser-action.png" width="147" height="100" alt="screenshot"> |
- </td> |
- <td width="33%"> |
- <img src="images/overview/page-action.png" width="147" height="100" alt="screenshot"> |
- </td> |
- <td> |
- <img src="images/overview/browser-action-with-popup.png" width="147" height="100" alt="screenshot"> |
- </td> |
-</tr> |
-<tr> |
- <td> |
- This <a href="samples.html#gmail">mail extension</a> |
- uses a <em>browser action</em> |
- (icon in the toolbar). |
- </td> |
- <td> |
- This <a href="samples.html#mappy">map extension</a> |
- uses a <em>page action</em> |
- (icon in the address bar) |
- and <em>content script</em> |
- (code injected into a web page). |
- </td> |
- <td> |
- This <a href="samples.html#news">news extension</a> |
- features a browser action that, |
- when clicked, |
- shows a <em>popup</em>. |
- </td> |
-</tr> |
-</tbody></table> |
-<p> |
-Extensions (and packaged apps) can also present a UI in other ways, |
-such as adding to the Chrome context menu, |
-providing an options page, |
-or using a content script that changes how pages look. |
-See the <a href="devguide.html">Developer's Guide</a> |
-for a complete list of extension features, |
-with links to implementation details |
-for each one. |
-</p> |
-<h3 id="packagedapp-ui">Packaged app UIs</h3> |
-<p> |
-A packaged app usually presents its main functionality using |
-an HTML page that's bundled into the app. |
-For example, the following packaged app |
-displays a Flash file within an HTML page. |
-</p> |
-<img src="images/overview/flash-app.png" width="372" height="300" alt="screenshot"> |
-<p> |
-For more information, |
-see <a href="apps.html">Packaged Apps</a>. |
-</p> |
-<h2 id="files">Files</h2> |
-<p> |
-Each extension has the following files: |
-<!-- PENDING: This could use a picture --> |
-</p> |
-<ul> |
- <li>A <b>manifest file</b></li> |
- <li>One or more <b>HTML files</b> (unless the extension is a theme)</li> |
- <li><em>Optional:</em> One or more <b>JavaScript files</b></li> |
- <li><em>Optional:</em> Any other files your extension needs—for |
- example, image files</li> |
-</ul> |
-<p> |
-While you're working on your extension, |
-you put all these files into a single folder. |
-When you distribute your extension, |
-the contents of the folder are packaged into a special ZIP file |
-that has a <code>.crx</code> suffix. |
-If you upload your extension using the |
-<a href="https://chrome.google.com/webstore/developer/dashboard">Chrome Developer Dashboard</a>, |
-the <code>.crx</code> file is created for you. |
-For details on distributing extensions, |
-see <a href="hosting.html">Hosting</a>. |
-</p> |
-<h3 id="relative-urls">Referring to files</h3> |
-<p> |
-You can put any file you like into an extension, |
-but how do you use it? |
-Usually, |
-you can refer to the file using a relative URL, |
-just as you would in an ordinary HTML page. |
-Here's an example of referring to |
-a file named <code>myimage.png</code> |
-that's in a subfolder named <code>images</code>. |
-</p> |
-<pre><img <b>src="images/myimage.png"</b>> |
-</pre> |
-<p> |
-As you might notice while you use the Google Chrome debugger, |
-every file in an extension is also accessible by an absolute URL like this: |
-</p> |
-<blockquote> |
-<b>chrome-extension://</b><em><extensionID></em><b>/</b><em><pathToFile></em> |
-</blockquote> |
-<p> |
-In that URL, the <em><extensionID></em> is a unique identifier |
-that the extension system generates for each extension. |
-You can see the IDs for all your loaded extensions |
-by going to the URL <b>chrome://extensions</b>. |
-The <em><pathToFile></em> is the location of the file |
-under the extension's top folder; |
-it's the same as the relative URL. |
-</p> |
-<p> |
-While you're working on an extension |
-(before it's packaged), |
-the extension ID can change. |
-Specifically, the ID of an unpacked extension will change |
-if you load the extension from a different directory; |
-the ID will change again when you package the extension. |
-If your extension's code |
-needs to specify the full path to a file within the extension, |
-you can use the <code>@@extension_id</code> |
-<a href="i18n.html#overview-predefined">predefined message</a> |
-to avoid hardcoding the ID during development. |
-</p> |
-<p> |
-When you package an extension |
-(typically, by uploading it with the dashboard), |
-the extension gets a permanent ID, |
-which remains the same even after you update the extension. |
-Once the extension ID is permanent, |
-you can change all occurrences of |
-<code>@@extension_id</code> to use the real ID. |
-</p> |
-<a name="H3-5"></a><h3>The manifest file</h3> |
-<p> |
-The manifest file, called <code>manifest.json</code>, |
-gives information about the extension, |
-such as the most important files |
-and the capabilities that the extension might use. |
-Here's a typical manifest file for a browser action |
-that uses information from google.com: |
-</p> |
-<pre>{ |
- "name": "My Extension", |
- "version": "2.1", |
- "description": "Gets information from Google.", |
- "icons": { "128": "icon_128.png" }, |
- "background": { |
- "scripts": ["bg.js"] |
- }, |
- "permissions": ["http://*.google.com/", "https://*.google.com/"], |
- "browser_action": { |
- "default_title": "", |
- "default_icon": "icon_19.png", |
- "default_popup": "popup.html" |
- } |
-}</pre> |
-<p> |
-For details, see |
-<a href="manifest.html">Manifest Files</a>. |
-</p> |
-<h2 id="arch">Architecture</h2> |
-<p> |
-Many extensions have a <em>background page</em>, |
-an invisible page |
-that holds the main logic of the extension. |
-An extension can also contain other pages |
-that present the extension's UI. |
-If an extension needs to interact with web pages that the user loads |
-(as opposed to pages that are included in the extension), |
-then the extension must use a content script. |
-</p> |
-<h3 id="background_page">The background page</h3> |
-<p> |
-The following figure shows a browser |
-that has at least two extensions installed: |
-a browser action (yellow icon) |
-and a page action (blue icon). |
-Both the browser action and the page action |
-have background pages. |
-This figure shows the browser action's background page, |
-which is defined by <code>background.html</code> |
-and has JavaScript code that controls |
-the behavior of the browser action in both windows. |
-</p> |
-<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 yellow icon; the other has both a yellow icon and a blue icon. The yellow icons are connected to the background page."> |
-<p> |
-Although background pages can be useful, |
-don't use one if you don't need it. |
-Background pages are always open, |
-so when a user installs many extensions that have background pages, |
-Chrome's performance can suffer. |
-</p> |
-<!-- PENDING: Perhaps show a picture of many background page processes. |
- This could build on a figure that shows the process architecture, |
- and perhaps the differences between packaged apps and extensions. --> |
-<p> |
-Here are some examples of extensions that usually |
-<em>do not need</em> a background page: |
-</p> |
-<ul> |
- <li> An extension with a browser action that |
- presents its UI solely through a popup |
- (and perhaps an options page). |
- </li> |
- <li> |
- An extension that provides an <em>override page</em>—a |
- page that replaces a standard Chrome page. |
- </li> |
- <li> |
- An extension with a content script |
- that <em>doesn't use</em> localStorage or |
- <a href="#apis">extension APIs</a>. |
- </li> |
- <li> |
- An extension that has no UI except for an options page. |
- </li> |
-</ul> |
-<p> |
-See <a href="background_pages.html">Background Pages</a> |
-for more details. |
-</p> |
-<h3 id="pages">UI pages</h3> |
-<p> |
-Extensions can contain ordinary HTML pages that display the extension's UI. |
-For example, a browser action can have a popup, |
-which is implemented by an HTML file. |
-Any extension can have an options page, |
-which lets users customize how the extension works. |
-Another type of special page is the override page. |
-And finally, you can |
-use <a href="tabs.html#method-create">chrome.tabs.create()</a> |
-or <code>window.open()</code> |
-to display any other HTML files that are in the extension. |
-</p> |
-<p> |
-The HTML pages inside an extension |
-have complete access to each other's DOMs, |
-and they can invoke functions on each other. |
-</p> |
-<!-- PENDING: Change the following example and figure |
-to use something that's not a popup? |
-(It might lead people to think that popups need background pages.) --> |
-<p> |
-The following figure shows the architecture |
-of a browser action's popup. |
-The popup's contents are a web page |
-defined by an HTML file |
-(<code>popup.html</code>). |
-This extension also happens to have a background page |
-(<code>background.html</code>). |
-The popup doesn't need to duplicate code |
-that's in the background page |
-because the popup can invoke functions on the background page. |
-</p> |
-<img src="images/overview/arch-2.gif" width="256" height="168" alt="A browser window containing a browser action that's displaying a popup. The popup's HTML file (popup.html) can communicate with the extension's background page (background.html)."> |
-<p> |
-See <a href="browserAction.html">Browser Actions</a>, |
-<a href="options.html">Options</a>, |
-<a href="override.html">Override Pages</a>, |
-and the <a href="#pageComm">Communication between pages</a> section |
-for more details. |
-</p> |
-<h3 id="contentScripts">Content scripts</h3> |
-<p> |
-If your extension needs to interact with web pages, |
-then it needs a <em>content script</em>. |
-A content script is some JavaScript |
-that executes in the context of a page |
-that's been loaded into the browser. |
-Think of a content script as part of that loaded page, |
-not as part of the extension it was packaged with |
-(its <em>parent extension</em>). |
-</p> |
-<!-- [PENDING: Consider explaining that the reason content scripts are separated from the extension is due to chrome's multiprocess design. Something like: |
-Each extension runs in its own process. |
-To have rich interaction with a web page, however, |
-the extension must be able to |
-run some code in the web page's process. |
-Extensions accomplish this with content scripts.] |
---> |
-<p> |
-Content scripts can read details of the web pages the browser visits, |
-and they can make changes to the pages. |
-In the following figure, |
-the content script |
-can read and modify |
-the DOM for the displayed web page. |
-It cannot, however, modify the DOM of its parent extension's background page. |
-</p> |
-<img src="images/overview/arch-3.gif" width="238" height="169" alt="A browser window with a browser action (controlled by background.html) and a content script (controlled by contentscript.js)."> |
-<p> |
-Content scripts aren't completely cut off from their parent extensions. |
-A content script can exchange messages with its parent extension, |
-as the arrows in the following figure show. |
-For example, a content script might send a message |
-whenever it finds an RSS feed in a browser page. |
-Or a background page might send a message |
-asking a content script to change the appearance of its browser page. |
-</p> |
-<img src="images/overview/arch-cs.gif" width="238" height="194" alt="Like the previous figure, but showing more of the parent extension's files, as well as a communication path between the content script and the parent extension."> |
-<!-- [PENDING: Add overview of message passing.] --> |
-<p> |
-For more information, |
-see <a href="content_scripts.html">Content Scripts</a>. |
-</p> |
-<h2 id="apis"> Using the chrome.* APIs </h2> |
-<p> |
-In addition to having access to all the APIs that web pages and apps can use, |
-extensions can also use Chrome-only APIs |
-(often called <em>chrome.* APIs</em>) |
-that allow tight integration with the browser. |
-For example, any extension or web app can use the |
-standard <code>window.open()</code> method to open a URL. |
-But if you want to specify which window that URL should be displayed in, |
-your extension can use the Chrome-only |
-<a href="tabs.html#method-create">chrome.tabs.create()</a> |
-method instead. |
-</p> |
-<h3 id="sync"> Asynchronous vs. synchronous methods </h3> |
-<p> |
-Most methods in the chrome.* APIs are <b>asynchronous</b>: |
-they return immediately, without waiting for the operation to finish. |
-If you need to know the outcome of that operation, |
-then you pass a callback function into the method. |
-That callback is executed later (potentially <em>much</em> later), |
-sometime after the method returns. |
-Here's an example of the signature for an asynchronous method: |
-</p> |
-<p> |
-<code> |
-chrome.tabs.create(object <em>createProperties</em>, function <em>callback</em>) |
-</code> |
-</p> |
-<p> |
-Other chrome.* methods are <b>synchronous</b>. |
-Synchronous methods never have a callback |
-because they don't return until they've completed all their work. |
-Often, synchronous methods have a return type. |
-Consider the |
-<a href="extension.html#method-getBackgroundPage">chrome.extensions.getBackgroundPage()</a> method: |
-</p> |
-<p> |
-<code> |
-Window chrome.extension.getBackgroundPage() |
-</code> |
-</p> |
-<p> |
-This method has no callback and a return type of <code>Window</code> |
-because it synchronously returns the background page |
-and performs no other, asynchronous work. |
-</p> |
-<h3 id="sync-example"> Example: Using a callback </h3> |
-<p> |
-Say you want to navigate |
-the user's currently selected tab to a new URL. |
-To do this, you need to get the current tab's ID |
-(using <a href="tabs.html#method-getSelected">chrome.tabs.getSelected()</a>) |
-and then make that tab go to the new URL |
-(using <a href="tabs.html#method-update">chrome.tabs.update()</a>). |
-</p> |
-<p> |
-If <code>getSelected()</code> were synchronous, |
-you might write code like this: |
-</p> |
-<pre> <b>//THIS CODE DOESN'T WORK</b> |
-<span class="linenumber">1: </span>var tab = chrome.tabs.getSelected(null); <b>//WRONG!!!</b> |
-<span class="linenumber">2: </span>chrome.tabs.update(tab.id, {url:newUrl}); |
-<span class="linenumber">3: </span>someOtherFunction(); |
-</pre> |
-<p> |
-That approach fails |
-because <code>getSelected()</code> is asynchronous. |
-It returns without waiting for its work to complete, |
-and it doesn't even return a value |
-(although some asynchronous methods do). |
-You can tell that <code>getSelected()</code> is asynchronous |
-by the <em>callback</em> parameter in its signature: |
-</p><p> |
-<code> |
-chrome.tabs.getSelected(integer <em>windowId</em>, function <em>callback</em>) |
-</code> |
-</p> |
-<p> |
-To fix the preceding code, |
-you must use that callback parameter. |
-The following code shows |
-how to define a callback function |
-that gets the results from <code>getSelected()</code> |
-(as a parameter named <code>tab</code>) |
-and calls <code>update()</code>. |
-</p> |
-<pre> <b>//THIS CODE WORKS</b> |
-<span class="linenumber">1: </span>chrome.tabs.getSelected(null, <b>function(tab) {</b> |
-<span class="linenumber">2: </span> chrome.tabs.update(tab.id, {url:newUrl}); |
-<span class="linenumber">3: </span><b>}</b>); |
-<span class="linenumber">4: </span>someOtherFunction(); |
-</pre> |
-<p> |
-In this example, the lines are executed in the following order: 1, 4, 2. |
-The callback function specified to <code>getSelected</code> is called |
-(and line 2 executed) |
-only after information about the currently selected tab is available, |
-which is sometime after <code>getSelected()</code> returns. |
-Although <code>update()</code> is asynchronous, |
-this example doesn't use its callback parameter, |
-since we don't do anything about the results of the update. |
-</p> |
-<h3 id="chrome-more"> More details </h3> |
-<p> |
-For more information, see the |
-<a href="api_index.html">chrome.* API docs</a> |
-and watch this video: |
-</p> |
-<p> |
-<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/bmxr75CV36A?rel=0" frameborder="0" allowfullscreen=""></iframe> |
-</p> |
-<h2 id="pageComm">Communication between pages </h2> |
-<p> |
-The HTML pages within an extension often need to communicate. |
-<!-- [PENDING: For example, ...] --> |
-Because all of an extension's pages |
-execute in same process on the same thread, |
-the pages can make direct function calls to each other. |
-</p> |
-<p> |
-To find pages in the extension, use |
-<a href="extension.html"><code>chrome.extension</code></a> |
-methods such as |
-<code>getViews()</code> and |
-<code>getBackgroundPage()</code>. |
-Once a page has a reference to other pages within the extension, |
-the first page can invoke functions on the other pages, |
-and it can manipulate their DOMs. |
-</p> |
-<!-- [PENDING: Here's an example of communication between xyz and the background page. (code example goes here)] --> |
-<h2 id="incognito"> Saving data and incognito mode </h2> |
-<p> |
-Extensions can save data using |
-the HTML5 <a href="http://dev.w3.org/html5/webstorage/">web storage API</a> |
-(such as <code>localStorage</code>) |
-or by making server requests that result in saving data. |
-Whenever you want to save something, |
-first consider whether it's |
-from a window that's in incognito mode. |
-By default, extensions don't run in incognito windows, |
-and packaged apps <em>do</em>. |
-You need to consider what a user expects |
-from your extension or packaged app |
-when the browser is incognito. |
-</p> |
-<p> |
-<em>Incognito mode</em> promises that the window will leave no tracks. |
-When dealing with data from incognito windows, |
-do your best to honor this promise. |
-For example, if your extension normally |
-saves browsing history to the cloud, |
-don't save history from incognito windows. |
-On the other hand, you can store |
-your extension's settings from any window, |
-incognito or not. |
-</p> |
-<p class="note"> |
-<b>Rule of thumb:</b> |
-If a piece of data might show where a user |
-has been on the web or what the user has done, |
-don't store it if it's from an incognito window. |
-</p> |
-<p> |
-To detect whether a window is in incognito mode, |
-check the <code>incognito</code> property of the relevant |
-<a href="tabs.html#type-Tab">Tab</a> or |
-<a href="windows.html#type-Window">Window</a> object. |
-For example: |
-</p> |
-<pre>var bgPage = chrome.extension.getBackgroundPage(); |
-function saveTabData(tab, data) { |
- if (tab.incognito) { |
- bgPage[tab.url] = data; // Persist data ONLY in memory |
- } else { |
- localStorage[tab.url] = data; // OK to store data |
-} |
-</pre> |
-<h2 id="now-what"> Now what? </h2> |
-<p> |
-Now that you've been introduced to extensions, |
-you should be ready to write your own. |
-Here are some ideas for where to go next: |
-</p> |
-<ul> |
- <li> <a href="getstarted.html">Tutorial: Getting Started</a> </li> |
- <li> <a href="tut_debugging.html">Tutorial: Debugging</a> </li> |
- <li> <a href="devguide.html">Developer's Guide</a> </li> |
- <li> <a href="http://dev.chromium.org/developers/design-documents/extensions/samples">Samples</a> </li> |
- <li> <a href="http://www.youtube.com/view_play_list?p=CA101D6A85FE9D4B">Videos</a>, |
- such as |
- <a href="http://www.youtube.com/watch?v=B4M_a7xejYI&feature=PlayList&p=CA101D6A85FE9D4B&index=6">Extension Message Passing</a> |
- </li> |
-</ul> |
-</div> |
- <!-- API PAGE --> |
- <!-- /apiPage --> |
- </div> <!-- /gc-pagecontent --> |
- </div> <!-- /g-section --> |
- </div> <!-- /codesiteContent --> |
- <div id="gc-footer" --=""> |
- <div class="text"> |
- <p> |
- Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>, |
- the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons |
- Attribution 3.0 License</a>, and code samples are licensed under the |
- <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>. |
- </p> |
- <p> |
- ©2011 Google |
- </p> |
-<!-- begin analytics --> |
-<script src="https://www.google-analytics.com/urchin.js" type="text/javascript"></script> |
-<script src="https://www.google-analytics.com/ga.js" type="text/javascript"></script> |
-<script type="text/javascript"> |
- // chrome doc tracking |
- try { |
- var engdocs = _gat._getTracker("YT-10763712-2"); |
- engdocs._trackPageview(); |
- } catch(err) {} |
- // code.google.com site-wide tracking |
- try { |
- _uacct="UA-18071-1"; |
- _uanchor=1; |
- _uff=0; |
- urchinTracker(); |
- } |
- catch(e) {/* urchinTracker not available. */} |
-</script> |
-<!-- end analytics --> |
- </div> |
- </div> <!-- /gc-footer --> |
- </div> <!-- /gc-container --> |
-</body></html> |