Compare Revisions

Building an extension

Revision 33504:

Revision 33504 by Anthony d93 on

Revision 33505:

Revision 33505 by Anthony d93 on

Building an extension
Building an extension
NeedsTechnicalReview, Extensions, Add-ons, NeedsEditorialReview, NeedsUpdate
NeedsTechnicalReview, Extensions, Add-ons, NeedsEditorialReview, NeedsUpdate

Revision 33504
Revision 33505
nn280    </div>
280      <h4 name="Package">281    <h4 name="Package">
281        Package282      Package
282      </h4>283    </h4>
283      <p>284    <p>
284        Now that your extension works, you can <a href="en/Extens285      Now that your extension works, you can <a href="en/Extensio
>ion_Packaging">package</a> it for deployment and installation.>n_Packaging">package</a> it for deployment and installation.
285      </p>286    </p>
286      <p>287    <p>
287        Zip up the <b>contents</b> of your extension's folder (no288      Zip up the <b>contents</b> of your extension's folder (not 
>t the extension folder itself), and rename the zip file to have a>the extension folder itself), and rename the zip file to have a .
> .xpi extension. In Windows XP, you can do this easily by selecti>xpi extension. In Windows XP, you can do this easily by selecting
>ng all the files and subfolders in your extension folder, right c> all the files and subfolders in your extension folder, right cli
>lick and choose "Send To -&gt; Compressed (Zipped) Folder". A .zi>ck and choose "Send To -&gt; Compressed (Zipped) Folder". A .zip 
>p file will be created for you. Just rename it and you're done!>file will be created for you. Just rename it and you're done!
288      </p>289    </p>
289      <p>290    <p>
290        On Mac OS X, you can right-click on the <b>contents</b> o291      On Mac OS X, you can right-click on the <b>contents</b> of 
>f the extension's folder and choose "Create Archive of..." to mak>the extension's folder and choose "Create Archive of..." to make 
>e the zip file. However, since Mac OS X adds hidden files to fold>the zip file. However, since Mac OS X adds hidden files to folder
>ers in order to track file metadata, you should instead use the T>s in order to track file metadata, you should instead use the Ter
>erminal, delete the hidden files (whose names begin with a period>minal, delete the hidden files (whose names begin with a period),
>), and then use the <tt>zip</tt> command on the command line to c> and then use the <tt>zip</tt> command on the command line to cre
>reate the zip file.>ate the zip file.
291      </p>292    </p>
292      <p>293    <p>
293        On Linux, you would likewise use the command-line Zip too294      On Linux, you would likewise use the command-line Zip tool.
294      </p>295    </p>
295      <p>296    <p>
296        If you have the 'Extension Builder' extension installed i297      If you have the 'Extension Builder' extension installed it 
>t can compile the .xpi file for you (Tools -&gt; Extension Develo>can compile the .xpi file for you (Tools -&gt; Extension Develope
>per -&gt; Extension Builder). Merely navigate to the directory wh>r -&gt; Extension Builder). Merely navigate to the directory wher
>ere your extension is (install.rdf etc.), and hit the Build Exten>e your extension is (install.rdf etc.), and hit the Build Extensi
>sion button. This extension has a slew of tools to make developme>on button. This extension has a slew of tools to make development
>nt easier.> easier.
297      </p>298    </p>
298      <p>299    <p>
299        Now upload the .xpi file to your server, making sure it's300      Now upload the .xpi file to your server, making sure it's s
> served as <tt>application/x-xpinstall</tt>. You can link to it a>erved as <tt>application/x-xpinstall</tt>. You can link to it and
>nd allow people to download and install it in Firefox. For the pu> allow people to download and install it in Firefox. For the purp
>rposes of just testing our .xpi file we can just drag it into the>oses of just testing our .xpi file we can just drag it into the e
> extensions window via Tools -&gt; Extensions, or Tools -&gt; Add>xtensions window via Tools -&gt; Extensions, or Tools -&gt; Add-o
>-ons in FireFox 2.>ns in FireFox 2.
300      </p>301    </p>
301      <h5 name="Installing_from_a_web_page">302    <h5 name="Installing_from_a_web_page">
302        Installing from a web page303      Installing from a web page
303      </h5>304    </h5>
304      <p>305    <p>
305        There are a variety of ways you can install extensions fr306      There are a variety of ways you can install extensions from
>om web pages, including direct linking to the XPI files and using> web pages, including direct linking to the XPI files and using t
> the InstallTrigger object. Extension and web authors are encoura>he InstallTrigger object. Extension and web authors are encourage
>ged to use the <a href="en/Installing_Extensions_and_Themes_From_>d to use the <a href="en/Installing_Extensions_and_Themes_From_We
>Web_Pages">InstallTrigger method</a> to install XPIs, as it provi>b_Pages">InstallTrigger method</a> to install XPIs, as it provide
>des the best experience to users.>s the best experience to users.
306      </p>307    </p>
307      <h5 name="">308    <h5 name="">
308        Using addons.mozilla.org309      Using
309      </h5>310    </h5>
310      <p>311    <p>
311        Mozilla Update is a distribution site where you can host 312      Mozilla Update is a distribution site where you can host yo
>your extension for free. Your extension will be hosted on Mozilla>ur extension for free. Your extension will be hosted on Mozilla's
>'s mirror network to guarantee your download even though it might> mirror network to guarantee your download even though it might b
> be very popular. Mozilla's site also provides users easier insta>e very popular. Mozilla's site also provides users easier install
>llation, and will automatically make your newer versions availabl>ation, and will automatically make your newer versions available 
>e to users of your existing versions when you upload them. In add>to users of your existing versions when you upload them. In addit
>ition Mozilla Update allows users to comment and provide feedback>ion Mozilla Update allows users to comment and provide feedback o
> on your extension. It is highly recommended that you use Mozilla>n your extension. It is highly recommended that you use Mozilla U
> Update to distribute your extensions!>pdate to distribute your extensions!
312      </p>313    </p>
313      <p>314    <p>
314        Visit to create an 315      Visit to create an ac
>account and begin distributing your extensions!>count and begin distributing your extensions!
315      </p>316    </p>
316      <p>317    <p>
317        <i>Note:</i> Your Extension will be passed faster and dow318      <i>Note:</i> Your Extension will be passed faster and downl
>nloaded more if you have a good description and some screenshots >oaded more if you have a good description and some screenshots of
>of the extension in action.> the extension in action.
318      </p>319    </p>
319      <h5 name="Registering_Extensions_in_the_Windows_Registry">320    <h5 name="Registering_Extensions_in_the_Windows_Registry">
320        Registering Extensions in the Windows Registry321      Registering Extensions in the Windows Registry
321      </h5>322    </h5>
322      <p>323    <p>
323        On Windows, information about extensions can be added to 324      On Windows, information about extensions can be added to th
>the registry, and the extensions will automatically be picked up >e registry, and the extensions will automatically be picked up th
>the next time the applications starts. This allows application in>e next time the applications starts. This allows application inst
>stallers to easily add integration hooks as extensions. See <a hr>allers to easily add integration hooks as extensions. See <a href
>ef="en/Adding_Extensions_using_the_Windows_Registry">Adding Exten>="en/Adding_Extensions_using_the_Windows_Registry">Adding Extensi
>sions using the Windows Registry</a> for more information.>ons using the Windows Registry</a> for more information.
324      </p>325    </p>
325      <h4 name="More_on_XUL_Overlays">326    <h4 name="More_on_XUL_Overlays">
326        More on XUL Overlays327      More on XUL Overlays
327      </h4>328    </h4>
328      <p>329    <p>
329        In addition to appending UI widgets to the merge point, y330      In addition to appending UI widgets to the merge point, you
>ou can use XUL fragments within Overlays to:> can use XUL fragments within Overlays to:
330      </p>331    </p>
331      <ul>332    <ul>
332        <li>Modify attributes on the merge point, e.g. <tt>&lt;st333      <li>Modify attributes on the merge point, e.g. <tt>&lt;stat
>atusbar id="status-bar" hidden="true"/&gt;</tt> (hides the status>usbar id="status-bar" hidden="true"/&gt;</tt> (hides the status b
> bar)>ar)
333        </li>334      </li>
334        <li>Remove the merge point from the master document, e.g.335      <li>Remove the merge point from the master document, e.g. <
> <tt>&lt;statusbar id="status-bar" removeelement="true"/&gt;</tt>>tt>&lt;statusbar id="status-bar" removeelement="true"/&gt;</tt>
335        </li>336      </li>
336        <li>Control the position of the inserted widgets:337      <li>Control the position of the inserted widgets:
337        </li>338      </li>
338      </ul>339    </ul>
339      <pre class="eval">340    <pre class="eval">
n346      <h4 name="Creating_New_User_Interface_Components">n347    <h4 name="Creating_New_User_Interface_Components">
347        Creating New User Interface Components348      Creating New User Interface Components
348      </h4>349    </h4>
349      <p>350    <p>
350        You can create your own windows and dialog boxes as separ351      You can create your own windows and dialog boxes as separat
>ate .xul files, provide functionality by implementing user action>e .xul files, provide functionality by implementing user actions 
>s in .js files, using DOM methods to manipulate UI widgets. You c>in .js files, using DOM methods to manipulate UI widgets. You can
>an use style rules in .css files to attach images, set colors etc> use style rules in .css files to attach images, set colors etc.
351      </p>352    </p>
352      <p>353    <p>
353        View the <a href="en/XUL">XUL</a> documentation for more 354      View the <a href="en/XUL">XUL</a> documentation for more re
>resources for XUL developers.>sources for XUL developers.
354      </p>355    </p>
355      <h4 name="Defaults_Files">356    <h4 name="Defaults_Files">
356        Defaults Files357      Defaults Files
357      </h4>358    </h4>
358      <p>359    <p>
359        Defaults files that you use to seed a user's profile with360      Defaults files that you use to seed a user's profile with s
> should be placed in <tt>defaults/</tt> under the root of your ex>hould be placed in <tt>defaults/</tt> under the root of your exte
>tension's folder hierarchy. Default preferences .js files should >nsion's folder hierarchy. Default preferences .js files should be
>be stored in <tt>defaults/preferences/</tt> - when you place them> stored in <tt>defaults/preferences/</tt> - when you place them h
> here they will be automatically loaded by Firefox's preferences >ere they will be automatically loaded by Firefox's preferences sy
>system when it starts so that you can access them using the <a hr>stem when it starts so that you can access them using the <a href
>ef="en/Preferences_API">Preferences API</a>.>="en/Preferences_API">Preferences API</a>.
360      </p>361    </p>
361      <p>362    <p>
362        An example default preference file:363      An example default preference file:
363      </p>364    </p>
364      <pre class="eval">365    <pre class="eval">
n369      <h4 name="XPCOM_Components">n370    <h4 name="XPCOM_Components">
370        XPCOM Components371      XPCOM Components
371      </h4>372    </h4>
372      <p>373    <p>
373        Firefox supports <a href="en/XPCOM">XPCOM</a> components 374      Firefox supports <a href="en/XPCOM">XPCOM</a> components in
>in extensions. You can create your own components easily in JavaS> extensions. You can create your own components easily in JavaScr
>cript or in C++ (using the <a href="en/Gecko_SDK">Gecko SDK</a>).>ipt or in C++ (using the <a href="en/Gecko_SDK">Gecko SDK</a>).
374      </p>375    </p>
375      <p>376    <p>
376        Place all of your .js or .dll files in the <tt>components377      Place all of your .js or .dll files in the <tt>components/<
>/</tt> directory - they are automatically registered the first ti>/tt> directory - they are automatically registered the first time
>me Firefox runs after your extension is installed.> Firefox runs after your extension is installed.
377      </p>378    </p>
378      <p>379    <p>
379        For more information see <a href="en/How_to_Build_an_XPCO380      For more information see <a href="en/How_to_Build_an_XPCOM_
>M_Component_in_Javascript">How to Build an XPCOM Component in Jav>Component_in_Javascript">How to Build an XPCOM Component in Javas
>ascript</a>, <a href="en/How_to_build_a_binary_XPCOM_component_us>cript</a>, <a href="en/How_to_build_a_binary_XPCOM_component_usin
>ing_Visual_Studio">How to build a binary XPCOM component using Vi>g_Visual_Studio">How to build a binary XPCOM component using Visu
>sual Studio</a> and the <a href="en/Creating_XPCOM_Components">Cr>al Studio</a> and the <a href="en/Creating_XPCOM_Components">Crea
>eating XPCOM Components</a> book.>ting XPCOM Components</a> book.
380      </p>381    </p>
381      <h5 name="Application_Command_Line">382    <h5 name="Application_Command_Line">
382        Application Command Line383      Application Command Line
383      </h5>384    </h5>
384      <p>385    <p>
385        One of the possible uses of custom XPCOM components is ad386      One of the possible uses of custom XPCOM components is addi
>ding a command line handler to Firefox or Thunderbird. You can us>ng a command line handler to Firefox or Thunderbird. You can use 
>e this technique to run your extension as an application:>this technique to run your extension as an application:
386      </p>387    </p>
387      <pre class="eval">388    <pre class="eval">
n390      <p>n391    <p>
391        <span class="comment">I should move the useful parts of t392      <span class="comment">I should move the useful parts of thi
>his to the Command Line page. -Nickolay This is done by adding a >s to the Command Line page. -Nickolay This is done by adding a co
>component containing the function... function NSGetModule(comMgr,>mponent containing the function... function NSGetModule(comMgr, f
> fileSpec) { return myAppHandlerModule; } This function is run by>ileSpec) { return myAppHandlerModule; } This function is run by f
> firefox each time firefox is started. Firefox registers the myAp>irefox each time firefox is started. Firefox registers the myAppH
>pHandlerModule's by calling its 'registerSelf()'. Then it obtains>andlerModule's by calling its 'registerSelf()'. Then it obtains t
> the myAppHandlerModule's handler factory via 'getClassObject()'.>he myAppHandlerModule's handler factory via 'getClassObject()'. T
> The handler factory is then used to create the handle using its >he handler factory is then used to create the handle using its 'c
>'createInstance(). Finally, the handle's 'handle(cmdline)' proces>reateInstance(). Finally, the handle's 'handle(cmdline)' processe
>ses the command line cmdline's handleFlagWithParam() and handleFl>s the command line cmdline's handleFlagWithParam() and handleFlag
>ag().</span> See <a href="en/Chrome/Command_Line">Chrome: Command>().</span> See <a href="en/Chrome/Command_Line">Chrome: Command L
> Line</a> and a <a class="external" href="http://forums.mozillazi>ine</a> and a <a class="external" href="http://forums.mozillazine
>">forum discussion</a> for details.>.org/viewtopic.php?t=365297">forum discussion</a> for details.
392      </p>393    </p>
393      <h4 name="Localization">394    <h4 name="Localization">
394        Localization395      Localization
395      </h4>396    </h4>
396      <p>397    <p>
397        To support more than one language, you should separate st398      To support more than one language, you should separate stri
>rings from your content using <a href="en/XUL_Tutorial/Localizati>ngs from your content using <a href="en/XUL_Tutorial/Localization
>on">entities</a> and <a href="en/XUL_Tutorial/Property_Files">str>">entities</a> and <a href="en/XUL_Tutorial/Property_Files">strin
>ing bundles</a>. It is much easier to do this while you are devel>g bundles</a>. It is much easier to do this while you are develop
>oping your extension, rather than come back and do it later!>ing your extension, rather than come back and do it later!
398      </p>399    </p>
399      <p>400    <p>
400        Localization information is stored in the locale director401      Localization information is stored in the locale directory 
>y for the extension. For example, to add a locale to our sample e>for the extension. For example, to add a locale to our sample ext
>xtension, create a directory named "locale" in chrome (where the >ension, create a directory named "locale" in chrome (where the "c
>"content" directory is located) and add the following line to the>ontent" directory is located) and add the following line to the c
> chrome.manifest file:>hrome.manifest file:
401      </p>402    </p>
402      <pre class="eval">403    <pre class="eval">
n405      <p>n406    <p>
406        To create localizable attribute values in XUL, you put th407      To create localizable attribute values in XUL, you put the 
>e values in a <tt>.ent</tt> (or a <tt>.dtd</tt>) file, which shou>values in a <tt>.ent</tt> (or a <tt>.dtd</tt>) file, which should
>ld be placed in the locale directory and looks like this:> be placed in the locale directory and looks like this:
407      </p>408    </p>
408      <pre class="eval">409    <pre class="eval">
n412      <p>n413    <p>
413        And then include it at the top of your XUL document (but 414      And then include it at the top of your XUL document (but un
>underneath the "&lt;?xml version"1.0"?&gt;") like so:>derneath the "&lt;?xml version"1.0"?&gt;") like so:
414      </p>415    </p>
415      <pre class="eval">416    <pre class="eval">
n418      <p>n419    <p>
419        where <code><b>window</b></code> is the <code><a href="en420      where <code><b>window</b></code> is the <code><a href="en/D
>/DOM/element.localName">localName</a></code> value of the root el>OM/element.localName">localName</a></code> value of the root elem
>ement of the XUL document, and the value of the <tt>SYSTEM</tt> p>ent of the XUL document, and the value of the <tt>SYSTEM</tt> pro
>roperty is the chrome URI to the entity file. For our sample exte>perty is the chrome URI to the entity file. For our sample extens
>nsion, the root element is <code><b>overlay</b></code>.>ion, the root element is <code><b>overlay</b></code>.
420      </p>421    </p>
421      <p>422    <p>
422        To use the entities, modify your XUL to look like this:423      To use the entities, modify your XUL to look like this:
423      </p>424    </p>
424      <pre class="eval">425    <pre class="eval">
n427      <p>n428    <p>
428        The Chrome Registry will make sure the entity file is loa429      The Chrome Registry will make sure the entity file is loade
>ded from the localization bundle corresponding to the selected lo>d from the localization bundle corresponding to the selected loca
429      </p>430    </p>
430      <p>431    <p>
431        For strings that you use in script, create a .properties 432      For strings that you use in script, create a .properties fi
>file, a text file that has a string on each line in this format:>le, a text file that has a string on each line in this format:
432      </p>433    </p>
433      <pre class="eval">434    <pre class="eval">
t436      <p>t437    <p>
437        and then use <tt><a href="en/NsIStringBundleService">nsIS438      and then use <tt><a href="en/NsIStringBundleService">nsIStr
>tringBundleService</a></tt>/<tt><a href="en/NsIStringBundle">nsIS>ingBundleService</a></tt>/<tt><a href="en/NsIStringBundle">nsIStr
>tringBundle</a></tt> or the <tt><a class="external" href="http://>ingBundle</a></tt> or the <tt><a class="external" href="http://xu
>gbundle&gt;</a></tt> tag to load the values into script.>undle&gt;</a></tt> tag to load the values into script.
438      </p>439    </p>
439      <h4 name="Understanding_the_Browser">440    <h4 name="Understanding_the_Browser">
440        Understanding the Browser441      Understanding the Browser
441      </h4>442    </h4>
442      <p>443    <p>
443        Use the <a href="en/DOM_Inspector">DOM Inspector</a> (not444      Use the <a href="en/DOM_Inspector">DOM Inspector</a> (not p
> part of the <b>Standard</b> Firefox installation, you must reins>art of the <b>Standard</b> Firefox installation, you must reinsta
>tall with the Custom install path and choose <b>Developer Tools</>ll with the Custom install path and choose <b>Developer Tools</b>
>b> if there is not a "DOM Inspector" item in your browser's Tools> if there is not a "DOM Inspector" item in your browser's Tools m
> menu) to inspect the browser window or any other XUL window you >enu) to inspect the browser window or any other XUL window you wa
>want to extend.>nt to extend.
444      </p>445    </p>
445      <p>446    <p>
446        Use the point-and-click node finder button at the top lef447      Use the point-and-click node finder button at the top left 
>t of the DOM Inspector's toolbar to click on a node in the XUL wi>of the DOM Inspector's toolbar to click on a node in the XUL wind
>ndow visually to select it. When you do this the DOM inspector's >ow visually to select it. When you do this the DOM inspector's DO
>DOM hierarchy tree view will jump to the node you clicked on.>M hierarchy tree view will jump to the node you clicked on.
447      </p>448    </p>
448      <p>449    <p>
449        Use the DOM Inspector's right side panel to discover merg450      Use the DOM Inspector's right side panel to discover merge 
>e points with ids that you can use to insert your elements from o>points with ids that you can use to insert your elements from ove
>verlays. If you cannot discover an element with an id that you ca>rlays. If you cannot discover an element with an id that you can 
>n merge into, you may need to attach a script in your overlay and>merge into, you may need to attach a script in your overlay and i
> insert your elements when the <tt>load</tt> event fires on the m>nsert your elements when the <tt>load</tt> event fires on the mas
>aster XUL window.>ter XUL window.
450      </p>451    </p>
451      <h4 name="Debugging_Extensions">452    <h4 name="Debugging_Extensions">
452        Debugging Extensions453      Debugging Extensions
453      </h4>454    </h4>
454      <p>455    <p>
455        <b>Analytical Tools for Debugging</b>456      <b>Analytical Tools for Debugging</b>
456      </p>457    </p>
457      <ul>458    <ul>
458        <li>The <a href="en/DOM_Inspector">DOM Inspector</a> - in459      <li>The <a href="en/DOM_Inspector">DOM Inspector</a> - insp
>spect attributes, DOM structure, CSS style rules that are in effe>ect attributes, DOM structure, CSS style rules that are in effect
>ct (e.g. find out why your style rules don't seem to be working f> (e.g. find out why your style rules don't seem to be working for
>or an element - an invaluable tool!)> an element - an invaluable tool!)
459        </li>460      </li>
460        <li>461      <li>
461          <a href="en/Venkman">Venkman</a> - set breakpoints in J462        <a href="en/Venkman">Venkman</a> - set breakpoints in Jav
>avaScript and inspect call stacks>aScript and inspect call stacks
462        </li>463      </li>
463        <li>464      <li>
464          <code><a href="en/Core_JavaScript_1.5_Reference/Objects465        <code><a href="en/Core_JavaScript_1.5_Reference/Objects/F
>/Function/arguments/callee">arguments.callee</a>.<a href="en/Core>unction/arguments/callee">arguments.callee</a>.<a href="en/Core_J
>de> in JavaScript - access a function's call stack>> in JavaScript - access a function's call stack
465        </li>466      </li>
466      </ul>467    </ul>
467      <p>468    <p>
468        <b>printf debugging</b>469      <b>printf debugging</b>
469      </p>470    </p>
470      <ul>471    <ul>
471        <li>Run Firefox with <tt>-console</tt> at the command lin472      <li>Run Firefox with <tt>-console</tt> at the command line 
>e and use <code><a href="en/DOM/window.dump">dump</a>("string")</>and use <code><a href="en/DOM/window.dump">dump</a>("string")</co
>code> (see the link for details)>de> (see the link for details)
472        </li>473      </li>
473        <li>Use <code><a href="en/NsIConsoleService">nsIConsoleSe474      <li>Use <code><a href="en/NsIConsoleService">nsIConsoleServ
>rvice</a></code> to log to the JavaScript console>ice</a></code> to log to the JavaScript console
474        </li>475      </li>
475      </ul>476    </ul>
476      <p>477    <p>
477        <b>Advanced debugging</b>478      <b>Advanced debugging</b>
478      </p>479    </p>
479      <ul>480    <ul>
480        <li>Run a debug Firefox build and set breakpoints in Fire481      <li>Run a debug Firefox build and set breakpoints in Firefo
>fox itself, or your C++ components. For the experienced developer>x itself, or your C++ components. For the experienced developer, 
>, this is often the fastest way to diagnose a problem. See <a hre>this is often the fastest way to diagnose a problem. See <a href=
>f="en/Build_Documentation">Build Documentation</a> and <a href="e>"en/Build_Documentation">Build Documentation</a> and <a href="en/
>n/Developing_Mozilla">Developing Mozilla</a> for more information>Developing_Mozilla">Developing Mozilla</a> for more information.
481        </li>482      </li>
482        <li>See <a href="en/Debugging_a_XULRunner_Application">De483      <li>See <a href="en/Debugging_a_XULRunner_Application">Debu
>bugging a XULRunner Application</a> for more helpful tips.>gging a XULRunner Application</a> for more helpful tips.
483        </li>484      </li>
484      </ul>485    </ul>
485      <h3 name="Quick_Start">486    <h3 name="Quick_Start">
486        Quick Start487      Quick Start
487      </h3>488    </h3>
488      <p>489    <p>
489        You can use the <a class="external" href="http://ted.miel490      You can use the <a class="external" href="http://ted.mielcz
>">Extension Wizard</a> onlin>">Extension Wizard</a> online 
>e tool to generate a simple extension to work with.>tool to generate a simple extension to work with.
490      </p>491    </p>
491      <p>492    <p>
492        A <a class="external" href="      A <a class="external" href="
>uff/">Hello World extension</a> similar to what you>f/">Hello World extension</a> similar to what you c
> can generate with the Extension Wizard is explained line-by-line>an generate with the Extension Wizard is explained line-by-line i
> in <a class="external" href=">n <a class="external" href="
>tarted_with_extension_development">another tutorial from MozillaZ>rted_with_extension_development">another tutorial from MozillaZin
>ine Knowledge Base</a>.>e Knowledge Base</a>.
493      </p>494    </p>
494      <h3 name="Further_information">495    <h3 name="Further_information">
495        Further information496      Further information
496      </h3>497    </h3>
497      <ul>498    <ul>
498        <li>499      <li>
499          <a href="en/Extension_FAQ">Extension FAQ</a>500        <a href="en/Extension_FAQ">Extension FAQ</a>
500        </li>501      </li>
501        <li>502      <li>
502          <a href="en/Extensions">Extensions</a>503        <a href="en/Extensions">Extensions</a>
503        </li>504      </li>
504      </ul>
505    </div>{{ wiki.languages( { "de": "de/Erweiterung_erstellen", 505    </ul>{{ wiki.languages( { "de": "de/Erweiterung_erstellen", "
>"es": "es/Creando_una_extensi\u00f3n", "fr": "fr/Construire_une_e>es": "es/Creando_una_extensi\u00f3n", "fr": "fr/Construire_une_ex
>xtension", "ja": "ja/Building_an_Extension", "pl": "pl/Tworzymy_r>tension", "ja": "ja/Building_an_Extension", "pl": "pl/Tworzymy_ro
>ozszerzenie", "pt": "pt/Construir_uma_Extens\u00e3o", "it": "it/S>zszerzenie", "pt": "pt/Construir_uma_Extens\u00e3o", "it": "it/Sv
>viluppare_un\'Estensione", "zh-cn": "cn/\u6784\u5efa\u4e00\u4e2a\>iluppare_un\'Estensione", "zh-cn": "cn/\u6784\u5efa\u4e00\u4e2a\u
>u6269\u5c55" } ) }}>6269\u5c55" } ) }}

Back to History