15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h1>Overview</h1>
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Once you've finished this page
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and the
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="getstarted">Getting Started</a> tutorial,
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you'll be all set to start writing extensions.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="what">The basics</h2>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)An extension is a zipped bundle of files&mdash;HTML,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CSS, JavaScript, images, and anything else you need&mdash;that
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adds functionality to the Google Chrome browser.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extensions are essentially web pages,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and they can use all the
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="api_other">APIs that the browser provides to web pages</a>,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from XMLHttpRequest to JSON to HTML5.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extensions can interact with web pages or servers using
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="content_scripts">content scripts</a> or
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="xhr">cross-origin XMLHttpRequests</a>.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extensions can also interact programmatically
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)with browser features such as
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="bookmarks">bookmarks</a>
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)and <a href="tabs">tabs</a>.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="extension-ui">Extension UIs</h3>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Many extensions&mdash;but not Chrome Apps&mdash;add
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UI to Google Chrome in the form of
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="browserAction">browser actions</a>
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)or <a href="pageAction">page actions</a>.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Each extension can have at most one browser action or page action.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Choose a <b>browser action</b> when the extension is relevant to most pages.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Choose a <b>page action</b> when the extension's icon
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)should appear or disappear,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)depending on the page.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<table class="simple">
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<tr>
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td width="33%">
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    <img src="{{static}}/images/overview/browser-action.png"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width="147" height="100"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alt="screenshot" />
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td width="33%">
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    <img src="{{static}}/images/overview/page-action.png"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width="147" height="100"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alt="screenshot" />
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td>
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    <img src="{{static}}/images/overview/browser-action-with-popup.png"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width="147" height="100"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      alt="screenshot" />
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</tr>
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<tr>
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td>
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    This <a href="samples#google-mail-checker">Google Mail Checker extension</a>
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uses a <em>browser action</em>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (icon in the toolbar).
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td>
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    This <a href="samples#mappy">Mappy extension</a>
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uses a <em>page action</em>
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (icon in the address bar)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    and <em>content script</em>
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (code injected into a web page).
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <td>
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    This <a href="samples#news-reader">News Reader extension</a>
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    features a browser action that,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    when clicked,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shows a <em>popup</em>.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  </td>
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</tr>
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</table>
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Extensions (and Chrome Apps) can also present a UI in other ways,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)such as adding to the Chrome context menu,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)providing an options page,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)or using a content script that changes how pages look.
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)See the <a href="devguide">Developer's Guide</a>
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for a complete list of extension features,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)with links to implementation details
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for each one.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="files">Files</h2>
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Each extension has the following files:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<ul>
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <li>A <b>manifest file</b></li>
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <li>One or more <b>HTML files</b> (unless the extension is a theme)</li>
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <li><em>Optional:</em> One or more <b>JavaScript files</b></li>
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <li><em>Optional:</em> Any other files your extension needs&mdash;for
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  example, image files</li>
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</ul>
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)While you're working on your extension,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you put all these files into a single folder.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)When you distribute your extension,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the contents of the folder are packaged into a special ZIP file
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that has a <code>.crx</code> suffix.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If you upload your extension using the
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<a href="https://chrome.google.com/webstore/developer/dashboard">Chrome Developer Dashboard</a>,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the <code>.crx</code> file is created for you.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For details on distributing extensions,
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)see <a href="hosting">Hosting</a>.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="relative-urls">Referring to files</h3>
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You can put any file you like into an extension,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)but how do you use it?
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usually,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you can refer to the file using a relative URL,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)just as you would in an ordinary HTML page.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Here's an example of referring to
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)a file named <code>myimage.png</code>
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that's in a subfolder named <code>images</code>.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<pre>
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)&lt;img <b>src="images/myimage.png"</b>>
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)As you might notice while you use the Google Chrome debugger,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)every file in an extension is also accessible by an absolute URL like this:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<blockquote>
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<b>chrome-extension://</b><em>&lt;extensionID></em><b>/</b><em>&lt;pathToFile></em>
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</blockquote>
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)In that URL, the <em>&lt;extensionID></em> is a unique identifier
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that the extension system generates for each extension.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You can see the IDs for all your loaded extensions
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)by going to the URL <b>chrome://extensions</b>.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The <em>&lt;pathToFile></em> is the location of the file
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)under the extension's top folder;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)it's the same as the relative URL.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)While you're working on an extension
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(before it's packaged),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the extension ID can change.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Specifically, the ID of an unpacked extension will change
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if you load the extension from a different directory;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the ID will change again when you package the extension.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If your extension's code
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)needs to specify the full path to a file within the extension,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you can use the <code>@@extension_id</code>
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="i18n#overview-predefined">predefined message</a>
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to avoid hardcoding the ID during development.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)When you package an extension
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(typically, by uploading it with the dashboard),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the extension gets a permanent ID,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)which remains the same even after you update the extension.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Once the extension ID is permanent,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you can change all occurrences of
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>@@extension_id</code> to use the real ID.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="manifest">The manifest file</h3>
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The manifest file, called <code>manifest.json</code>,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gives information about the extension,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)such as the most important files
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and the capabilities that the extension might use.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Here's a typical manifest file for a browser action
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that uses information from google.com:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<pre data-filename="manifest.json">
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "name": "My Extension",
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "version": "2.1",
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "description": "Gets information from Google.",
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "icons": { "128": "icon_128.png" },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "background": {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "persistent": false,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "scripts": ["bg.js"]
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "permissions": ["http://*.google.com/", "https://*.google.com/"],
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "browser_action": {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "default_title": "",
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "default_icon": "icon_19.png",
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "default_popup": "popup.html"
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}</pre>
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For details, see
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="manifest">Manifest Files</a>.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="arch">Architecture</h2>
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Many extensions have a <em>background page</em>,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)an invisible page
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that holds the main logic of the extension.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)An extension can also contain other pages
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that present the extension's UI.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If an extension needs to interact with web pages that the user loads
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(as opposed to pages that are included in the extension),
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)then the extension must use a content script.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="background_page">The background page</h3>
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The following figure shows a browser
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that has at least two extensions installed:
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)a browser action (yellow icon)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and a page action (blue icon).
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Both the browser action and the page action
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)have background pages.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This figure shows the browser action's background page,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)which is defined by <code>background.html</code>
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and has JavaScript code that controls
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the behavior of the browser action in both windows.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<img src="{{static}}/images/overview/arch-1.gif"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width="232" height="168"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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." />
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)There are two types of background pages:
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="background_pages">persistent background pages</a>,
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)and <a href="event_pages">event pages</a>. Persistent
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)background pages, as the name suggests, are always open.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event pages are opened and closed as needed. Unless you absolutely
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)need your background page to run all the time, prefer to use
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)an event page.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<!-- PENDING: Perhaps show a picture of many background page processes.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  This could build on a figure that shows the process architecture. -->
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)See <a href="event_pages">Event Pages</a>
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)and <a href="background_pages">Background Pages</a>
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for more details.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="pages">UI pages</h3>
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extensions can contain ordinary HTML pages that display the extension's UI.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For example, a browser action can have a popup,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)which is implemented by an HTML file.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Any extension can have an options page,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)which lets users customize how the extension works.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Another type of special page is the override page.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)And finally, you can
28423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)use $(ref:tabs.create)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)or <code>window.open()</code>
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to display any other HTML files that are in the extension.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The HTML pages inside an extension
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)have complete access to each other's DOMs,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and they can invoke functions on each other.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<!-- PENDING: Change the following example and figure
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)to use something that's not a popup?
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(It might lead people to think that popups need background pages.) -->
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The following figure shows the architecture
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)of a browser action's popup.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The popup's contents are a web page
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)defined by an HTML file
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(<code>popup.html</code>).
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This extension also happens to have a background page
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(<code>background.html</code>).
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The popup doesn't need to duplicate code
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that's in the background page
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)because the popup can invoke functions on the background page.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<img src="{{static}}/images/overview/arch-2.gif"
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width="256" height="168"
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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)." />
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)See <a href="browserAction">Browser Actions</a>,
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="options">Options</a>,
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="override">Override Pages</a>,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and the <a href="#pageComm">Communication between pages</a> section
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for more details.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="contentScripts">Content scripts</h3>
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If your extension needs to interact with web pages,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)then it needs a <em>content script</em>.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)A content script is some JavaScript
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that executes in the context of a page
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that's been loaded into the browser.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Think of a content script as part of that loaded page,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)not as part of the extension it was packaged with
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(its <em>parent extension</em>).
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<!-- [PENDING: Consider explaining that the reason content scripts are separated from the extension is due to chrome's multiprocess design.  Something like:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Each extension runs in its own process.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To have rich interaction with a web page, however,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the extension must be able to
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)run some code in the web page's process.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Extensions accomplish this with content scripts.]
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)-->
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Content scripts can read details of the web pages the browser visits,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and they can make changes to the pages.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)In the following figure,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the content script
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)can read and modify
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the DOM for the displayed web page.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)It cannot, however, modify the DOM of its parent extension's background page.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<img src="{{static}}/images/overview/arch-3.gif"
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width="238" height="169"
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alt="A browser window with a browser action (controlled by background.html) and a content script (controlled by contentscript.js)." />
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Content scripts aren't completely cut off from their parent extensions.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)A content script can exchange messages with its parent extension,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)as the arrows in the following figure show.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For example, a content script might send a message
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)whenever it finds an RSS feed in a browser page.
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Or a background page might send a message
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)asking a content script to change the appearance of its browser page.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<img src="{{static}}/images/overview/arch-cs.gif"
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width="238" height="194"
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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." />
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For more information,
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)see <a href="content_scripts">Content Scripts</a>.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="apis"> Using the chrome.* APIs </h2>
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)In addition to having access to all the APIs that web pages and apps can use,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extensions can also use Chrome-only APIs
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(often called <em>chrome.* APIs</em>)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)that allow tight integration with the browser.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For example, any extension or web app can use the
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)standard <code>window.open()</code> method to open a URL.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)But if you want to specify which window that URL should be displayed in,
39323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)your extension can use the Chrome-only
39423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)$(ref:tabs.create)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)method instead.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="sync"> Asynchronous vs. synchronous methods </h3>
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Most methods in the chrome.* APIs are <b>asynchronous</b>:
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)they return immediately, without waiting for the operation to finish.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If you need to know the outcome of that operation,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)then you pass a callback function into the method.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)That callback is executed later (potentially <em>much</em> later),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sometime after the method returns.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Here's an example of the signature for an asynchronous method:
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome.tabs.create(object <em>createProperties</em>, function <em>callback</em>)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</code>
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Other chrome.* methods are <b>synchronous</b>.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Synchronous methods never have a callback
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)because they don't return until they've completed all their work.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Often, synchronous methods have a return type.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Consider the
42123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)$(ref:runtime.getURL) method:
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string chrome.runtime.getURL()
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</code>
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This method has no callback and a return type of <code>string</code>
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)because it synchronously returns the URL
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and performs no other, asynchronous work.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="sync-example"> Example: Using a callback </h3>
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Say you want to navigate
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the user's currently selected tab to a new URL.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To do this, you need to get the current tab's ID
44323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)(using $(ref:tabs.query))
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and then make that tab go to the new URL
44523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)(using $(ref:tabs.update)).
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)If <code>query()</code> were synchronous,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you might write code like this:
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<pre>
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<b>//THIS CODE DOESN'T WORK</b>
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)var tab = chrome.tabs.query({'active': true}); <b>//WRONG!!!</b>
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)chrome.tabs.update(tab.id, {url:newUrl});
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)someOtherFunction();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)That approach fails
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)because <code>query()</code> is asynchronous.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)It returns without waiting for its work to complete,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and it doesn't even return a value
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(although some asynchronous methods do).
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)You can tell that <code>query()</code> is asynchronous
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)by the <em>callback</em> parameter in its signature:
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chrome.tabs.query(object <em>queryInfo</em>, function <em>callback</em>)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</code>
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To fix the preceding code,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you must use that callback parameter.
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The following code shows
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)how to define a callback function
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)that gets the results from <code>query()</code>
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(as a parameter named <code>tab</code>)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and calls <code>update()</code>.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<pre>
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<b>//THIS CODE WORKS</b>
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)chrome.tabs.query({'active': true}, <b>function(tabs) {</b>
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  chrome.tabs.update(tabs[0].id, {url: newUrl});
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)<b>}</b>);
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)someOtherFunction();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)In this example, the lines are executed in the following order: 1, 4, 2.
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)The callback function specified to <code>query()</code> is called
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(and line 2 executed)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)only after information about the currently selected tab is available,
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)which is sometime after <code>query()</code> returns.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Although <code>update()</code> is asynchronous,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)this example doesn't use its callback parameter,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)since we don't do anything about the results of the update.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h3 id="chrome-more"> More details </h3>
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For more information, see the
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="api_index">chrome.* API docs</a>
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and watch this video:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
513f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)<div class="video-container">
514f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  <iframe title="YouTube video player" width="640" height="390" src="//www.youtube.com/embed/bmxr75CV36A?rel=0" frameborder="0" allowfullscreen></iframe>
515f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)</div>
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="pageComm">Communication between pages </h2>
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The HTML pages within an extension often need to communicate.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Because all of an extension's pages
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)execute in same process on the same thread,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the pages can make direct function calls to each other.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To find pages in the extension, use
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)<a href="extension"><code>chrome.extension</code></a>
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)methods such as
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>getViews()</code> and
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<code>getBackgroundPage()</code>.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Once a page has a reference to other pages within the extension,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the first page can invoke functions on the other pages,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and it can manipulate their DOMs.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="incognito"> Saving data and incognito mode </h2>
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
54123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Extensions can save data using the $(ref:storage) API,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the HTML5 <a href="http://dev.w3.org/html5/webstorage/">web storage API</a>
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(such as <code>localStorage</code>)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)or by making server requests that result in saving data.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Whenever you want to save something,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)first consider whether it's
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from a window that's in incognito mode.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)By default, extensions don't run in incognito windows.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You need to consider what a user expects
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from your extension
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)when the browser is incognito.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<em>Incognito mode</em> promises that the window will leave no tracks.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)When dealing with data from incognito windows,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do your best to honor this promise.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For example, if your extension normally
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)saves browsing history to the cloud,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)don't save history from incognito windows.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)On the other hand, you can store
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)your extension's settings from any window,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)incognito or not.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p class="note">
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<b>Rule of thumb:</b>
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If a piece of data might show where a user
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)has been on the web or what the user has done,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)don't store it if it's from an incognito window.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)To detect whether a window is in incognito mode,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)check the <code>incognito</code> property of the relevant
57623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)$(ref:tabs.Tab) or
57723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)$(ref:windows.Window) object.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For example:
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<pre>
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function saveTabData(tab, data) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab.incognito) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome.runtime.getBackgroundPage(function(bgPage) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bgPage[tab.url] = data;      // Persist data ONLY in memory
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    });
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    localStorage[tab.url] = data;  // OK to store data
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</pre>
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<h2 id="now-what"> Now what? </h2>
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<p>
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Now that you've been introduced to extensions,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)you should be ready to write your own.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Here are some ideas for where to go next:
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</p>
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)<ul>
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  <li> <a href="getstarted">Tutorial: Getting Started</a> </li>
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  <li> <a href="tut_debugging">Tutorial: Debugging</a> </li>
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  <li> <a href="devguide">Developer's Guide</a> </li>
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  <li> <a href="samples">Samples</a> </li>
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  <li> <a href="http://www.youtube.com/view_play_list?p=CA101D6A85FE9D4B">Videos</a>,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    such as
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    <a href="http://www.youtube.com/watch?v=B4M_a7xejYI&feature=PlayList&p=CA101D6A85FE9D4B&index=6">Extension Message Passing</a>
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    </li>
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)</ul>
612