| 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>
|
|
|