To help illustrate how to develop extensions, we maintain a repository of simple example extensions at https://github.com/mdn/webextensions-examples. This article describes the WebExtension APIs used in that repository.
These examples work in Firefox Nightly: most work in earlier versions of Firefox, but check the strict_min_version key in the extension's manifest.json to make sure.
If you want to try out these examples, you have three main choices:
- Clone the repository, then load the extension straight from its source directory, using the "Load Temporary Add-on" feature. The extension will stay loaded until you restart Firefox.
- Clone the repository, then use the web-ext command line tool to run Firefox with the extension installed.
- Clone the repository, then go to the build directory. This contains built and signed versions of all the examples, so you can just open them in Firefox (using File/Open File) and install them permanently, just like an extension you would install from addons.mozilla.org.
Important: Please do not submit these example WebExtension examples to AMO (addons.mozilla.org), you do not have to sign the add-on to run the WebExtension examples. Simply follow the steps above.
If you want to contribute to the repository, send us a pull request!
| Name | Description | JavaScript APIs |
|---|---|---|
| annotate-page | Displays a sidebar that lets you take notes on web pages. | storage.localtabs.onActivatedtabs.onUpdatedtabs.querywindows.getCurrent |
| apply-css | Adds a page action to the toolbar. Click the button to apply a red border using injected CSS. Click the button again to remove the CSS. | pageAction.getTitlepageAction.onClickedpageAction.setIconpageAction.setTitlepageAction.showtabs.insertCSStabs.onUpdatedtabs.querytabs.removeCSS |
| beastify | Adds a browser action icon to the toolbar. Click the button to choose a beast. The active tab's body content is then replaced with a picture of the chosen beast. | extension.getURLruntime.onMessagetabs.executeScripttabs.insertCSStabs.querytabs.removeCSStabs.sendMessage |
| bookmark-it | Adds a bookmark button to the toolbar. Click the button to toggle a bookmark for the current page. | bookmarks.createbookmarks.onCreatedbookmarks.onRemovedbookmarks.removebookmarks.searchbrowserAction.onClickedbrowserAction.setIconbrowserAction.setTitletabs.onActivatedtabs.onUpdatedtabs.querywindows.onFocusChanged |
| borderify | Adds a solid red border to all webpages matching mozilla.org. | |
| chill-out | Show a page action after a period of inactivity. Show cat gifs when the page action is clicked. | alarms.clearAllalarms.createalarms.onAlarmpageAction.hidepageAction.onClickedpageAction.showtabs.gettabs.onActivatedtabs.onUpdatedtabs.querytabs.update |
| commands | Demonstrates using the commands API to set up a keyboard shortcut. The shortcut created is accessed using Ctrl+Shift+U (Command+Shift+U on a Mac). | commands.getAllcommands.onCommandcommands.resetcommands.updatetabs.create |
| context-menu-copy-link-with-types | Add a context menu option to links to copy the link to the clipboard, as plain text and as a link in rich HTML. | contextMenus.createcontextMenus.onClickedtabs.executeScript |
| contextual-identities | List, create, and remove contextual identities. | contextualIdentities.querytabs.createtabs.querytabs.remove |
| cookie-bg-picker | Allows the user to customize the background color and tiled pattern on sites the visit, and also saves their preferences via a cookie, reapplying them whenever they revisit a site they previously customized. | cookies.getcookies.onChangedcookies.removecookies.setextension.getURLruntime.onMessagetabs.onActivatedtabs.onUpdatedtabs.querytabs.sendMessage |
| devtools-panels | Demonstrates some of the devtools APIs. | devtools.inspectedWindowdevtools.panelsruntime.getURLruntime.onMessageruntime.sendMessagetabs.executeScript |
| discogs-search | Demonstrates adding a custom search engine with the chrome_settings_overrides key. | |
| dynamic-theme | Dynamic theme example | alarms.createalarms.onAlarmtheme.update |
| embedded-webextension-bootstrapped | Demonstrates how to use an embedded WebExtension to port from a bootstrapped extension. | runtime.onMessageruntime.sendMessagestorage.local |
| embedded-webextension-overlay | Demonstrates how to use an embedded WebExtension to port from an overlay extension. | runtime.onMessageruntime.sendMessage |
| embedded-webextension-sdk | Demonstrates how to use an embedded WebExtension to port from an SDK-based add-on. | notifications.createruntime.connectruntime.onConnectruntime.onMessageruntime.sendMessagestorage.local |
| emoji-substitution | Replaces words with emojis. | |
| eslint-example | Demonstrates how to configure an extension with eslint. | |
| export-helpers | Demonstrates how to use export helpers like cloneInto to share objects with page scripts. | notifications.createruntime.onMessageruntime.sendMessage |
| favourite-colour | An example options page, letting you store your favourite colour. | browserAction.onClickedruntime.openOptionsPagestorage.managedstorage.sync |
| find-across-tabs | Demonstration of the find API. | browserAction.onClickedextension.getBackgroundPagefind.findfind.highlightResultsruntime.getURLruntime.onMessageruntime.sendMessagetabs.createtabs.query |
| firefox-code-search | Demonstrates how to use the omnibox API. | omnibox.onInputChangedomnibox.onInputEnteredomnibox.setDefaultSuggestiontabs.createtabs.update |
| forget-it | Demonstrates how to use the browsingData API. | browserAction.onClickedbrowsingData.removenotifications.createstorage.local |
| google-userinfo | Demonstrates how to use the identity API. | browserAction.onClickedidentity.getRedirectURLidentity.launchWebAuthFlownotifications.create |
| history-deleter | History API demo: deletes history items for a given domain | history.deleteUrlhistory.searchpageAction.showtabs.onUpdatedtabs.query |
| http-response | Demonstrates how to rewrite HTTP responses using the webRequest.filterResponseData() API. | webRequest.filterResponseDatawebRequest.onBeforeRequest |
| imagify | Using a sidebar, illustrates the use of file picker and drag and drop. A content script replaces the current page content with the chosen image. | extension.getURLruntime.onMessagetabs.executeScripttabs.querytabs.sendMessage |
| latest-download | Shows the last downloaded item, and lets you open or delete it. | downloads.erasedownloads.getFileIcondownloads.opendownloads.removeFiledownloads.search |
| list-cookies | This extensions list the cookies in the active tab. | cookies.getAlltabs.query |
| menu-demo | Demonstrates adding and manipulating menu items using the menus API. | i18n.getMessagemenus.createmenus.onClickedmenus.removemenus.updateruntime.lastErrortabs.executeScript |
| menu-labelled-open | menus.createmenus.onClickedmenus.onShownmenus.refreshmenus.updatetabs.update | |
| mocha-client-tests | This example shows two methods of testing an extension: running tests from within the extension, and running tests from the command line using Karma | runtime.onMessageruntime.sendMessage |
| native-messaging | Example of native messaging, including a Python application and an extension which exchanges messages with it. | browserAction.onClickedruntime.connectNative |
| navigation-stats | Demonstration of the webNavigation API, showing basic stats about which pages you've visited. | storage.localwebNavigation.onCommittedwebNavigation.onCompleted |
| notify-link-clicks-i18n | Shows a localized notification when the user clicks on links. | extension.getURLi18n.getMessagenotifications.createruntime.onMessageruntime.sendMessage |
| open-my-page-button | Adds a browser action icon to the toolbar. When the browser action is clicked, the add-on opens a page that was packaged with it. | browserAction.onClickedtabs.create |
| page-to-extension-messaging | Demonstrates how a web page and a content script can exchange messages. Visit https://mdn.github.io/webextensions-examples/content-script-page-script-messaging.html for the demo. | |
| permissions | Demonstrates optional permissions using the permissions API. | browserAction.onClickedpermissions.getAllpermissions.removepermissions.requestruntime.getURLtabs.create |
| private-browsing-theme | Example dynamic theme: sets a dark theme for private windows. | theme.resettheme.updatewindows.getAllwindows.onCreated |
| proxy-blocker | Uses the proxy API to block requests to specific hosts. | extension.getURLproxy.onProxyErrorproxy.registerruntime.onMessageruntime.sendMessagestorage.localstorage.onChanged |
| quicknote | Allows the user to make quick notes by clicking a button and entering text into the resulting popup. The notes are saved in storage. | storage.local |
| react-es6-popup | This is an example of creating a browser action popup UI in React and ES6 JavaScript. | tabs.query |
| runtime-examples | Demo of various runtime APIs. | browserAction.onClickednotifications.createruntime.getManifestruntime.onInstalledruntime.reload |
| selection-to-clipboard | Demonstrates how to write to the clipboard from a content script | |
| session-state | Demonstrates how to retrieve extension-defined state state from restored tabs. | menus.createmenus.onClickedsessions.getTabValuesessions.setTabValuetabs.insertCSStabs.onCreatedtabs.onUpdatedtabs.query |
| store-collected-images | Demonstrates how to use the idb-file-storage library to store and manipulate files in an extension. | browserAction.onClickedcontextMenus.createcontextMenus.onClickedruntime.onMessageruntime.sendMessagetabs.createwindows.create |
| stored-credentials | Performs basic authentication by supplying stored credentials. | storage.localwebRequest.onAuthRequiredwebRequest.onCompletedwebRequest.onErrorOccurred |
| tabs-tabs-tabs | Demonstrates tab manipulation: opening, closing, moving, zooming tabs. | browserAction.setBadgeBackgroundColorbrowserAction.setBadgeTexttabs.createtabs.duplicatetabs.getZoomtabs.movetabs.onCreatedtabs.onMovedtabs.onRemovedtabs.querytabs.reloadtabs.removetabs.setZoomtabs.update |
| theme-integrated-sidebar | A sidebar that integrates with the current theme. | theme.getCurrenttheme.onUpdatedwindows.getCurrent |
| theme-switcher | An example of how to use the management API for themes. | management.getAllmanagement.setEnabled |
| themes | A collection of themes illustrating:
| |
| top-sites | Demonstration of the topSites API. | topSites.get |
| user-agent-rewriter | Demonstrates using the webRequest API to rewrite the User-Agent HTTP header. | extension.getBackgroundPagewebRequest.onBeforeSendHeaders |
| user-script | contentScripts.registerruntime.onMessageruntime.sendMessage | |
| webpack-modules | Demonstrates how to use webpack to package npm modules in an extension. | runtime.onMessageruntime.sendMessage |
| window-manipulator | Demonstrates how to manipulate windows: opening, closing, resizing windows. | windows.createwindows.getAllwindows.getCurrentwindows.removewindows.update |

