SlideShare a Scribd company logo
1 of 103
Download to read offline
How to Write Your
 First Extension
Bruce Willis Extension
         (Francois Mori/AP Photo)
How to Write Your First Extension

1. Create development proļ¬le
2. Conļ¬guration settings
3. Pointing extension to your dev directory
4. Creating folder structure & ļ¬les
5. Packaging & installing
6. Distributing your add-on
Create Development
       Proļ¬le
Keep a separate Firefox proļ¬le for
     extension development
Windows:
Start menu > Run (Windows key + R).
Write firefox -P and press click OK.

Mac OS X (in Terminal):
Type in /Applications/Firefox.app/
Contents/MacOS/firefox -
profilemanager


Linux (in a terminal):
Use cd to navigate to your Firefox directory and
then enter ./firefox -profilemanager
Pointing Extension to
 Your Development
      Directory
Find your Proļ¬le directory
Windows:

Win XP: C:Documents and Settings[user name]
Application DataMozillaFirefoxProfiles

Vista: C:Users[user   name]AppDataRoaming


Mac OS X (~ = /Users/[user      name]):

~/Library/Application Support/Firefox/Profiles/


Linux:

~/.mozilla/
Go to [Dev Profile]/extensions/ folder
Create empty ļ¬le (no ļ¬le extension!):

brucewillis@robertnyman.com
Point to your extension code, i.e. ļ¬le path:


Windows:

E.g: C:devbrucewillis

Mac/Linux:

E.g: ~/dev/brucewillis/
Conļ¬guration Settings
1. Open Firefox:

  - Have your development proļ¬le as default
  - or Through Proļ¬le Manager

2. Type in about:config
Recommended settings:

javascript.options.showInConsole = true

nglayout.debug.disable_xul_cache = true

browser.dom.window.dump.enabled = true
ā€¢ Optional settings:
  javascript.options.strict = true

  extensions.logging.enabled = true
Creating Folder
Structure & Files
ā€¢ Automatic creation of extension
ā€¢ Extension Developer extension
install.rdf
Information, IDs and metadata
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">



   <Description about="urn:mozilla:install-manifest">

   
    <em:id>brucewillis@robertnyman.com</em:id>

   
    <em:name>Bruce Willis demo extension</em:name>

   
    <em:version>1.0</em:version>

   
    <em:type>2</em:type>

   
    <em:creator>Robert Nyman</em:creator>

    
    <em:description>Finds document headings and replaces them with Die
Hard movie titles</em:description>

   
    <em:homepageURL>http://www.robertnyman.com/</em:homepageURL>

    
    <em:optionsURL>chrome://brucewillis/content/preferences.xul</
em:optionsURL>



   
    <em:targetApplication>

   
    
    <Description>

   
    
    
      <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>

   
    
    
      <em:minVersion>2.0</em:minVersion>

   
    
    
      <em:maxVersion>3.1b2</em:maxVersion>

   
    
    </Description>

   
    </em:targetApplication>

   </Description>
</RDF>
In the Description node
em:id
Your unique developer id, of your own choosing. Has to be the same as the pointer
ļ¬le you previously created, i.e. brucewillis@robertnyman.com

em:name
The name of your extension.

em:version
Current version of your extension.

em:type
The type declares that it is an extension, as opposed to, for instance, a theme.

em:creator
You!

em:description
Describes your extension functionality. Will be shown in the Tools > Add-ons window.

em:homepageURL
The URL of your extensionā€™s web site.

em:optionsURL
The URL to where you will have your ļ¬le for editing options/preferences.
In the Description/
em:TargetApplication node
em:id
The actual id of Firefox: {ec8030f7-c20a-464f-9b0e-13a3a9e97384}. Exchange
this to develop for another app, like Thunderbird.

em:minVersion
The minimum version number of Firefox to run the extension.

em:maxVersion
The maximum version number of Firefox to run the extension.



Valid alternatives for Firefox, Thunderbird etc and their corresponding versions
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">



   <Description about="urn:mozilla:install-manifest">

   
    <em:id>brucewillis@robertnyman.com</em:id>

   
    <em:name>Bruce Willis demo extension</em:name>

   
    <em:version>1.0</em:version>

   
    <em:type>2</em:type>

   
    <em:creator>Robert Nyman</em:creator>

    
    <em:description>Finds document headings and replaces them with Die
Hard movie titles</em:description>

   
    <em:homepageURL>http://www.robertnyman.com/</em:homepageURL>

    
    <em:optionsURL>chrome://brucewillis/content/preferences.xul</
em:optionsURL>



   
    <em:targetApplication>

   
    
    <Description>

   
    
    
      <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>

   
    
    
      <em:minVersion>2.0</em:minVersion>

   
    
    
      <em:maxVersion>3.1b2</em:maxVersion>

   
    
    </Description>

   
    </em:targetApplication>

   </Description>
</RDF>
More information in Install Manifests
chrome.manifest
File references and usage
content     brucewillis    chrome/content/

content     brucewillis    chrome/content/ contentaccessible=yes

overlay chrome://browser/content/browser.xul chrome://
brucewillis/content/browser.xul



locale
      brucewillis
 en-US
 chrome/locale/en-US/



skin
 brucewillis
 classic/1.0 chrome/skin/

style
 chrome://global/content/customizeToolbar.xul
chrome://
brucewillis/skin/skin.css
# Content pointer
content     brucewillis    chrome/content/


# Make content accessible from web pages in Firefox 3
content     brucewillis    chrome/content/ contentaccessible=yes


# Overlay browser skin
overlay chrome://browser/content/browser.xul chrome://
brucewillis/content/browser.xul
# Language versions
locale
      brucewillis
 en-US
 chrome/locale/en-US/
# Setting reference to extension skin
skin
 brucewillis
 classic/1.0 chrome/skin/


# Adding CSS to available toolbar buttons
style
 chrome://global/content/customizeToolbar.xul

 chrome://brucewillis/skin/skin.css
More information in Chrome Manifest
Are you with
 me so far?
chrome content folder
XUL, JavaScript and content CSS
XUL (ā€œZuulā€) -
XML User Interface Language
  http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
ā€¢ browser.xul
ā€¢ bruce-willis.css
ā€¢ bruceWillis.js
ā€¢ preferences.xul
ā€¢ browser.xul
ā€¢ bruce-willis.css
ā€¢ bruceWillis.js
ā€¢ preferences.xul
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://brucewillis/skin/skin.css" type="text/
css"?>
<!DOCTYPE window SYSTEM "chrome://brucewillis/locale/translations.dtd">
<overlay id="sample" xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">

   
    <script src="bruceWillis.js" />

   

   
    <menupopup id="menu_ToolsPopup">

   
    
   <menuitem label="&runbrucewillis;" key="brucewillis-run-
key" oncommand="linkTargetFinder.run()"/>

   
    </menupopup>


   

   
    <keyset>

   
    
   <key id="brucewillis-run-key" modifiers="accel alt shift"
key="B" oncommand="bruceWillis.run()"/>

   
    </keyset>

   

   
    <statusbar id="status-bar">

   
    
   <statusbarpanel id="brucewillis-status-bar-icon"
class="statusbarpanel-iconic" src="chrome://brucewillis/skin/status-
bar.png" tooltiptext="&runbrucewillis;" onclick="bruceWillis.run()" />

   
    </statusbar>

   

   
    <toolbarpalette id="BrowserToolbarPalette">

   
    
   <toolbarbutton id="brucewillis-toolbar-button"
label="Bruce Willis" tooltiptext="&runbrucewillis;"
oncommand="bruceWillis.run()"/>

   
    </toolbarpalette>
</overlay>
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://brucewillis/skin/skin.css" type="text/
css"?>
<!DOCTYPE window SYSTEM "chrome://brucewillis/locale/translations.dtd">
<overlay id="sample" xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
      <script src="bruceWillis.js" />
      <!-- Content -->
</overlay>
<!-- Tools menu option and keyboard shortcut -->
         <menupopup id="menu_ToolsPopup">

   
    
   <menuitem label="&runbrucewillis;" key="brucewillis-run-
key" oncommand="linkTargetFinder.run()"/>

   
    </menupopup>


   
      <keyset>

   
      
   <key id="brucewillis-run-key" modifiers="accel alt shift"
key="B"   oncommand="bruceWillis.run()"/>

   
      </keyset>
<!-- Statusbar icon -->
         <statusbar id="status-bar">

   
    
   <statusbarpanel id="brucewillis-status-bar-icon"
class="statusbarpanel-iconic" src="chrome://brucewillis/skin/status-
bar.png" tooltiptext="&runbrucewillis;" onclick="bruceWillis.run()" />

   
    </statusbar>
<!-- Firefox toolbar button -->

   
    <toolbarpalette id="BrowserToolbarPalette">

   
    
   <toolbarbutton id="brucewillis-toolbar-button"
label="Bruce Willis" tooltiptext="&runbrucewillis;"
oncommand="bruceWillis.run()"/>

   
    </toolbarpalette>
ā€¢ browser.xul
ā€¢ bruce-willis.css
ā€¢ bruceWillis.js
ā€¢ preferences.xul
h1, h2, h3, h4 {

 font-family: Georgia, Times, serif;
}
ā€¢ browser.xul
ā€¢ bruce-willis.css
ā€¢ bruceWillis.js
ā€¢ preferences.xul
var bruceWillis = function () {

      var prefManager = Components.classes["@mozilla.org/preferences-service;
1"].getService(Components.interfaces.nsIPrefBranch);

      return {

      
      init : function () {

      
      
      gBrowser.addEventListener("load", function () {

      
      
      
      var autoRun = prefManager.getBoolPref("extensions.brucewillis.autorun");

      
      
      
      if (autoRun) {

      
      
      
      
      bruceWillis.run();

      
      
      
      }

      
      
      }, false);

      
      },

      
      

      
      run : function () {

      
      
      var head = content.document.getElementsByTagName("head")[0],

      
      
      
      style = content.document.getElementById("bruce-willis-style"),

      
      
      
      h1 = content.document.getElementsByTagName("h1"),

      
      
      
      h2 = content.document.getElementsByTagName("h2"),

      
      
      
      h3 = content.document.getElementsByTagName("h3"),

      
      
      
      h4 = content.document.getElementsByTagName("h4");

      
      

      
      
      if (!style) {

      
      
      
      style = content.document.createElement("link");

      
      
      
      style.id = "brucewillis-style";

      
      
      
      style.type = "text/css";

      
      
      
      style.rel = "stylesheet";

      
      
      
      style.href = "chrome://brucewillis/content/bruce-willis.css";

      
      
      
      head.appendChild(style);

      
      
      }


      
      
      for (var i=0, il=h1.length; i<il; i++) {

      
      
      
      h1[i].textContent = "Die Hard 1";

      
      
      }

      
      

      
      
      for (var i=0, il=h2.length; i<il; i++) {

      
      
      
      h2[i].textContent = "Die Hard 2";

      
      
      }

      
      

      
      
      for (var i=0, il=h3.length; i<il; i++) {

      
      
      
      h3[i].textContent = "Die Hard 3";

      
      
      }

      
      

      
      
      for (var i=0, il=h4.length; i<il; i++) {

      
      
      
      h4[i].textContent = "Die Hard 4";

      
      
      }

      
      }

      };
}();
window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
// Structure - Yahoo JavaScript Module Pattern
var bruceWillis = function () {

    var prefManager = Components.classes["@mozilla.org/preferences-
service;1"].getService(Components.interfaces.nsIPrefBranch);

    return {

    
   init : function () {
             // init method

    
   },

    
   

    
   run : function () {
             // run method

    
   }

    };
}();
window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
// init method

   
    init : function () {

   
    
   gBrowser.addEventListener("load", function () {

   
    
   
    var autoRun =
prefManager.getBoolPref("extensions.brucewillis.autorun");

   
    
   
    if (autoRun) {

   
    
   
    
   bruceWillis.run();

   
    
   
    }

   
    
   }, false);

   
    }
// run method

   
   run : function () {

   
   
    var head = content.document.getElementsByTagName("head")[0],

   
   
    
     style = content.document.getElementById("bruce-willis-style"),

   
   
    
     h1 = content.document.getElementsByTagName("h1"),

   
   
    
     h2 = content.document.getElementsByTagName("h2"),

   
   
    
     h3 = content.document.getElementsByTagName("h3"),

   
   
    
     h4 = content.document.getElementsByTagName("h4");

   
   

   
   
    if (!style) {

   
   
    
     style = content.document.createElement("link");

   
   
    
     style.id = "brucewillis-style";

   
   
    
     style.type = "text/css";

   
   
    
     style.rel = "stylesheet";

   
   
    
     style.href = "chrome://brucewillis/content/bruce-willis.css";

   
   
    
     head.appendChild(style);

   
   
    }


   
   
    for (var i=0, il=h1.length; i<il; i++) {

   
   
    
    h1[i].textContent = "Die Hard 1";

   
   
    }

   
   

   
   
    for (var i=0, il=h2.length; i<il; i++) {

   
   
    
    h2[i].textContent = "Die Hard 2";

   
   
    }

   
   

   
   
    for (var i=0, il=h3.length; i<il; i++) {

   
   
    
    h3[i].textContent = "Die Hard 3";

   
   
    }

   
   

   
   
    for (var i=0, il=h4.length; i<il; i++) {

   
   
    
    h4[i].textContent = "Die Hard 4";

   
   
    }

   
   }
// Run when DOM has loaded
window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
ā€¢ browser.xul
ā€¢ bruce-willis.css
ā€¢ bruceWillis.js
ā€¢ preferences.xul
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<prefwindow
     title="Bruce Willis Preferences"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/
there.is.only.xul">


   <prefpane label="Bruce Willis Preferences">

   
    <preferences>

   
    
   <preference id="brucewillis-autorun"
name="extensions.brucewillis.autorun" type="bool"/>

   
    </preferences>

   

   
    <groupbox>

   
    
   <caption label="Settings"/>

   
    
   <grid>

   
    
   
    <columns>

   
    
   
    
   <column flex="4"/>

   
    
   
    
   <column flex="1"/>

   
    
   
    </columns>

   
    
   
    <rows>

   
    
   
    
   <row>

   
    
   
    
   
    <label control="autorun" value="Autorun"/>

   
    
   
    
   
    <checkbox id="autorun"
preference="brucewillis-autorun"/>

   
    
   
    
   </row>

   
    
   
    </rows>

   
    
   </grid>

   
    </groupbox>

   

   </prefpane>

</prefwindow>
<!-- Connect element to extension preference -->

   
    <preferences>

   
    
   <preference id="brucewillis-autorun"
name="extensions.brucewillis.autorun" type="bool"/>

   
    </preferences>

   


   
   <checkbox id="autorun" preference="brucewillis-autorun"/>
chrome locale folder
Offering localization
translations.dtd:

<!ENTITY runbrucewillis "Run Bruce Willis">
chrome skins folder
Skin your extension with CSS and images
ā€¢ skin.css
ā€¢ status-bar.png
ā€¢ toolbar-button.png
/* skin.css */


/* Style in View > Toolbars > Customize */
#brucewillis-toolbar-button {

   list-style-image: url(chrome://brucewillis/skin/toolbar-
button.png);
}


#brucewillis-status-bar-icon {

   width: 83px;

   margin: 0 5px;
}
/* status-bar.png */
/* toolbar-button.png */
preferences - defaults folder
Setting default extension values
// prefs.js

pref("extensions.brucewillis.autorun", false);
Packaging & Installing
An XPI (ā€œzippyā€) is just a zipped ļ¬le
ZIP the contents of your extension folder
(only the contents, NOT the folder itself)
Windows:

Mark all ļ¬les, right-click and choose:
Send To > Compressed
Rename ZIP ļ¬le to .xpi

Mac OS X/Linux (in Terminal):

Navigate to your extension ļ¬les. Type in:
zip -r BruceWillis.xpi *
Drag your XPI ļ¬le into Firefox - VoilĆ !
What it looks like
Before
After
Distributing Your
    Add-On
addons.mozilla.org
or through secure location (SSL)


Successfully Getting your Addon Reviewed
Downloads
ā€¢ Download Bruce Willis extension
ā€¢ Browse source ļ¬les
ā€¢ Presentation slides at:
  http://robertnyman.com/speaking/
Learn more
Learn by looking at others
In your Proļ¬le folder
What youā€™ve learned
1. Create development proļ¬le
2. Conļ¬guration settings
3. Pointing extension to your dev directory
4. Creating folder structure & ļ¬les
5. Packaging & installing
6. Distributing your add-on
Thatā€™s it!
Robert Nyman
                     robert@robertnyman.com
                      http://robertnyman.com
Images:
    http://www.learningresources.com/product/teachers/shop+by+category/activity+kits/construction/m--8226-
    gears--174-+building+set.do
    http://www.soitenlystooges.com/item.asp?sku=FGSU578
    http://www.ļ¬‚ickr.com/photos/28791486@N03/2700643931/
    http://www.fetasteutgavan.se/blogg/wp/?p=39
    http://www.pixabella.com/plugin/tag/red-hearts
    http://www.woodlands-junior.kent.sch.uk/customs/xmas/calendar/day13.html
    http://www.intercan.org/coordinator_list.asp

More Related Content

What's hot

Cms & wordpress theme development 2011
Cms & wordpress theme development 2011Cms & wordpress theme development 2011
Cms & wordpress theme development 2011Dave Wallace
Ā 
Introduction to WordPress Theme Development
Introduction to WordPress Theme DevelopmentIntroduction to WordPress Theme Development
Introduction to WordPress Theme DevelopmentSitdhibong Laokok
Ā 
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)TaiShunHuang
Ā 
WebMatrix 100-level presentation
WebMatrix 100-level presentationWebMatrix 100-level presentation
WebMatrix 100-level presentationAlice Pang
Ā 
Architecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampArchitecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampDipen Chaudhary
Ā 
Whmcs addon module docs
Whmcs addon module docsWhmcs addon module docs
Whmcs addon module docsquyvn
Ā 
Installing And Configuration for your Wordpress blog
Installing And Configuration for your Wordpress blogInstalling And Configuration for your Wordpress blog
Installing And Configuration for your Wordpress blogigorgentry
Ā 
4.content mgmt
4.content mgmt4.content mgmt
4.content mgmtWingston
Ā 
PSD to WordPress
PSD to WordPressPSD to WordPress
PSD to WordPressNile Flores
Ā 
Fundamental JQuery
Fundamental JQueryFundamental JQuery
Fundamental JQueryAchmad Solichin
Ā 
Death of a Themer
Death of a ThemerDeath of a Themer
Death of a ThemerJames Panton
Ā 
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø Drupal
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø DrupalI use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø Drupal
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø DrupalChris Wu
Ā 
Drupal 8 Theme System: The Backend of Frontend
Drupal 8 Theme System: The Backend of FrontendDrupal 8 Theme System: The Backend of Frontend
Drupal 8 Theme System: The Backend of FrontendAcquia
Ā 
Drupal vs WordPress
Drupal vs WordPressDrupal vs WordPress
Drupal vs WordPressWalter Ebert
Ā 
WordPress Theme Development
WordPress Theme DevelopmentWordPress Theme Development
WordPress Theme DevelopmentWisdmLabs
Ā 
Moodle 3.3 - API Change Overview #mootieuk17
Moodle 3.3 - API Change Overview #mootieuk17Moodle 3.3 - API Change Overview #mootieuk17
Moodle 3.3 - API Change Overview #mootieuk17Dan Poltawski
Ā 
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±NAVER D2
Ā 

What's hot (20)

Hpage
HpageHpage
Hpage
Ā 
Creating a basic joomla
Creating a basic joomlaCreating a basic joomla
Creating a basic joomla
Ā 
Cms & wordpress theme development 2011
Cms & wordpress theme development 2011Cms & wordpress theme development 2011
Cms & wordpress theme development 2011
Ā 
CustomThesis
CustomThesisCustomThesis
CustomThesis
Ā 
Introduction to WordPress Theme Development
Introduction to WordPress Theme DevelopmentIntroduction to WordPress Theme Development
Introduction to WordPress Theme Development
Ā 
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)
PHPčؘåø³ē¶²é ę•™ę(ē¬¬äø€é ę˜Æē©ŗē™½ēš„)
Ā 
WebMatrix 100-level presentation
WebMatrix 100-level presentationWebMatrix 100-level presentation
WebMatrix 100-level presentation
Ā 
Architecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal CampArchitecture of Drupal - Drupal Camp
Architecture of Drupal - Drupal Camp
Ā 
Whmcs addon module docs
Whmcs addon module docsWhmcs addon module docs
Whmcs addon module docs
Ā 
Installing And Configuration for your Wordpress blog
Installing And Configuration for your Wordpress blogInstalling And Configuration for your Wordpress blog
Installing And Configuration for your Wordpress blog
Ā 
4.content mgmt
4.content mgmt4.content mgmt
4.content mgmt
Ā 
PSD to WordPress
PSD to WordPressPSD to WordPress
PSD to WordPress
Ā 
Fundamental JQuery
Fundamental JQueryFundamental JQuery
Fundamental JQuery
Ā 
Death of a Themer
Death of a ThemerDeath of a Themer
Death of a Themer
Ā 
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø Drupal
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø DrupalI use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø Drupal
I use drupal / ꈑę˜Æ ļ¼Æļ¼Æ åø«ļ¼Œęˆ‘ē”Ø Drupal
Ā 
Drupal 8 Theme System: The Backend of Frontend
Drupal 8 Theme System: The Backend of FrontendDrupal 8 Theme System: The Backend of Frontend
Drupal 8 Theme System: The Backend of Frontend
Ā 
Drupal vs WordPress
Drupal vs WordPressDrupal vs WordPress
Drupal vs WordPress
Ā 
WordPress Theme Development
WordPress Theme DevelopmentWordPress Theme Development
WordPress Theme Development
Ā 
Moodle 3.3 - API Change Overview #mootieuk17
Moodle 3.3 - API Change Overview #mootieuk17Moodle 3.3 - API Change Overview #mootieuk17
Moodle 3.3 - API Change Overview #mootieuk17
Ā 
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±
C3 ģ›¹źø°ģˆ ė”œė§Œė“œėŠ”ėŖØė°”ģ¼ģ•±
Ā 

Viewers also liked

Place graphs are the new social graphs
Place graphs are the new social graphsPlace graphs are the new social graphs
Place graphs are the new social graphsMatt Biddulph
Ā 
How to do presentations that don't induce suicide
How to do presentations that don't induce suicideHow to do presentations that don't induce suicide
How to do presentations that don't induce suicideAndy Whitlock
Ā 
Spanish translation (my school day)
Spanish translation (my school day)Spanish translation (my school day)
Spanish translation (my school day)tc776618mhs
Ā 
Testo Instruments 2012 overview
Testo Instruments 2012 overviewTesto Instruments 2012 overview
Testo Instruments 2012 overviewTesto Limited
Ā 
Struts2 - 101
Struts2 - 101Struts2 - 101
Struts2 - 101Munish Gupta
Ā 
Assgn. 1 essay question traditional houses
Assgn. 1 essay question   traditional housesAssgn. 1 essay question   traditional houses
Assgn. 1 essay question traditional housessuehwa533
Ā 
Extending the Virtual World Framework for Mobile Training
Extending the Virtual World Framework for Mobile TrainingExtending the Virtual World Framework for Mobile Training
Extending the Virtual World Framework for Mobile TrainingRonald Punako, Jr.
Ā 
The home and the world
The home and the worldThe home and the world
The home and the worldRoyB
Ā 
Environmental graphics
Environmental graphicsEnvironmental graphics
Environmental graphicsReZonant Design
Ā 
Perubahan entalpi reaksi menggunakan kalorimeter sederhana
Perubahan entalpi reaksi menggunakan kalorimeter sederhanaPerubahan entalpi reaksi menggunakan kalorimeter sederhana
Perubahan entalpi reaksi menggunakan kalorimeter sederhanaSabrianah Badaruddin
Ā 
Vulva hygiene
Vulva hygieneVulva hygiene
Vulva hygienerisdiana21
Ā 
Value analysis and Value Engineering in Cost Control
Value analysis and Value Engineering in Cost ControlValue analysis and Value Engineering in Cost Control
Value analysis and Value Engineering in Cost Controlsunilrajpawar
Ā 
a manual of wood-Carving.
a manual of wood-Carving.a manual of wood-Carving.
a manual of wood-Carving.zuhairbuzid
Ā 
Confucius on Leadership
Confucius on LeadershipConfucius on Leadership
Confucius on LeadershipRichard Brown
Ā 
Challenges in Implementing EMR: The Singapore Story
Challenges in Implementing EMR: The Singapore StoryChallenges in Implementing EMR: The Singapore Story
Challenges in Implementing EMR: The Singapore StoryApollo Hospitals Group and ATNF
Ā 
iPhone Coding For Web Developers
iPhone Coding For Web DevelopersiPhone Coding For Web Developers
iPhone Coding For Web DevelopersMatt Biddulph
Ā 
Gestion TTHH Contexto y Funciones
Gestion TTHH Contexto y FuncionesGestion TTHH Contexto y Funciones
Gestion TTHH Contexto y Funcionesuniversidadvirtual
Ā 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP LondonRicard Clau
Ā 

Viewers also liked (20)

Place graphs are the new social graphs
Place graphs are the new social graphsPlace graphs are the new social graphs
Place graphs are the new social graphs
Ā 
Ā 
How to do presentations that don't induce suicide
How to do presentations that don't induce suicideHow to do presentations that don't induce suicide
How to do presentations that don't induce suicide
Ā 
Spanish translation (my school day)
Spanish translation (my school day)Spanish translation (my school day)
Spanish translation (my school day)
Ā 
Testo Instruments 2012 overview
Testo Instruments 2012 overviewTesto Instruments 2012 overview
Testo Instruments 2012 overview
Ā 
Struts2 - 101
Struts2 - 101Struts2 - 101
Struts2 - 101
Ā 
Assgn. 1 essay question traditional houses
Assgn. 1 essay question   traditional housesAssgn. 1 essay question   traditional houses
Assgn. 1 essay question traditional houses
Ā 
Extending the Virtual World Framework for Mobile Training
Extending the Virtual World Framework for Mobile TrainingExtending the Virtual World Framework for Mobile Training
Extending the Virtual World Framework for Mobile Training
Ā 
The home and the world
The home and the worldThe home and the world
The home and the world
Ā 
Environmental graphics
Environmental graphicsEnvironmental graphics
Environmental graphics
Ā 
Perubahan entalpi reaksi menggunakan kalorimeter sederhana
Perubahan entalpi reaksi menggunakan kalorimeter sederhanaPerubahan entalpi reaksi menggunakan kalorimeter sederhana
Perubahan entalpi reaksi menggunakan kalorimeter sederhana
Ā 
Vulva hygiene
Vulva hygieneVulva hygiene
Vulva hygiene
Ā 
Value analysis and Value Engineering in Cost Control
Value analysis and Value Engineering in Cost ControlValue analysis and Value Engineering in Cost Control
Value analysis and Value Engineering in Cost Control
Ā 
a manual of wood-Carving.
a manual of wood-Carving.a manual of wood-Carving.
a manual of wood-Carving.
Ā 
Confucius on Leadership
Confucius on LeadershipConfucius on Leadership
Confucius on Leadership
Ā 
Brincar+ vygotsky
Brincar+ vygotskyBrincar+ vygotsky
Brincar+ vygotsky
Ā 
Challenges in Implementing EMR: The Singapore Story
Challenges in Implementing EMR: The Singapore StoryChallenges in Implementing EMR: The Singapore Story
Challenges in Implementing EMR: The Singapore Story
Ā 
iPhone Coding For Web Developers
iPhone Coding For Web DevelopersiPhone Coding For Web Developers
iPhone Coding For Web Developers
Ā 
Gestion TTHH Contexto y Funciones
Gestion TTHH Contexto y FuncionesGestion TTHH Contexto y Funciones
Gestion TTHH Contexto y Funciones
Ā 
Redis everywhere - PHP London
Redis everywhere - PHP LondonRedis everywhere - PHP London
Redis everywhere - PHP London
Ā 

Similar to How To Write Your First Firefox Extension

Polymer 1.0
Polymer 1.0Polymer 1.0
Polymer 1.0Cyril Balit
Ā 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and ImprovedTimothy Fisher
Ā 
JavaScript DOM - Dynamic interactive Code
JavaScript DOM - Dynamic interactive CodeJavaScript DOM - Dynamic interactive Code
JavaScript DOM - Dynamic interactive CodeLaurence Svekis āœ”
Ā 
How to create a basic template
How to create a basic templateHow to create a basic template
How to create a basic templatevathur
Ā 
Yuihacku iitd-sumana
Yuihacku iitd-sumanaYuihacku iitd-sumana
Yuihacku iitd-sumanaSumana Hariharan
Ā 
Cliw - extension development
Cliw -  extension developmentCliw -  extension development
Cliw - extension developmentvicccuu
Ā 
Flask ā€“ Python
Flask ā€“ PythonFlask ā€“ Python
Flask ā€“ PythonMax Claus Nunes
Ā 
Joomla Beginner Template Presentation
Joomla Beginner Template PresentationJoomla Beginner Template Presentation
Joomla Beginner Template Presentationalledia
Ā 
Web development - technologies and tools
Web development - technologies and toolsWeb development - technologies and tools
Web development - technologies and toolsYoann Gotthilf
Ā 
Advanced Thesis Techniques and Tricks
Advanced Thesis Techniques and TricksAdvanced Thesis Techniques and Tricks
Advanced Thesis Techniques and TricksBrad Williams
Ā 
Building Potent WordPress Websites
Building Potent WordPress WebsitesBuilding Potent WordPress Websites
Building Potent WordPress WebsitesKyle Cearley
Ā 
The Thinking behind BEM
The Thinking behind BEMThe Thinking behind BEM
The Thinking behind BEMVarya Stepanova
Ā 
HTML & CSS 2017
HTML & CSS 2017HTML & CSS 2017
HTML & CSS 2017Colin Loretz
Ā 
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...Roni Banerjee
Ā 
Ember: Guts & Goals
Ember: Guts & GoalsEmber: Guts & Goals
Ember: Guts & GoalsBob Lail
Ā 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3McSoftsis
Ā 
How to make a WordPress theme
How to make a WordPress themeHow to make a WordPress theme
How to make a WordPress themeHardeep Asrani
Ā 
WordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 NepalWordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 NepalChandra Prakash Thapa
Ā 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsAlessandro Molina
Ā 

Similar to How To Write Your First Firefox Extension (20)

Polymer 1.0
Polymer 1.0Polymer 1.0
Polymer 1.0
Ā 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and Improved
Ā 
JavaScript DOM - Dynamic interactive Code
JavaScript DOM - Dynamic interactive CodeJavaScript DOM - Dynamic interactive Code
JavaScript DOM - Dynamic interactive Code
Ā 
How to create a basic template
How to create a basic templateHow to create a basic template
How to create a basic template
Ā 
Yuihacku iitd-sumana
Yuihacku iitd-sumanaYuihacku iitd-sumana
Yuihacku iitd-sumana
Ā 
Cliw - extension development
Cliw -  extension developmentCliw -  extension development
Cliw - extension development
Ā 
Flask ā€“ Python
Flask ā€“ PythonFlask ā€“ Python
Flask ā€“ Python
Ā 
Joomla Beginner Template Presentation
Joomla Beginner Template PresentationJoomla Beginner Template Presentation
Joomla Beginner Template Presentation
Ā 
Create a landing page
Create a landing pageCreate a landing page
Create a landing page
Ā 
Web development - technologies and tools
Web development - technologies and toolsWeb development - technologies and tools
Web development - technologies and tools
Ā 
Advanced Thesis Techniques and Tricks
Advanced Thesis Techniques and TricksAdvanced Thesis Techniques and Tricks
Advanced Thesis Techniques and Tricks
Ā 
Building Potent WordPress Websites
Building Potent WordPress WebsitesBuilding Potent WordPress Websites
Building Potent WordPress Websites
Ā 
The Thinking behind BEM
The Thinking behind BEMThe Thinking behind BEM
The Thinking behind BEM
Ā 
HTML & CSS 2017
HTML & CSS 2017HTML & CSS 2017
HTML & CSS 2017
Ā 
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...
ā€œGood design is obvious. Great design is transparent.ā€ ā€” How we use Bootstrap...
Ā 
Ember: Guts & Goals
Ember: Guts & GoalsEmber: Guts & Goals
Ember: Guts & Goals
Ā 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
Ā 
How to make a WordPress theme
How to make a WordPress themeHow to make a WordPress theme
How to make a WordPress theme
Ā 
WordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 NepalWordPress theme development from scratch : ICT MeetUp 2013 Nepal
WordPress theme development from scratch : ICT MeetUp 2013 Nepal
Ā 
TurboGears2 Pluggable Applications
TurboGears2 Pluggable ApplicationsTurboGears2 Pluggable Applications
TurboGears2 Pluggable Applications
Ā 

More from Robert Nyman

Have you tried listening?
Have you tried listening?Have you tried listening?
Have you tried listening?Robert Nyman
Ā 
Building for Your Next Billion - Google I/O 2017
Building for Your Next Billion - Google I/O 2017Building for Your Next Billion - Google I/O 2017
Building for Your Next Billion - Google I/O 2017Robert Nyman
Ā 
Introduction to Google Daydream
Introduction to Google DaydreamIntroduction to Google Daydream
Introduction to Google DaydreamRobert Nyman
Ā 
Predictability for the Web
Predictability for the WebPredictability for the Web
Predictability for the WebRobert Nyman
Ā 
The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016Robert Nyman
Ā 
The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016Robert Nyman
Ā 
The Future of Progressive Web Apps - Google for Indonesia
The Future of Progressive Web Apps - Google for IndonesiaThe Future of Progressive Web Apps - Google for Indonesia
The Future of Progressive Web Apps - Google for IndonesiaRobert Nyman
Ā 
Google tech & products
Google tech & productsGoogle tech & products
Google tech & productsRobert Nyman
Ā 
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...Robert Nyman
Ā 
Progressive Web Apps keynote, Google Developer Summit, Tokyo, Japan
Progressive Web Apps keynote, Google Developer Summit, Tokyo, JapanProgressive Web Apps keynote, Google Developer Summit, Tokyo, Japan
Progressive Web Apps keynote, Google Developer Summit, Tokyo, JapanRobert Nyman
Ā 
The web - What it has, what it lacks and where it must go - keynote at Riga D...
The web - What it has, what it lacks and where it must go - keynote at Riga D...The web - What it has, what it lacks and where it must go - keynote at Riga D...
The web - What it has, what it lacks and where it must go - keynote at Riga D...Robert Nyman
Ā 
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...Robert Nyman
Ā 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulRobert Nyman
Ā 
The web - What it has, what it lacks and where it must go
The web - What it has, what it lacks and where it must goThe web - What it has, what it lacks and where it must go
The web - What it has, what it lacks and where it must goRobert Nyman
Ā 
Google, the future and possibilities
Google, the future and possibilitiesGoogle, the future and possibilities
Google, the future and possibilitiesRobert Nyman
Ā 
Developer Relations in the Nordics
Developer Relations in the NordicsDeveloper Relations in the Nordics
Developer Relations in the NordicsRobert Nyman
Ā 
What is Developer Relations?
What is Developer Relations?What is Developer Relations?
What is Developer Relations?Robert Nyman
Ā 
Android TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupAndroid TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupRobert Nyman
Ā 
New improvements for web developers - frontend.fi, Helsinki
New improvements for web developers - frontend.fi, HelsinkiNew improvements for web developers - frontend.fi, Helsinki
New improvements for web developers - frontend.fi, HelsinkiRobert Nyman
Ā 
Mobile phone trends, user data & developer climate - frontend.fi, Helsinki
Mobile phone trends, user data & developer climate - frontend.fi, HelsinkiMobile phone trends, user data & developer climate - frontend.fi, Helsinki
Mobile phone trends, user data & developer climate - frontend.fi, HelsinkiRobert Nyman
Ā 

More from Robert Nyman (20)

Have you tried listening?
Have you tried listening?Have you tried listening?
Have you tried listening?
Ā 
Building for Your Next Billion - Google I/O 2017
Building for Your Next Billion - Google I/O 2017Building for Your Next Billion - Google I/O 2017
Building for Your Next Billion - Google I/O 2017
Ā 
Introduction to Google Daydream
Introduction to Google DaydreamIntroduction to Google Daydream
Introduction to Google Daydream
Ā 
Predictability for the Web
Predictability for the WebPredictability for the Web
Predictability for the Web
Ā 
The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016The Future of Progressive Web Apps - View Source conference, Berlin 2016
The Future of Progressive Web Apps - View Source conference, Berlin 2016
Ā 
The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016The Future of the Web - Cold Front conference 2016
The Future of the Web - Cold Front conference 2016
Ā 
The Future of Progressive Web Apps - Google for Indonesia
The Future of Progressive Web Apps - Google for IndonesiaThe Future of Progressive Web Apps - Google for Indonesia
The Future of Progressive Web Apps - Google for Indonesia
Ā 
Google tech & products
Google tech & productsGoogle tech & products
Google tech & products
Ā 
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...
Introduction to Progressive Web Apps, Google Developer Summit, Seoul - South ...
Ā 
Progressive Web Apps keynote, Google Developer Summit, Tokyo, Japan
Progressive Web Apps keynote, Google Developer Summit, Tokyo, JapanProgressive Web Apps keynote, Google Developer Summit, Tokyo, Japan
Progressive Web Apps keynote, Google Developer Summit, Tokyo, Japan
Ā 
The web - What it has, what it lacks and where it must go - keynote at Riga D...
The web - What it has, what it lacks and where it must go - keynote at Riga D...The web - What it has, what it lacks and where it must go - keynote at Riga D...
The web - What it has, what it lacks and where it must go - keynote at Riga D...
Ā 
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...
The web - What it has, what it lacks and where it must go - Bulgaria Web Summ...
Ā 
The web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - IstanbulThe web - What it has, what it lacks and where it must go - Istanbul
The web - What it has, what it lacks and where it must go - Istanbul
Ā 
The web - What it has, what it lacks and where it must go
The web - What it has, what it lacks and where it must goThe web - What it has, what it lacks and where it must go
The web - What it has, what it lacks and where it must go
Ā 
Google, the future and possibilities
Google, the future and possibilitiesGoogle, the future and possibilities
Google, the future and possibilities
Ā 
Developer Relations in the Nordics
Developer Relations in the NordicsDeveloper Relations in the Nordics
Developer Relations in the Nordics
Ā 
What is Developer Relations?
What is Developer Relations?What is Developer Relations?
What is Developer Relations?
Ā 
Android TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetupAndroid TV Introduction - Stockholm Android TV meetup
Android TV Introduction - Stockholm Android TV meetup
Ā 
New improvements for web developers - frontend.fi, Helsinki
New improvements for web developers - frontend.fi, HelsinkiNew improvements for web developers - frontend.fi, Helsinki
New improvements for web developers - frontend.fi, Helsinki
Ā 
Mobile phone trends, user data & developer climate - frontend.fi, Helsinki
Mobile phone trends, user data & developer climate - frontend.fi, HelsinkiMobile phone trends, user data & developer climate - frontend.fi, Helsinki
Mobile phone trends, user data & developer climate - frontend.fi, Helsinki
Ā 

Recently uploaded

Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelDeepika Singh
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
Ā 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
Ā 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
Ā 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
Ā 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
Ā 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
Ā 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
Ā 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
Ā 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
Ā 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
Ā 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vƔzquez
Ā 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
Ā 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
Ā 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
Ā 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
Ā 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
Ā 

Recently uploaded (20)

Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls šŸ„° 8617370543 Service Offer VIP Hot Model
Ā 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Ā 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
Ā 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
Ā 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
Ā 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Ā 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
Ā 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
Ā 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
Ā 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
Ā 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
Ā 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
Ā 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
Ā 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Ā 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Ā 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
Ā 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
Ā 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
Ā 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Ā 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
Ā 

How To Write Your First Firefox Extension

  • 1. How to Write Your First Extension
  • 2.
  • 3. Bruce Willis Extension (Francois Mori/AP Photo)
  • 4. How to Write Your First Extension 1. Create development proļ¬le 2. Conļ¬guration settings 3. Pointing extension to your dev directory 4. Creating folder structure & ļ¬les 5. Packaging & installing 6. Distributing your add-on
  • 5. Create Development Proļ¬le
  • 6. Keep a separate Firefox proļ¬le for extension development
  • 7. Windows: Start menu > Run (Windows key + R). Write firefox -P and press click OK. Mac OS X (in Terminal): Type in /Applications/Firefox.app/ Contents/MacOS/firefox - profilemanager Linux (in a terminal): Use cd to navigate to your Firefox directory and then enter ./firefox -profilemanager
  • 8.
  • 9.
  • 10.
  • 11. Pointing Extension to Your Development Directory
  • 13. Windows: Win XP: C:Documents and Settings[user name] Application DataMozillaFirefoxProfiles Vista: C:Users[user name]AppDataRoaming Mac OS X (~ = /Users/[user name]): ~/Library/Application Support/Firefox/Profiles/ Linux: ~/.mozilla/
  • 14. Go to [Dev Profile]/extensions/ folder
  • 15. Create empty ļ¬le (no ļ¬le extension!): brucewillis@robertnyman.com
  • 16.
  • 17. Point to your extension code, i.e. ļ¬le path: Windows: E.g: C:devbrucewillis Mac/Linux: E.g: ~/dev/brucewillis/
  • 19. 1. Open Firefox: - Have your development proļ¬le as default - or Through Proļ¬le Manager 2. Type in about:config
  • 20.
  • 21. Recommended settings: javascript.options.showInConsole = true nglayout.debug.disable_xul_cache = true browser.dom.window.dump.enabled = true
  • 22. ā€¢ Optional settings: javascript.options.strict = true extensions.logging.enabled = true
  • 23.
  • 24.
  • 26.
  • 27. ā€¢ Automatic creation of extension ā€¢ Extension Developer extension
  • 30. <?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>brucewillis@robertnyman.com</em:id> <em:name>Bruce Willis demo extension</em:name> <em:version>1.0</em:version> <em:type>2</em:type> <em:creator>Robert Nyman</em:creator> <em:description>Finds document headings and replaces them with Die Hard movie titles</em:description> <em:homepageURL>http://www.robertnyman.com/</em:homepageURL> <em:optionsURL>chrome://brucewillis/content/preferences.xul</ em:optionsURL> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>2.0</em:minVersion> <em:maxVersion>3.1b2</em:maxVersion> </Description> </em:targetApplication> </Description> </RDF>
  • 31.
  • 33. em:id Your unique developer id, of your own choosing. Has to be the same as the pointer ļ¬le you previously created, i.e. brucewillis@robertnyman.com em:name The name of your extension. em:version Current version of your extension. em:type The type declares that it is an extension, as opposed to, for instance, a theme. em:creator You! em:description Describes your extension functionality. Will be shown in the Tools > Add-ons window. em:homepageURL The URL of your extensionā€™s web site. em:optionsURL The URL to where you will have your ļ¬le for editing options/preferences.
  • 35. em:id The actual id of Firefox: {ec8030f7-c20a-464f-9b0e-13a3a9e97384}. Exchange this to develop for another app, like Thunderbird. em:minVersion The minimum version number of Firefox to run the extension. em:maxVersion The maximum version number of Firefox to run the extension. Valid alternatives for Firefox, Thunderbird etc and their corresponding versions
  • 36. <?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>brucewillis@robertnyman.com</em:id> <em:name>Bruce Willis demo extension</em:name> <em:version>1.0</em:version> <em:type>2</em:type> <em:creator>Robert Nyman</em:creator> <em:description>Finds document headings and replaces them with Die Hard movie titles</em:description> <em:homepageURL>http://www.robertnyman.com/</em:homepageURL> <em:optionsURL>chrome://brucewillis/content/preferences.xul</ em:optionsURL> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>2.0</em:minVersion> <em:maxVersion>3.1b2</em:maxVersion> </Description> </em:targetApplication> </Description> </RDF>
  • 37. More information in Install Manifests
  • 40. content brucewillis chrome/content/ content brucewillis chrome/content/ contentaccessible=yes overlay chrome://browser/content/browser.xul chrome:// brucewillis/content/browser.xul locale brucewillis en-US chrome/locale/en-US/ skin brucewillis classic/1.0 chrome/skin/ style chrome://global/content/customizeToolbar.xul chrome:// brucewillis/skin/skin.css
  • 41. # Content pointer content brucewillis chrome/content/ # Make content accessible from web pages in Firefox 3 content brucewillis chrome/content/ contentaccessible=yes # Overlay browser skin overlay chrome://browser/content/browser.xul chrome:// brucewillis/content/browser.xul
  • 42. # Language versions locale brucewillis en-US chrome/locale/en-US/
  • 43. # Setting reference to extension skin skin brucewillis classic/1.0 chrome/skin/ # Adding CSS to available toolbar buttons style chrome://global/content/customizeToolbar.xul chrome://brucewillis/skin/skin.css
  • 44. More information in Chrome Manifest
  • 45. Are you with me so far?
  • 47. XUL, JavaScript and content CSS
  • 48. XUL (ā€œZuulā€) - XML User Interface Language http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
  • 49. ā€¢ browser.xul ā€¢ bruce-willis.css ā€¢ bruceWillis.js ā€¢ preferences.xul
  • 50. ā€¢ browser.xul ā€¢ bruce-willis.css ā€¢ bruceWillis.js ā€¢ preferences.xul
  • 51. <?xml version="1.0"?> <?xml-stylesheet href="chrome://brucewillis/skin/skin.css" type="text/ css"?> <!DOCTYPE window SYSTEM "chrome://brucewillis/locale/translations.dtd"> <overlay id="sample" xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul"> <script src="bruceWillis.js" /> <menupopup id="menu_ToolsPopup"> <menuitem label="&runbrucewillis;" key="brucewillis-run- key" oncommand="linkTargetFinder.run()"/> </menupopup> <keyset> <key id="brucewillis-run-key" modifiers="accel alt shift" key="B" oncommand="bruceWillis.run()"/> </keyset> <statusbar id="status-bar"> <statusbarpanel id="brucewillis-status-bar-icon" class="statusbarpanel-iconic" src="chrome://brucewillis/skin/status- bar.png" tooltiptext="&runbrucewillis;" onclick="bruceWillis.run()" /> </statusbar> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="brucewillis-toolbar-button" label="Bruce Willis" tooltiptext="&runbrucewillis;" oncommand="bruceWillis.run()"/> </toolbarpalette> </overlay>
  • 52. <?xml version="1.0"?> <?xml-stylesheet href="chrome://brucewillis/skin/skin.css" type="text/ css"?> <!DOCTYPE window SYSTEM "chrome://brucewillis/locale/translations.dtd">
  • 53. <overlay id="sample" xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul"> <script src="bruceWillis.js" /> <!-- Content --> </overlay>
  • 54. <!-- Tools menu option and keyboard shortcut --> <menupopup id="menu_ToolsPopup"> <menuitem label="&runbrucewillis;" key="brucewillis-run- key" oncommand="linkTargetFinder.run()"/> </menupopup> <keyset> <key id="brucewillis-run-key" modifiers="accel alt shift" key="B" oncommand="bruceWillis.run()"/> </keyset>
  • 55.
  • 56. <!-- Statusbar icon --> <statusbar id="status-bar"> <statusbarpanel id="brucewillis-status-bar-icon" class="statusbarpanel-iconic" src="chrome://brucewillis/skin/status- bar.png" tooltiptext="&runbrucewillis;" onclick="bruceWillis.run()" /> </statusbar>
  • 57.
  • 58. <!-- Firefox toolbar button --> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="brucewillis-toolbar-button" label="Bruce Willis" tooltiptext="&runbrucewillis;" oncommand="bruceWillis.run()"/> </toolbarpalette>
  • 59.
  • 60. ā€¢ browser.xul ā€¢ bruce-willis.css ā€¢ bruceWillis.js ā€¢ preferences.xul
  • 61. h1, h2, h3, h4 { font-family: Georgia, Times, serif; }
  • 62. ā€¢ browser.xul ā€¢ bruce-willis.css ā€¢ bruceWillis.js ā€¢ preferences.xul
  • 63. var bruceWillis = function () { var prefManager = Components.classes["@mozilla.org/preferences-service; 1"].getService(Components.interfaces.nsIPrefBranch); return { init : function () { gBrowser.addEventListener("load", function () { var autoRun = prefManager.getBoolPref("extensions.brucewillis.autorun"); if (autoRun) { bruceWillis.run(); } }, false); }, run : function () { var head = content.document.getElementsByTagName("head")[0], style = content.document.getElementById("bruce-willis-style"), h1 = content.document.getElementsByTagName("h1"), h2 = content.document.getElementsByTagName("h2"), h3 = content.document.getElementsByTagName("h3"), h4 = content.document.getElementsByTagName("h4"); if (!style) { style = content.document.createElement("link"); style.id = "brucewillis-style"; style.type = "text/css"; style.rel = "stylesheet"; style.href = "chrome://brucewillis/content/bruce-willis.css"; head.appendChild(style); } for (var i=0, il=h1.length; i<il; i++) { h1[i].textContent = "Die Hard 1"; } for (var i=0, il=h2.length; i<il; i++) { h2[i].textContent = "Die Hard 2"; } for (var i=0, il=h3.length; i<il; i++) { h3[i].textContent = "Die Hard 3"; } for (var i=0, il=h4.length; i<il; i++) { h4[i].textContent = "Die Hard 4"; } } }; }(); window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
  • 64. // Structure - Yahoo JavaScript Module Pattern var bruceWillis = function () { var prefManager = Components.classes["@mozilla.org/preferences- service;1"].getService(Components.interfaces.nsIPrefBranch); return { init : function () { // init method }, run : function () { // run method } }; }(); window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
  • 65. // init method init : function () { gBrowser.addEventListener("load", function () { var autoRun = prefManager.getBoolPref("extensions.brucewillis.autorun"); if (autoRun) { bruceWillis.run(); } }, false); }
  • 66. // run method run : function () { var head = content.document.getElementsByTagName("head")[0], style = content.document.getElementById("bruce-willis-style"), h1 = content.document.getElementsByTagName("h1"), h2 = content.document.getElementsByTagName("h2"), h3 = content.document.getElementsByTagName("h3"), h4 = content.document.getElementsByTagName("h4"); if (!style) { style = content.document.createElement("link"); style.id = "brucewillis-style"; style.type = "text/css"; style.rel = "stylesheet"; style.href = "chrome://brucewillis/content/bruce-willis.css"; head.appendChild(style); } for (var i=0, il=h1.length; i<il; i++) { h1[i].textContent = "Die Hard 1"; } for (var i=0, il=h2.length; i<il; i++) { h2[i].textContent = "Die Hard 2"; } for (var i=0, il=h3.length; i<il; i++) { h3[i].textContent = "Die Hard 3"; } for (var i=0, il=h4.length; i<il; i++) { h4[i].textContent = "Die Hard 4"; } }
  • 67. // Run when DOM has loaded window.addEventListener("DOMContentLoaded", bruceWillis.init, false);
  • 68. ā€¢ browser.xul ā€¢ bruce-willis.css ā€¢ bruceWillis.js ā€¢ preferences.xul
  • 69. <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <prefwindow title="Bruce Willis Preferences" xmlns="http://www.mozilla.org/keymaster/gatekeeper/ there.is.only.xul"> <prefpane label="Bruce Willis Preferences"> <preferences> <preference id="brucewillis-autorun" name="extensions.brucewillis.autorun" type="bool"/> </preferences> <groupbox> <caption label="Settings"/> <grid> <columns> <column flex="4"/> <column flex="1"/> </columns> <rows> <row> <label control="autorun" value="Autorun"/> <checkbox id="autorun" preference="brucewillis-autorun"/> </row> </rows> </grid> </groupbox> </prefpane> </prefwindow>
  • 70. <!-- Connect element to extension preference --> <preferences> <preference id="brucewillis-autorun" name="extensions.brucewillis.autorun" type="bool"/> </preferences> <checkbox id="autorun" preference="brucewillis-autorun"/>
  • 71.
  • 76. Skin your extension with CSS and images
  • 78. /* skin.css */ /* Style in View > Toolbars > Customize */ #brucewillis-toolbar-button { list-style-image: url(chrome://brucewillis/skin/toolbar- button.png); } #brucewillis-status-bar-icon { width: 83px; margin: 0 5px; }
  • 85. An XPI (ā€œzippyā€) is just a zipped ļ¬le
  • 86. ZIP the contents of your extension folder (only the contents, NOT the folder itself)
  • 87. Windows: Mark all ļ¬les, right-click and choose: Send To > Compressed Rename ZIP ļ¬le to .xpi Mac OS X/Linux (in Terminal): Navigate to your extension ļ¬les. Type in: zip -r BruceWillis.xpi *
  • 88. Drag your XPI ļ¬le into Firefox - VoilĆ !
  • 91. After
  • 93. addons.mozilla.org or through secure location (SSL) Successfully Getting your Addon Reviewed
  • 95. ā€¢ Download Bruce Willis extension ā€¢ Browse source ļ¬les ā€¢ Presentation slides at: http://robertnyman.com/speaking/
  • 97. Learn by looking at others
  • 100. 1. Create development proļ¬le 2. Conļ¬guration settings 3. Pointing extension to your dev directory 4. Creating folder structure & ļ¬les 5. Packaging & installing 6. Distributing your add-on
  • 102.
  • 103. Robert Nyman robert@robertnyman.com http://robertnyman.com Images: http://www.learningresources.com/product/teachers/shop+by+category/activity+kits/construction/m--8226- gears--174-+building+set.do http://www.soitenlystooges.com/item.asp?sku=FGSU578 http://www.ļ¬‚ickr.com/photos/28791486@N03/2700643931/ http://www.fetasteutgavan.se/blogg/wp/?p=39 http://www.pixabella.com/plugin/tag/red-hearts http://www.woodlands-junior.kent.sch.uk/customs/xmas/calendar/day13.html http://www.intercan.org/coordinator_list.asp