Support for extensions using XUL/XPCOM or the Add-on SDK was removed in Firefox 57, released November 2017. As there is no supported version of Firefox enabling these technologies, this page will be removed by December 2020.
Add-ons using the techniques described in this document are considered a legacy technology in Firefox. Don't use these techniques to develop new add-ons. Use WebExtensions instead. If you maintain an add-on which uses the techniques described here, consider migrating it to use WebExtensions.
Starting from Firefox 53, no new legacy add-ons will be accepted on addons.mozilla.org (AMO) for desktop Firefox and Firefox for Android.
Starting from Firefox 57, only extensions developed using WebExtensions APIs will be supported on Desktop Firefox and Firefox for Android.
Even before Firefox 57, changes coming up in the Firefox platform will break many legacy extensions. These changes include multiprocess Firefox (e10s), sandboxing, and multiple content processes. Legacy extensions that are affected by these changes should migrate to use WebExtensions APIs if they can. See the "Compatibility Milestones" document for more information.
A wiki page containing resources, migration paths, office hours, and more, is available to help developers transition to the new technologies.
What's a Firefox Extension?
Extensions add new functionality to Mozilla applications such as Firefox and Thunderbird. They can add anything from a toolbar button to a completely new feature. They allow the application to be customized to fit the personal needs of each user if they need additional features, while keeping the applications small to download.
Taken from the Extensions page.
As described in the quoted text, an extension is a small application that adds something new to one or more Mozilla applications. This tutorial focuses on extensions for Firefox, but the same (or very similar) principles apply to creating extensions for other applications such as Thunderbird, Seamonkey, and Flock.
It is also worth noting that there are differences between the definition of extension and add-on. All extensions are add-ons, but add-ons can also be themes, plugins, or language packs. This tutorial is about extension development, but themes and language packs are developed in a very similar way. Plugins are entirely different, and they will not be covered on this tutorial. You can read more about plugins and their development in the Plugins page.
Firefox provides a very rich and flexible architecture that allows extension developers to add advanced features, customize the user's experience, and completely replace and remove parts of the browser. The Mozilla Add-ons repository (AMO) holds an extensive number of extensions with a wide variety of functions: content filtering (AdBlock Plus, NoScript), web application interaction (Delicious Bookmarks, eBay Companion), web development (DOM Inspector, Firebug), and child protection (Glubble For Families). These are very advanced and complex extensions, and you'll learn most of what it takes to create extensions like these (Glaxstar actually worked on 3 of those listed).
We'll begin by looking into a very simple extension.
The Hello World Extension
Our sample extensions and this tutorial in general are meant for Firefox version 3 and above, but most of it works on previous versions of Firefox as well. We'll try to make it clear when we're discussing a feature that only works on some versions of Firefox.
We'll now begin with a basic "Hello World" extension. Let's start by installing the extension. Click on the link below.
This will either trigger an install or a file download, depending on the Content-type the webserver is using to serve the file. The appropriate content type to trigger an install is application/x-xpinstall. In this case a file download should occur.
If the content type is set correctly, you will probably get notified that the site is not allowed to install add-ons on Firefox. This is a security measure that prevents sites from installing extensions without user consent. This is necessary because malicious extensions can do the same level of harm as any malicious program: stealing data, erasing or replacing files, and causing unwanted behavior in general. AMO is the only pre-allowed site because all published add-ons on AMO have gone through a review process that includes security checks.
After downloading the file, you can drag and drop it into the Firefox content area, and the installation should begin.
You'll see a window telling you that you're about to install an extension, with some additional information such as the name of the author. You'll see a message saying that the author cannot be verified. Only extensions signed with a digital certificate can verify authorship. Signed extensions are rare, but we'll cover how to sign them later on.
Click on the Install Now button. After the extension is installed, you'll be asked to restart Firefox. Installing, uninstalling, enabling and disabling add-ons (except plugins) require a restart to complete, and there's no easy way to work around it. This is an important point to keep in mind if you're building an extension that manipulates other extensions or themes. There's a very old bug that tracks this issue.
Now, after restarting the browser, you'll see the Add-ons Manager window, showing the extension name, version, and a brief description.
Close the Add-ons window. Look at the main Firefox window and see if you notice anything different.
Did you see it? There's a new menu on the main menu bar, labeled "Hello World!". If you open the menu and then the menu item below, you'll see a nice alert message (for some definitions of 'nice'). Click on the OK button to close it.
That's all the extension does. Now let's take a closer look at it.
You may have noticed that the extension file you installed is named xulschoolhello1.xpi. XPI (pronounced "zippy") stands for Cross-Platform Installer, because the same installer file can work on all major platforms, and this is the case for most extension XPIs. XPIs are simply compressed ZIP files, but Firefox recognizes the XPI extension and triggers the installation process when an XPI link is clicked.
To look into the XPI file you need to download it first, not install it. If the server triggers an install when clicking on a link or button, what you need to do is right click on the install link, and choose the Save Link As... option.
Next, we'll decompress the XPI file. One way to do this is to rename the file so that it uses the zip extension instead of the xpi. Another way is to open the file using a ZIP tool. Most operating systems ship with a ZIP compression utility, and there are more advanced tools available online. Make your pick, and decompress the file in a convenient location. You should see a directory structure similar to this one:
The JAR file contains most of the code, so we'll need to extract the contents of that file as well. Just like XPIs, all you need is a ZIP utility to decompress the file. After doing that, you'll have something like this:
That's a lot of files for something so simple! Well, don't worry, we'll shortly see the purpose of all of these files and realize this is quite simple. In the next section we'll inspect these files and see what they do.
This tutorial was kindly donated to Mozilla by Appcoast.