Home | History | Annotate | Download | only in docs
      1 <!DOCTYPE html><!-- This page is a placeholder for generated extensions api doc. Note:
      2     1) The <head> information in this page is significant, should be uniform
      3        across api docs and should be edited only with knowledge of the
      4        templating mechanism.
      5     3) All <body>.innerHTML is genereated as an rendering step. If viewed in a
      6        browser, it will be re-generated from the template, json schema and
      7        authored overview content.
      8     4) The <body>.innerHTML is also generated by an offline step so that this
      9        page may easily be indexed by search engines.
     10 --><html xmlns="http://www.w3.org/1999/xhtml"><head>
     11     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     12     <link href="css/ApiRefStyles.css" rel="stylesheet" type="text/css">
     13     <link href="css/print.css" rel="stylesheet" type="text/css" media="print">
     14     <script type="text/javascript" src="../../../third_party/jstemplate/jstemplate_compiled.js">
     15     </script>
     16     <script type="text/javascript" src="js/api_page_generator.js"></script>
     17     <script type="text/javascript" src="js/bootstrap.js"></script>
     18     <script type="text/javascript" src="js/sidebar.js"></script>
     19   <title>Frequently Asked Questions - Google Chrome Extensions - Google Code</title></head>
     20   <body>  <div id="gc-container" class="labs">
     21       <div id="devModeWarning">
     22         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.
     23       </div>
     24       <!-- SUBTEMPLATES: DO NOT MOVE FROM THIS LOCATION -->
     25       <!-- In particular, sub-templates that recurse, must be used by allowing
     26            jstemplate to make a copy of the template in this section which
     27            are not operated on by way of the jsskip="true" -->
     28       <div style="display:none">
     29 
     30         <!-- VALUE -->
     31         <div id="valueTemplate">
     32           <dt>
     33             <var>paramName</var>
     34               <em>
     35 
     36                 <!-- TYPE -->
     37                 <div style="display:inline">
     38                   (
     39                     <span class="optional">optional</span>
     40                     <span class="enum">enumerated</span>
     41                     <span id="typeTemplate">
     42                       <span>
     43                         <a> Type</a>
     44                       </span>
     45                       <span>
     46                         <span>
     47                           array of <span><span></span></span>
     48                         </span>
     49                         <span>paramType</span>
     50                         <span></span>
     51                       </span>
     52                     </span>
     53                   )
     54                 </div>
     55 
     56               </em>
     57           </dt>
     58           <dd class="todo">
     59             Undocumented.
     60           </dd>
     61           <dd>
     62             Description of this parameter from the json schema.
     63           </dd>
     64           <dd>
     65             This parameter was added in version
     66             <b><span></span></b>.
     67             You must omit this parameter in earlier versions,
     68             and you may omit it in any version.  If you require this
     69             parameter, the manifest key
     70             <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
     71             can ensure that your extension won't be run in an earlier browser version.
     72           </dd>
     73 
     74           <!-- OBJECT PROPERTIES -->
     75           <dd>
     76             <dl>
     77               <div>
     78                 <div>
     79                 </div>
     80               </div>
     81             </dl>
     82           </dd>
     83 
     84           <!-- OBJECT METHODS -->
     85           <dd>
     86             <div></div>
     87           </dd>
     88 
     89           <!-- OBJECT EVENT FIELDS -->
     90           <dd>
     91             <div></div>
     92           </dd>
     93 
     94           <!-- FUNCTION PARAMETERS -->
     95           <dd>
     96             <div></div>
     97           </dd>
     98 
     99         </div> <!-- /VALUE -->
    100 
    101         <div id="functionParametersTemplate">
    102           <h5>Parameters</h5>
    103           <dl>
    104             <div>
    105               <div>
    106               </div>
    107             </div>
    108           </dl>
    109         </div>
    110       </div> <!-- /SUBTEMPLATES -->
    111 
    112   <a id="top"></a>
    113     <div id="skipto">
    114       <a href="#gc-pagecontent">Skip to page content</a>
    115       <a href="#gc-toc">Skip to main navigation</a>
    116     </div>
    117     <!-- API HEADER -->
    118     <table id="header" width="100%" cellspacing="0" border="0">
    119       <tbody><tr>
    120         <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>
    121         <td valign="middle" width="100%" style="padding-left:0.6em;">
    122           <form action="http://www.google.com/cse" id="cse" style="margin-top:0.5em">
    123             <div id="gsc-search-box">
    124               <input type="hidden" name="cx" value="002967670403910741006:61_cvzfqtno">
    125               <input type="hidden" name="ie" value="UTF-8">
    126               <input type="text" name="q" value="" size="55">
    127               <input class="gsc-search-button" type="submit" name="sa" value="Search">
    128               <br>
    129               <span class="greytext">e.g. "page action" or "tabs"</span>
    130             </div>
    131           </form>
    132 
    133           <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    134           <script type="text/javascript">google.load("elements", "1", {packages: "transliteration"});</script>
    135           <script type="text/javascript" src="http://www.google.com/coop/cse/t13n?form=cse&t13n_langs=en"></script>
    136           <script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse&lang=en"></script>
    137         </td>
    138       </tr>
    139     </tbody></table>
    140 
    141     <div id="codesiteContent" class="">
    142 
    143       <a id="gc-topnav-anchor"></a>
    144       <div id="gc-topnav">
    145         <h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</h1>
    146         <ul id="home" class="gc-topnav-tabs">
    147           <li id="home_link">
    148             <a href="index.html" title="Google Chrome Extensions home page">Home</a>
    149           </li>
    150           <li id="docs_link">
    151             <a href="docs.html" title="Official Google Chrome Extensions documentation">Docs</a>
    152           </li>
    153           <li id="faq_link">
    154             <a href="faq.html" title="Answers to frequently asked questions about Google Chrome Extensions">FAQ</a>
    155           </li>
    156           <li id="samples_link">
    157             <a href="samples.html" title="Sample extensions (with source code)">Samples</a>
    158           </li>
    159           <li id="group_link">
    160             <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions" title="Google Chrome Extensions developer forum">Group</a>
    161           </li>
    162         </ul>
    163       </div> <!-- end gc-topnav -->
    164 
    165     <div class="g-section g-tpl-170">
    166       <!-- SIDENAV -->
    167       <div class="g-unit g-first" id="gc-toc">
    168         <ul>
    169           <li><a href="getstarted.html">Getting Started</a></li>
    170           <li><a href="overview.html">Overview</a></li>
    171           <li><a href="whats_new.html">What's New?</a></li>
    172           <li><h2><a href="devguide.html">Developer's Guide</a></h2>
    173             <ul>
    174               <li>Browser UI
    175                 <ul>
    176                   <li><a href="browserAction.html">Browser Actions</a></li>
    177                   <li><a href="contextMenus.html">Context Menus</a></li>
    178                   <li><a href="notifications.html">Desktop Notifications</a></li>
    179                   <li><a href="omnibox.html">Omnibox</a></li>
    180                   <li><a href="options.html">Options Pages</a></li>
    181                   <li><a href="override.html">Override Pages</a></li>
    182                   <li><a href="pageAction.html">Page Actions</a></li>
    183                 </ul>
    184               </li>
    185               <li>Browser Interaction
    186                 <ul>
    187                   <li><a href="bookmarks.html">Bookmarks</a></li>
    188                   <li><a href="cookies.html">Cookies</a></li>
    189                   <li><a href="events.html">Events</a></li>
    190                   <li><a href="history.html">History</a></li>
    191                   <li><a href="management.html">Management</a></li>
    192                   <li><a href="tabs.html">Tabs</a></li>
    193                   <li><a href="windows.html">Windows</a></li>
    194                 </ul>
    195               </li>
    196               <li>Implementation
    197                 <ul>
    198                   <li><a href="a11y.html">Accessibility</a></li>
    199                   <li><a href="background_pages.html">Background Pages</a></li>
    200                   <li><a href="content_scripts.html">Content Scripts</a></li>
    201                   <li><a href="xhr.html">Cross-Origin XHR</a></li>
    202                   <li><a href="idle.html">Idle</a></li>
    203                   <li><a href="i18n.html">Internationalization</a></li>
    204                   <li><a href="messaging.html">Message Passing</a></li>
    205                   <li><a href="npapi.html">NPAPI Plugins</a></li>
    206                 </ul>
    207               </li>
    208               <li>Finishing
    209                 <ul>
    210                   <li><a href="hosting.html">Hosting</a></li>
    211                   <li><a href="external_extensions.html">Other Deployment Options</a></li>
    212                 </ul>
    213               </li>
    214             </ul>
    215           </li>
    216           <li><h2><a href="apps.html">Packaged Apps</a></h2></li>
    217           <li><h2><a href="tutorials.html">Tutorials</a></h2>
    218             <ul>
    219               <li><a href="tut_debugging.html">Debugging</a></li>
    220               <li><a href="tut_analytics.html">Google Analytics</a></li>
    221               <li><a href="tut_oauth.html">OAuth</a></li>
    222             </ul>
    223           </li>
    224           <li><h2>Reference</h2>
    225             <ul>
    226               <li>Formats
    227                 <ul>
    228                   <li><a href="manifest.html">Manifest Files</a></li>
    229                   <li><a href="match_patterns.html">Match Patterns</a></li>
    230                 </ul>
    231               </li>
    232               <li><a href="permission_warnings.html">Permission Warnings</a></li>
    233               <li><a href="api_index.html">chrome.* APIs</a></li>
    234               <li><a href="api_other.html">Other APIs</a></li>
    235             </ul>
    236           </li>
    237           <li><h2><a href="samples.html">Samples</a></h2></li>
    238           <div class="line"> </div>
    239           <li><h2>More</h2>
    240             <ul>
    241               <li><a href="http://code.google.com/chrome/webstore/docs/index.html">Chrome Web Store</a></li>
    242               <li><a href="http://code.google.com/chrome/apps/docs/developers_guide.html">Hosted Apps</a></li>
    243               <li><a href="themes.html">Themes</a></li>
    244             </ul>
    245           </li>
    246         </ul>
    247       </div>
    248       <script>
    249         initToggles();
    250       </script>
    251 
    252     <div class="g-unit" id="gc-pagecontent">
    253       <div id="pageTitle">
    254         <h1 class="page_title">Frequently Asked Questions</h1>
    255       </div>
    256         <!-- TABLE OF CONTENTS -->
    257         <div id="toc" style="display: none; ">
    258           <h2>Contents</h2>
    259           <ol>
    260             <li>
    261               <a>h2Name</a>
    262               <ol>
    263                 <li>
    264                   <a>h3Name</a>
    265                 </li>
    266               </ol>
    267             </li>
    268               <li>
    269                 <a href="#apiReference">API reference</a>
    270                 <ol>
    271                   <li>
    272                     <a href="#properties">Properties</a>
    273                     <ol>
    274                       <li>
    275                         <a href="#property-anchor">propertyName</a>
    276                       </li>
    277                     </ol>
    278                   </li>
    279                   <li>
    280                     <a>Methods</a>
    281                     <ol>
    282                       <li>
    283                         <a href="#method-anchor">methodName</a>
    284                       </li>
    285                     </ol>
    286                   </li>
    287                   <li>
    288                     <a>Events</a>
    289                     <ol>
    290                       <li>
    291                         <a href="#event-anchor">eventName</a>
    292                       </li>
    293                     </ol>
    294                   </li>
    295                   <li>
    296                     <a href="#types">Types</a>
    297                     <ol>
    298                       <li>
    299                         <a href="#id-anchor">id</a>
    300                       </li>
    301                     </ol>
    302                   </li>
    303                 </ol>
    304               </li>
    305           </ol>
    306         </div>
    307         <!-- /TABLE OF CONTENTS -->
    308 
    309         <!-- Standard content lead-in for experimental API pages -->
    310         <p id="classSummary" style="display: none; ">
    311           For information on how to use experimental APIs, see the <a href="experimental.html">chrome.experimental.* APIs</a> page.
    312         </p>
    313 
    314         <!-- STATIC CONTENT PLACEHOLDER -->
    315         <div id="static"><div id="pageData-name" class="pageData">Frequently Asked Questions</div>
    316 
    317 
    318 <!-- <div id="pageData-showTOC" class="pageData">true</div> -->
    319 
    320 <p>
    321 If you don't find an answer to your question here,
    322 try the
    323 <a href="http://code.google.com/chrome/webstore/faq.html">Chrome Web Store FAQ</a>, the
    324 <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions">group</a>, or the
    325 <a href="http://www.google.com/support/chrome/bin/answer.py?answer=113909">gallery help</a>.
    326 <!-- PENDING: add a link to store help -->
    327 </p>
    328 
    329 <div id="faq-TOC">
    330   <h4>General</h4>
    331   <ul>
    332     <li><a href="#faq-gen-01">What are Google Chrome Extensions?</a></li>
    333     <li><a href="#faq-dev-01">How can I set up Chrome for extension development?</a></li>
    334     <li><a href="#faq-gen-02">What technologies are used to write extensions for Chrome?</a></li>
    335     <li><a href="#faq-gen-03">Are extensions fetched from the web every time the browser is loaded?</a></li>
    336     <li><a href="#faq-dev-14">How do I determine which version of Chrome is deployed to which channel?</a></li>
    337   </ul>
    338   <h4>Capabilities</h4>
    339   <ul>
    340     <li><a href="#faq-dev-02">Can extensions make cross-domain Ajax requests?</a></li>
    341     <li><a href="#faq-dev-03">Can extensions use 3rd party web services?</a></li>
    342     <li><a href="#faq-dev-07">Can extensions encode/decode JSON data?</a></li>
    343     <li><a href="#faq-dev-08">Can extensions store data locally?</a></li>
    344     <li><a href="#faq-dev-04">Can extensions use OAuth?</a></li>
    345     <li><a href="#faq-dev-06">Can extensions load DLLs?</a></li>
    346     <li><a href="#faq-dev-05">Can extensions create UI outside of the rendered web page?</a></li>
    347     <li><a href="#faq-interact-chrome">Can extensions listen to clicks on Chrome tabs and navigation buttons?</a>
    348     </li><li><a href="#faq-dev-11">Can two extensions communicate with each other?</a></li>
    349     <li><a href="#faq-dev-13">Can extensions use Google Analytics?</a></li>
    350     <li><a href="#faq-dev-15">Can extensions modify chrome:// URLs?</a></li>
    351     <li><a href="#faq-open-popups">Can extensions open browser/page action popups without user interaction?</a></li>
    352     <li><a href="#faq-persist-popups">Can extensions keep popups open after the user clicks away from them?</a></li>
    353     <li><a href="#faq-lifecycle-events">Can extensions be notified when they are installed/uninstalled?</a></li>
    354   </ul>
    355   <h4>Development</h4>
    356   <ul>
    357     <li><a href="#faq-building-ui">How do I build a UI for my extension?</a>
    358     </li><li><a href="#faq-dev-09">How much data can I store in localStorage?</a></li>
    359     <li><a href="#faq-dev-10">How do I create an options menu for my application?</a></li>
    360     <li><a href="#faq-dev-12">What debugging tools are available to extension developers?</a></li>
    361     <li><a href="#faq-dev-16">Why do wildcard matches not work for top level domains (TLDs)?</a></li>
    362     <li><a href="#faq-management">Why does the management API not fire events when my extension is installed/uninstalled?</a></li>
    363     <li><a href="#faq-firstrun">How can an extension determine whether it is running for the first time?</a></li>
    364   </ul>
    365   <h4>Features and bugs</h4>
    366   <ul>
    367     <li><a href="#faq-fea-01">I think I've found a bug! How do I make sure it gets fixed?</a></li>
    368     <li><a href="#faq-fea-02">I have a feature request! How can I report it?</a></li>
    369   </ul>
    370 </div>
    371 
    372 <h2>General</h2>
    373 
    374 <h3 id="faq-gen-01">What are Google Chrome Extensions?</h3>
    375 <p>
    376   Google Chrome Extensions are applications that run inside the
    377   Chrome browser and provide additional functionality, integration with third
    378   party websites or services, and customized browsing experiences.
    379 </p>
    380 
    381 <h3 id="faq-dev-01">How can I set up Chrome for extension development?</h3>
    382 <p>
    383   As long as you are using a version of Chrome that supports
    384   extensions, you already have everything you need to start writing an
    385   extension of your own.
    386   You can start by turning on Developer mode.
    387   </p>
    388 
    389   <p>
    390   Click the wrench icon
    391   <img src="images/toolsmenu.gif" height="29" width="29" alt="" class="nomargin">
    392   and select <b>Extensions</b> from the <b>Tools</b> menu.
    393   If there's a "+" next to "Developer mode",
    394   click the "+" so it turns into a "-".
    395   Now you can reload extensions,
    396   load an unpacked directory of files as if it were a packaged extension,
    397   and more. For a complete tutorial, see
    398   <a href="http://code.google.com/chrome/extensions/getstarted.html">Getting Started</a>.
    399 </p>
    400 
    401 <h3 id="faq-gen-02">What technologies are used to write extensions for Chrome?</h3>
    402 <p>
    403   Extensions are written using the same standard web
    404   technologies that developers use to create websites. HTML is used as a
    405   content markup language, CSS is used for styling, and JavaScript for
    406   scripting. Because Chrome supports HTML5 and CSS3, developers can
    407   use the latest open web technologies such as canvas and CSS animations in
    408   their extensions. Extensions also have access to several
    409   <a href="http://code.google.com/chrome/extensions/api_other.html">JavaScript APIs</a>
    410   that help perform functions like JSON encoding and interacting with the
    411   browser.
    412 </p>
    413 
    414 
    415 <h3 id="faq-gen-03">Are extensions fetched from the web every time the browser is loaded?</h3>
    416 <p>
    417   Extensions are downloaded by the Chrome browser upon install, and
    418   are subsequently run off of the local disk in order to speed up
    419   performance. However, if a new version of the extension is pushed online,
    420   it will be automatically downloaded in the background to any users who
    421   have the extension installed. Extensions may also make requests for remote
    422   content at any time, in order to interact with a web service or pull new
    423   content from the web.
    424 </p>
    425 
    426 <h3 id="faq-dev-14">How do I determine which version of Chrome is deployed to which channel?</h3>
    427 <p>
    428   To determine which version of Chrome is currently available on each
    429   of the different platforms, visit
    430   <a href="http://omahaproxy.appspot.com">omahaproxy.appspot.com</a>.  On that
    431   site you will see data in a format similar to:
    432 </p>
    433 
    434 <pre>cf,dev,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    435 cf,beta,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    436 cf,stable,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    437 linux,dev,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    438 linux,beta,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    439 linux,stable,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    440 mac,dev,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    441 mac,beta,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    442 mac,stable,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    443 win,canary,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    444 win,dev,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    445 win,beta,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    446 win,stable,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    447 cros,dev,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####
    448 cros,beta,#.#.###.#,#.#.###.#,mm/dd/yy,mm/dd/yy,#####,#####,#####</pre>
    449 
    450 <p>
    451   Each line represents information about a different platform and channel
    452   combination. The
    453   listed platforms are <code>cf</code> (Google Chrome Frame),
    454   <code>linux</code>, <code>mac</code>, <code>win</code>, and
    455   <code>cros</code> (Google Chrome OS).  The listed
    456   channels are <code>canary</code>, <code>dev</code>, <code>beta</code>,
    457   and <code>stable</code>.
    458   The two four-part numbers after the channel represent the current and previous
    459   versions of Chrome deployed to that platform-channel
    460   combination.  The rest of the information is metadata about when the releases
    461   were first pushed, as well as revision numbers associated with each build.
    462 </p>
    463 
    464 
    465 <h2>Capabilities</h2>
    466 
    467 <h3 id="faq-dev-02">Can extensions make cross-domain Ajax requests?</h3>
    468 <p>
    469   Yes. Extensions can make cross-domain requests.  See
    470   <a href="http://code.google.com/chrome/extensions/xhr.html">this page</a>
    471   for more information.
    472 </p>
    473 
    474 <h3 id="faq-dev-03">Can extensions use 3rd party web services?</h3>
    475 <p>
    476   Yes. Extensions are capable of making cross-domain Ajax
    477   requests, so they can call remote APIs directly. APIs that provide data
    478   in JSON format are particularly easy to use.
    479 </p>
    480 
    481 <h3 id="faq-dev-07">Can extensions encode/decode JSON data?</h3>
    482 <p>
    483   Yes, because V8 (Chrome's JavaScript engine) supports
    484   JSON.stringify and JSON.parse natively, you may use these functions in your
    485   extensions
    486   <a href="http://json.org/js.html">as described here</a> without including
    487   any additional JSON libraries in your code.
    488 </p>
    489 
    490 <h3 id="faq-dev-08">Can extensions store data locally?</h3>
    491 <p>
    492   Yes, extensions can use <a href="http://dev.w3.org/html5/webstorage/">localStorage</a>
    493   to store string data permanently. Using Chrome's built-in JSON
    494   functions, you can store complex data structures in localStorage.  For
    495   extensions that need to execute SQL queries on their stored data,
    496   Chrome implements
    497   <a href="http://dev.w3.org/html5/webdatabase/">client side SQL databases</a>,
    498   which may be used as well.
    499 </p>
    500 
    501 <h3 id="faq-dev-04">Can extensions use OAuth?</h3>
    502 <p>
    503   Yes, there are extensions that use OAuth to access remote data
    504   APIs. Most developers find it convenient to use a
    505   <a href="http://unitedheroes.net/OAuthSimple/js/OAuthSimple.js">JavaScript OAuth library</a>
    506   in order to simplify the process of signing OAuth requests.
    507 </p>
    508 
    509 <h3 id="faq-dev-06">Can extensions load DLLs?</h3>
    510 <p>
    511   Yes, using the <a href="npapi.html">NPAPI interface</a>.
    512   Because of the possibility for abuse, though, we will review your extension
    513   before hosting it in the Google Chrome Extensions Gallery
    514   or Chrome Web Store.
    515 </p>
    516 
    517 <h3 id="faq-dev-05">Can extensions create UI outside of the rendered web page?</h3>
    518 <p>
    519   Yes, your extension may add buttons to the Chrome browser's user interface.
    520   See <a href="browserAction.html">browser actions</a> and
    521   <a href="pageAction.html">page actions</a> for more information.
    522 </p>
    523 <p>
    524   An extension may also create popup notifications, which exist outside of the
    525   browser window.  See the <a href="notifications.html">desktop
    526     notifications</a> documentation for more details.
    527 </p>
    528 
    529 <h3 id="faq-interact-chrome">Can extensions listen to clicks on Chrome tabs and
    530   navigation buttons?</h3>
    531 <p>
    532   No.  Extensions are limited to listening to the events described in the <a href="api_index.html">API documentation</a>.
    533 </p>
    534 
    535 <h3 id="faq-dev-11">Can two extensions communicate with each other?</h3>
    536 <p>
    537   Yes, extensions may pass messages to other extensions. See the
    538   <a href="messaging.html#external">message passing documentation</a>
    539   for more information.
    540 </p>
    541 
    542 <h3 id="faq-dev-13">Can extensions use Google Analytics?</h3>
    543 <p>
    544   Yes, since extensions are built just like websites, they can use
    545   <a href="http://www.google.com/analytics/">Google Analytics</a> to track
    546   usage.  However, we strongly advise you to modify the tracking code to pull
    547   an HTTPS version of the Google Analytics library.  See
    548   <a href="tut_analytics.html">this tutorial</a> for more information on doing
    549   this.
    550 </p>
    551 
    552 <h3 id="faq-dev-15">Can extensions modify chrome:// URLs?</h3>
    553 <p>
    554   No. The extensions APIs have been designed to minimize backwards
    555   compatibility issues that can arise when new versions of the browser are
    556   pushed. Allowing content scripts on <code>chrome://</code>
    557   URLs would mean that developers would begin to rely on the DOM, CSS, and
    558   JavaScript of these pages to stay the same.  In the best case, these pages
    559   could not be updated as quickly as they are being updated right now.
    560   In the worst case, it could mean that an update to one
    561   of these pages could cause an extension to break, causing key parts of the
    562   browser to stop working for users of that extension.
    563 </p>
    564 
    565 <p>
    566   The reason that <a href="override.html">replacing the content</a>
    567   hosted at these URLs entirely is
    568   allowed is because it forces an extension developer to implement all of the
    569   functionality they want without depending on the browser's internal implementation
    570   to stay the same.
    571 </p>
    572 
    573 <h3 id="faq-open-popups">Can extensions open browser/page action popups without
    574   user interaction?</h3>
    575 <p>
    576   No, popups can only be opened if the user clicks on the corresponding page or
    577   browser action.  An extension cannot open its popup programatically.
    578 </p>
    579 
    580 <h3 id="faq-persist-popups">Can extensions keep popups open after the user
    581   clicks away from them?</h3>
    582 <p>
    583   No, popups automatically close when the user focuses on some portion of the
    584   browser outside of the popup.  There is no way to keep the popup open after
    585   the user has clicked away.
    586 </p>
    587 
    588 <h3 id="faq-lifecycle-events">Can extensions be notified when they are
    589   installed/uninstalled?</h3>
    590 <p>
    591   No, there are no events an extension can listen to in order to determine
    592   whether it has been installed or uninstalled.  However, an extension can
    593   determine when it has been run for the first time.  See <a href="#faq-firstrun">this FAQ entry</a> for information.
    594 </p>
    595 
    596 
    597 <h2>Development</h2>
    598 
    599 
    600 <h3 id="faq-building-ui">How do I build a UI for my extension?</h3>
    601 <p>
    602   Extensions use HTML and CSS to define their user interfaces, so you can use
    603   standard form controls to build your UI, or style the interface with CSS,
    604   as you would a web page.  Additionally, extensions can add
    605   <a href="#faq-dev-05">some limited UI elements to Chrome itself.</a>
    606 </p>
    607 
    608 <h3 id="faq-dev-09">How much data can I store in localStorage?</h3>
    609 <p>
    610   Extensions can store up to 5MB of data in localStorage.
    611 </p>
    612 
    613 <h3 id="faq-dev-10">How do I create an options menu for my application?</h3>
    614 <p>
    615   You can let users set options for your extension by creating an
    616   <a href="http://code.google.com/chrome/extensions/trunk/options.html">options page</a>,
    617   which is a simple HTML page that will be loaded when a user clicks the
    618   "options" button for your extension. This page can read and write settings
    619   to localStorage, or even send options to a web server so that they can be
    620   persisted across browsers.
    621 </p>
    622 
    623 <h3 id="faq-dev-12">What debugging tools are available to extension developers?</h3>
    624 <p>
    625   Chrome's built-in developer tools can be used to debug extensions
    626   as well as web pages. See this
    627   <a href="http://code.google.com/chrome/extensions/tut_debugging.html ">tutorial on debugging extensions</a>
    628   for more information.
    629 </p>
    630 
    631 <h3 id="faq-dev-16">Why do wildcard matches not work for top level domains
    632   (TLDs)?</h3>
    633 <p>
    634   You cannot use wildcard match patterns like <code>http://google.*/*</code>
    635   to match TLDs (like <code>http://google.es</code> and
    636   <code>http://google.fr</code>) due to the
    637   complexity of actually restricting such a match to only the desired domains.
    638 </p>
    639 <p>
    640   For the example of <code>http://google.*/*</code>, the Google domains would
    641   be matched, but so would <code>http://google.someotherdomain.com</code>.
    642   Additionally, many sites do not own all of the TLDs for their
    643   domain.  For an example, assume you want to use
    644   <code>http://example.*/*</code> to match <code>http://example.com</code> and
    645   <code>http://example.es</code>, but <code>http://example.net</code> is a
    646   hostile site.  If your extension has a bug, the hostile site could potentially
    647   attack your extension in order to get access to your extension's increased
    648   privileges.
    649 </p>
    650 <p>
    651   You should explicitly enumerate the TLDs that you wish to run
    652   your extension on.
    653 </p>
    654 
    655 <h3 id="faq-management">Why does the management API not fire events when my
    656   extension is installed/uninstalled?</h3>
    657 <p>
    658   The <a href="management.html">management API</a> was intended to help create
    659   new tab page replacement extensions.  It was not intended to fire
    660   install/uninstall events for the current extension.
    661 </p>
    662 
    663 <h3 id="faq-firstrun">How can an extension determine whether it is running for
    664   the first time?</h3>
    665 <p>
    666   An extension can check to see whether it is running for the first time by
    667   checking for the presence of a value in localStorage, and writing the value if
    668   it does not exist. For example:
    669 </p>
    670 
    671 <pre>var firstRun = (localStorage['firstRun'] == 'true');
    672 if (!firstRun) {
    673   localStorage['firstRun'] = 'true';
    674 }</pre>
    675 
    676 <p>
    677   Note that this check should be run in a background page, not a content script.
    678 </p>
    679 
    680 
    681 <h2>Features and bugs</h2>
    682 
    683 
    684 <h3 id="faq-fea-01">I think I've found a bug! How do I make sure it gets
    685   fixed?</h3>
    686 <p>
    687   While developing an extension, you may find behavior that does not
    688   match the extensions documentation and may be the result of a bug in
    689   Chrome.  The best thing to do is to make sure an appropriate issue
    690   report is filed, and the Chromium team has enough information to reproduce
    691   the behavior.
    692 </p>
    693 
    694 <p>The steps you should follow to ensure this are:</p>
    695 
    696 <ol>
    697   <li>
    698     Come up with a <em>minimal</em> test extension that demonstrates the issue
    699     you wish to report.  This extension should have as little code as possible
    700     to demonstrate the buggenerally this should be 100 lines of
    701     code or less.  Many times, developers find that they cannot reproduce their
    702     issues this way, which is a good indicator that the bug is in their own
    703     code.
    704   </li>
    705   <li>
    706     Search the issue tracker at
    707     <a href="http://www.crbug.com">http://www.crbug.com</a> to see whether
    708     someone has reported a similar issue.  Most issues related to
    709     extensions are filed under <strong>Feature=Extensions</strong>, so to
    710     look for an extension bug related to the
    711     chrome.tabs.executeScript function (for example), search for
    712     "<code>Feature=Extensions Type=Bug chrome.tabs.executeScript</code>",
    713     which will give you
    714     <a href="http://code.google.com/p/chromium/issues/list?can=2&q=Feature%3DExtensions+Type%3DBug+chrome.tabs.executeScript&colspec=ID+Stars+Pri+Area+Feature+Type+Status+Summary+Modified+Owner+Mstone+OS&x=mstone&y=area&cells=tiles">
    715     this list of results</a>.
    716   </li>
    717   <li>
    718     If you find a bug that describes your issue, click the star icon to be
    719     notified when the bug receives an update.  <em>Do not respond to the
    720     bug to say "me too" or ask "when will this be fixed?"</em>; such updates
    721     can cause hundreds of emails to be sent.  Add a comment only if you have
    722     information (such as a better test case or a suggested fix) that is likely
    723     to be helpful.
    724   </li>
    725   <li>
    726     If you found no appropriate bug to star, file a new issue report at
    727     <a href="http://new.crbug.com">http://new.crbug.com</a>.  Be as explicit
    728     as possible when filling out this form: choose a descriptive title,
    729     explain the steps to reproduce the bug, and describe the expected and
    730     actual behavior.  Attach your test example to the report and add
    731     screenshots if appropriate.  The easier your report makes it for others
    732     to reproduce your issue, the greater chance that your bug will be fixed
    733     promptly.
    734   </li>
    735   <li>
    736     Wait for the bug to be updated.  Most new bugs are triaged within a week,
    737     although it can sometimes take longer for an update.  <em>Do not reply
    738     to the bug to ask when the issue will be fixed.</em>  If your bug has not
    739     been modified after two weeks, please post a message to the
    740     <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions/topics">
    741     discussion group</a> with a link back to your bug.
    742   </li>
    743   <li>
    744     If you originally reported your bug on the discussion group and were
    745     directed to this FAQ entry, reply to your original thread with a link
    746     to the bug you starred or reported.  This will make it easier for others
    747     experiencing the same issue to find the correct bug.
    748   </li>
    749 </ol>
    750 
    751 <h3 id="faq-fea-02">I have a feature request! How can I report it?</h3>
    752 
    753 <p>If you identify a feature (especially if it's related to an experimental
    754   API) that could be added to improve the extension development experience,
    755   make sure an appropriate request is filed in the issue tracker.</p>
    756 
    757 <p>The steps you should follow to ensure this are:</p>
    758 
    759 <ol>
    760   <li>
    761     Search the issue tracker at
    762     <a href="http://www.crbug.com">http://www.crbug.com</a> to see whether
    763     someone has requested a similar feature.  Most requests related to
    764     extensions are filed under <strong>Feature=Extensions</strong>, so to
    765     look for an extension feature request related to keyboard shortcuts
    766     (for example), search
    767     for "<code>Feature=Extensions Type=Feature shortcuts</code>",
    768     which will give you
    769     <a href="http://code.google.com/p/chromium/issues/list?can=2&q=Feature%3DExtensions+Type%3DFeature+shortcuts&colspec=ID+Stars+Pri+Area+Feature+Type+Status+Summary+Modified+Owner+Mstone+OS&x=mstone&y=area&cells=tiles">
    770     this list of results</a>.
    771   </li>
    772   <li>
    773     If you find a ticket that matches your request, click the star icon to be
    774     notified when the bug receives an update.  <em>Do not respond to the
    775     bug to say "me too" or ask "when will this be implemented?"</em>; such
    776     updates can cause hundreds of emails to be sent.
    777   </li>
    778   <li>
    779     If you found no appropriate ticket to star, file a new request at
    780     <a href="http://new.crbug.com">http://new.crbug.com</a>.  Be as detailed
    781     as possible when filling out this form: choose a descriptive title
    782     and explain exactly what feature you would like and how you plan to use it.
    783   </li>
    784   <li>
    785     Wait for the ticket to be updated.  Most new requests are triaged within a
    786     week, although it can sometimes take longer for an update.  <em>Do not reply
    787     to the ticket to ask when the feature will be added.</em>  If your
    788     ticket has not been modified after two weeks, please post a message to the
    789     <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions/topics">
    790     discussion group</a> with a link back to your request.
    791   </li>
    792   <li>
    793     If you originally reported your request on the discussion group and were
    794     directed to this FAQ entry, reply to your original thread with a link
    795     to the ticket you starred or opened.  This will make it easier for others
    796     with the same request to find the correct ticket.
    797   </li>
    798 </ol>
    799 
    800 </div>
    801 
    802         <!-- API PAGE -->
    803         <div class="apiPage" style="display: none; ">
    804         <a name="apiReference"></a>
    805         <h2>API reference: chrome.apiname </h2>
    806 
    807           <!-- PROPERTIES -->
    808           <div class="apiGroup">
    809             <a name="properties"></a>
    810             <h3 id="properties">Properties</h3>
    811 
    812             <div>
    813               <a></a>
    814               <h4>getLastError</h4>
    815               <div class="summary">
    816                 <!-- Note: intentionally longer 80 columns -->
    817                 <span>chrome.extension</span><span>lastError</span>
    818               </div>
    819               <div>
    820               </div>
    821             </div>
    822 
    823           </div> <!-- /apiGroup -->
    824 
    825           <!-- METHODS -->
    826           <div id="methodsTemplate" class="apiGroup">
    827             <a></a>
    828             <h3>Methods</h3>
    829 
    830             <!-- iterates over all functions -->
    831             <div class="apiItem">
    832               <a></a> <!-- method-anchor -->
    833               <h4>method name</h4>
    834 
    835               <div class="summary"><span>void</span>
    836                   <!-- Note: intentionally longer 80 columns -->
    837                   <span>chrome.module.methodName</span>(<span><span>, </span><span></span>
    838                       <var><span></span></var></span>)</div>
    839 
    840               <div class="description">
    841                 <p class="todo">Undocumented.</p>
    842                 <p>
    843                   A description from the json schema def of the function goes here.
    844                 </p>
    845 
    846                 <!-- PARAMETERS -->
    847                 <h4>Parameters</h4>
    848                 <dl>
    849                   <div>
    850                     <div>
    851                     </div>
    852                   </div>
    853                 </dl>
    854 
    855                 <!-- RETURNS -->
    856                 <h4>Returns</h4>
    857                 <dl>
    858                   <div>
    859                     <div>
    860                     </div>
    861                   </div>
    862                 </dl>
    863 
    864                 <!-- CALLBACK -->
    865                 <div>
    866                   <div>
    867                   <h4>Callback function</h4>
    868                   <p>
    869                     The callback <em>parameter</em> should specify a function
    870                     that looks like this:
    871                   </p>
    872                   <p>
    873                     If you specify the <em>callback</em> parameter, it should
    874                     specify a function that looks like this:
    875                   </p>
    876 
    877                   <!-- Note: intentionally longer 80 columns -->
    878                   <pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre>
    879                   <dl>
    880                     <div>
    881                       <div>
    882                       </div>
    883                     </div>
    884                   </dl>
    885                   </div>
    886                 </div>
    887 
    888                 <!-- MIN_VERSION -->
    889                 <p>
    890                   This function was added in version <b><span></span></b>.
    891                   If you require this function, the manifest key
    892                   <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
    893                   can ensure that your extension won't be run in an earlier browser version.
    894                 </p>
    895               </div> <!-- /description -->
    896 
    897             </div>  <!-- /apiItem -->
    898 
    899           </div>  <!-- /apiGroup -->
    900 
    901           <!-- EVENTS -->
    902           <div id="eventsTemplate" class="apiGroup">
    903             <a></a>
    904             <h3>Events</h3>
    905             <!-- iterates over all events -->
    906             <div class="apiItem">
    907               <a></a>
    908               <h4>event name</h4>
    909 
    910               <div class="summary">
    911                 <!-- Note: intentionally longer 80 columns -->
    912                 <span class="subdued">chrome.bookmarks</span><span>onEvent</span><span class="subdued">.addListener</span>(function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>);
    913               </div>
    914 
    915               <div class="description">
    916                 <p class="todo">Undocumented.</p>
    917                 <p>
    918                   A description from the json schema def of the event goes here.
    919                 </p>
    920 
    921                 <!-- PARAMETERS -->
    922                 <div>
    923                   <h4>Parameters</h4>
    924                   <dl>
    925                     <div>
    926                       <div>
    927                       </div>
    928                     </div>
    929                   </dl>
    930                 </div>
    931               </div> <!-- /decription -->
    932 
    933             </div> <!-- /apiItem -->
    934 
    935           </div> <!-- /apiGroup -->
    936 
    937           <!-- TYPES -->
    938           <div class="apiGroup">
    939             <a name="types"></a>
    940             <h3 id="types">Types</h3>
    941 
    942             <!-- iterates over all types -->
    943             <div class="apiItem">
    944               <a></a>
    945               <h4>type name</h4>
    946 
    947               <div>
    948               </div>
    949 
    950             </div> <!-- /apiItem -->
    951 
    952           </div> <!-- /apiGroup -->
    953 
    954         </div> <!-- /apiPage -->
    955       </div> <!-- /gc-pagecontent -->
    956     </div> <!-- /g-section -->
    957   </div> <!-- /codesiteContent -->
    958     <div id="gc-footer" --="">
    959       <div class="text">
    960   <p>
    961   Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>,
    962   the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons
    963   Attribution 3.0 License</a>, and code samples are licensed under the
    964   <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
    965   </p>
    966   <p>
    967   2011 Google
    968   </p>
    969 
    970 <!-- begin analytics -->
    971 <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
    972 <script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
    973 
    974 <script type="text/javascript">
    975   // chrome doc tracking
    976   try {
    977     var engdocs = _gat._getTracker("YT-10763712-2");
    978     engdocs._trackPageview();
    979   } catch(err) {}
    980 
    981   // code.google.com site-wide tracking
    982   try {
    983     _uacct="UA-18071-1";
    984     _uanchor=1;
    985     _uff=0;
    986     urchinTracker();
    987   }
    988   catch(e) {/* urchinTracker not available. */}
    989 </script>
    990 <!-- end analytics -->
    991       </div>
    992     </div> <!-- /gc-footer -->
    993   </div> <!-- /gc-container -->
    994 </body></html>
    995