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>NPAPI Plugins - 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 class="leftNavSelected">NPAPI Plugins</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">NPAPI Plugins</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">NPAPI Plugins</div> 316 317<p> 318Leveraging HTML and JavaScript 319makes developing new extensions really easy, 320but what if you have existing legacy or proprietary code 321that you want to reuse in your extension? 322You can bundle an NPAPI plugin with your extension, 323allowing you to call into native binary code from JavaScript. 324</p> 325 326<h2>Warning</h2> 327 328<p align="center"><b>NPAPI is a really big hammer that should only be used when no other approach will work.</b> 329 330</p><p>Code running in an NPAPI plugin has the full permissions of the current user and is not sandboxed or shielded from malicious input by Google Chrome in any way. You should be especially cautious when processing input from untrusted sources, such as when working with <a href="content_scripts.html#security-considerations">content scripts</a> or XMLHttpRequest. 331 332</p><p>Because of the additional security risks NPAPI poses to users, extensions that use it will require manual review before being accepted in the 333<a href="https://chrome.google.com/webstore">web store</a> or 334<a href="https://chrome.google.com/extensions">extension gallery</a>. 335 336</p><h2>Details</h2> 337 338<p> 339How to develop an NPAPI plugin is outside the scope of this document. 340See <a href="https://developer.mozilla.org/en/Plugins">Mozilla's 341NPAPI plugin reference</a> for information on how to do that. 342</p> 343 344<p> 345Once you have an NPAPI plugin, 346follow these steps to get your extension using it. 347</p> 348 349<ol> 350 <li> 351 Add a section to your extension's <code>manifest.json</code> 352 that describes where to find the plugin, 353 along with other properties about it: 354 355<pre>{ 356 "name": "My extension", 357 ... 358 <b>"plugins": [ 359 { "path": "content_plugin.dll", "public": true }, 360 { "path": "extension_plugin.dll" } 361 ]</b>, 362 ... 363}</pre> 364 365 <p> 366 The "path" property specifies the path to your plugin, 367 relative to the manifest file. 368 The "public" property specifies whether 369 your plugin can be accessed by regular web pages; 370 the default is false, 371 meaning only your extension can load the plugin. 372 </p> 373 </li> 374 375 <li> 376 Create an HTML file that loads your plugin by mime-type. 377 Assuming your mime-type is "application/x-my-extension": 378 379<pre><embed type="application/x-my-extension" id="pluginId"> 380<script> 381 var plugin = document.getElementById("pluginId"); 382 var result = plugin.myPluginMethod(); // call a method in your plugin 383 console.log("my plugin returned: " + result); 384</script></pre> 385 386 <p> 387 This can be inside a background page 388 or any other HTML page used by your extension. 389 If your plugin is "public", 390 you can even use a content script to programmatically 391 insert your plugin into a web page. 392 </p> 393 </li> 394</ol> 395 396<h2 id="security-considerations">Security considerations</h2> 397 398<p> 399Including an NPAPI plugin in your extension is dangerous because plugins 400have unrestricted access to the local machine. If your plugin contains 401a vulnerability, an attacker might be able to exploit that vulnerability 402to install malicious software on the user's machine. Instead, avoid 403including an NPAPI plugin whenever possible. 404</p> 405 406<p> 407Marking your NPAPI plugin "public" increase the attack surface of your 408extension because the plugin is exposed directly to web content, making 409it easier for a malicious web site to manipulate your plugin. Instead, 410avoid making your NPAPI plugin public whenever possible. 411</p> 412 413</div> 414 415 <!-- API PAGE --> 416 <div class="apiPage" style="display: none; "> 417 <a name="apiReference"></a> 418 <h2>API reference: chrome.apiname </h2> 419 420 <!-- PROPERTIES --> 421 <div class="apiGroup"> 422 <a name="properties"></a> 423 <h3 id="properties">Properties</h3> 424 425 <div> 426 <a></a> 427 <h4>getLastError</h4> 428 <div class="summary"> 429 <!-- Note: intentionally longer 80 columns --> 430 <span>chrome.extension</span><span>lastError</span> 431 </div> 432 <div> 433 </div> 434 </div> 435 436 </div> <!-- /apiGroup --> 437 438 <!-- METHODS --> 439 <div id="methodsTemplate" class="apiGroup"> 440 <a></a> 441 <h3>Methods</h3> 442 443 <!-- iterates over all functions --> 444 <div class="apiItem"> 445 <a></a> <!-- method-anchor --> 446 <h4>method name</h4> 447 448 <div class="summary"><span>void</span> 449 <!-- Note: intentionally longer 80 columns --> 450 <span>chrome.module.methodName</span>(<span><span>, </span><span></span> 451 <var><span></span></var></span>)</div> 452 453 <div class="description"> 454 <p class="todo">Undocumented.</p> 455 <p> 456 A description from the json schema def of the function goes here. 457 </p> 458 459 <!-- PARAMETERS --> 460 <h4>Parameters</h4> 461 <dl> 462 <div> 463 <div> 464 </div> 465 </div> 466 </dl> 467 468 <!-- RETURNS --> 469 <h4>Returns</h4> 470 <dl> 471 <div> 472 <div> 473 </div> 474 </div> 475 </dl> 476 477 <!-- CALLBACK --> 478 <div> 479 <div> 480 <h4>Callback function</h4> 481 <p> 482 The callback <em>parameter</em> should specify a function 483 that looks like this: 484 </p> 485 <p> 486 If you specify the <em>callback</em> parameter, it should 487 specify a function that looks like this: 488 </p> 489 490 <!-- Note: intentionally longer 80 columns --> 491 <pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre> 492 <dl> 493 <div> 494 <div> 495 </div> 496 </div> 497 </dl> 498 </div> 499 </div> 500 501 <!-- MIN_VERSION --> 502 <p> 503 This function was added in version <b><span></span></b>. 504 If you require this function, the manifest key 505 <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> 506 can ensure that your extension won't be run in an earlier browser version. 507 </p> 508 </div> <!-- /description --> 509 510 </div> <!-- /apiItem --> 511 512 </div> <!-- /apiGroup --> 513 514 <!-- EVENTS --> 515 <div id="eventsTemplate" class="apiGroup"> 516 <a></a> 517 <h3>Events</h3> 518 <!-- iterates over all events --> 519 <div class="apiItem"> 520 <a></a> 521 <h4>event name</h4> 522 523 <div class="summary"> 524 <!-- Note: intentionally longer 80 columns --> 525 <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>); 526 </div> 527 528 <div class="description"> 529 <p class="todo">Undocumented.</p> 530 <p> 531 A description from the json schema def of the event goes here. 532 </p> 533 534 <!-- PARAMETERS --> 535 <div> 536 <h4>Parameters</h4> 537 <dl> 538 <div> 539 <div> 540 </div> 541 </div> 542 </dl> 543 </div> 544 </div> <!-- /decription --> 545 546 </div> <!-- /apiItem --> 547 548 </div> <!-- /apiGroup --> 549 550 <!-- TYPES --> 551 <div class="apiGroup"> 552 <a name="types"></a> 553 <h3 id="types">Types</h3> 554 555 <!-- iterates over all types --> 556 <div class="apiItem"> 557 <a></a> 558 <h4>type name</h4> 559 560 <div> 561 </div> 562 563 </div> <!-- /apiItem --> 564 565 </div> <!-- /apiGroup --> 566 567 </div> <!-- /apiPage --> 568 </div> <!-- /gc-pagecontent --> 569 </div> <!-- /g-section --> 570 </div> <!-- /codesiteContent --> 571 <div id="gc-footer" --=""> 572 <div class="text"> 573 <p> 574 Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>, 575 the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons 576 Attribution 3.0 License</a>, and code samples are licensed under the 577 <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>. 578 </p> 579 <p> 580 ©2011 Google 581 </p> 582 583<!-- begin analytics --> 584<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script> 585<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script> 586 587<script type="text/javascript"> 588 // chrome doc tracking 589 try { 590 var engdocs = _gat._getTracker("YT-10763712-2"); 591 engdocs._trackPageview(); 592 } catch(err) {} 593 594 // code.google.com site-wide tracking 595 try { 596 _uacct="UA-18071-1"; 597 _uanchor=1; 598 _uff=0; 599 urchinTracker(); 600 } 601 catch(e) {/* urchinTracker not available. */} 602</script> 603<!-- end analytics --> 604 </div> 605 </div> <!-- /gc-footer --> 606 </div> <!-- /gc-container --> 607</body></html> 608