[
    {
        "description": "Displays a sidebar that lets you take notes on web pages.",
        "javascript_apis": [
            "storage.local",
            "tabs.onActivated",
            "tabs.onUpdated",
            "tabs.query",
            "tabs.Tab",
            "windows.getCurrent",
            "windows​.Window"
        ],
        "name": "annotate-page"
    },
    {
        "description": "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.",
        "javascript_apis": [
            "pageAction.getTitle",
            "pageAction.onClicked",
            "pageAction.setIcon",
            "pageAction.setTitle",
            "pageAction.show",
            "tabs.insertCSS",
            "tabs.onUpdated",
            "tabs.query",
            "tabs.removeCSS",
            "tabs.Tab"
        ],
        "name": "apply-css"
    },
    {
        "description": "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.",
        "javascript_apis": [
            "extension.getURL",
            "runtime.onMessage",
            "tabs.executeScript",
            "tabs.insertCSS",
            "tabs.query",
            "tabs.removeCSS",
            "tabs.sendMessage",
            "tabs.Tab"
        ],
        "name": "beastify"
    },
    {
        "description": "Adds a bookmark button to the toolbar. Click the button to toggle a bookmark for the current page.",
        "javascript_apis": [
            "bookmarks.create",
            "bookmarks.onCreated",
            "bookmarks.onRemoved",
            "bookmarks.remove",
            "bookmarks.search",
            "browserAction.onClicked",
            "browserAction.setIcon",
            "browserAction.setTitle",
            "tabs.onActivated",
            "tabs.onUpdated",
            "tabs.query",
            "tabs.Tab",
            "windows.onFocusChanged"
        ],
        "name": "bookmark-it"
    },
    {
        "description": "Adds a solid red border to all webpages matching mozilla.org.",
        "javascript_apis": [],
        "name": "borderify"
    },
    {
        "description": "Show a page action after a period of inactivity. Show cat gifs when the page action is clicked.",
        "javascript_apis": [
            "alarms.clearAll",
            "alarms.create",
            "alarms.onAlarm",
            "pageAction.hide",
            "pageAction.onClicked",
            "pageAction.show",
            "tabs.get",
            "tabs.onActivated",
            "tabs.onUpdated",
            "tabs.query",
            "tabs.update"
        ],
        "name": "chill-out"
    },
    {
        "description": "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).",
        "javascript_apis": [
            "commands.getAll",
            "commands.onCommand",
            "commands.reset",
            "commands.update",
            "tabs.create"
        ],
        "name": "commands"
    },
    {
        "description": "Illustrates how an extension can register URL-matching content scripts at runtime.",
        "javascript_apis": [
            "contentScripts.register",
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "content-script-register"
    },
    {
        "description": "Add a context menu option to links to copy the link to the clipboard, as plain text and as a link in rich HTML.",
        "javascript_apis": [
            "contextMenus.create",
            "contextMenus.onClicked",
            "tabs.executeScript"
        ],
        "name": "context-menu-copy-link-with-types"
    },
    {
        "description": "List, create, and remove contextual identities.",
        "javascript_apis": [
            "contextualIdentities.query",
            "tabs.create",
            "tabs.query",
            "tabs.remove"
        ],
        "name": "contextual-identities"
    },
    {
        "description": "Allows the user to customize the background color and tiled pattern on sites they visit, and also saves their preferences via a cookie, reapplying them whenever they revisit a site they previously customized.",
        "javascript_apis": [
            "cookies.get",
            "cookies.onChanged",
            "cookies.remove",
            "cookies.set",
            "extension.getURL",
            "runtime.onMessage",
            "tabs.onActivated",
            "tabs.onUpdated",
            "tabs.query",
            "tabs.Tab",
            "tabs.sendMessage"
        ],
        "name": "cookie-bg-picker"
    },
    {
        "description": "Demonstrates some of the devtools APIs.",
        "javascript_apis": [
            "devtools.inspectedWindow",
            "devtools.panels",
            "runtime.getURL",
            "runtime.onMessage",
            "runtime.sendMessage",
            "tabs.executeScript"
        ],
        "name": "devtools-panels"
    },
    {
        "description": "Demonstrates adding a custom search engine with the chrome_settings_overrides key.",
        "javascript_apis": [],
        "name": "discogs-search"
    },
    {
        "description": "Dynamic theme example",
        "javascript_apis": [
            "alarms.create",
            "alarms.onAlarm",
            "theme.update"
        ],
        "name": "dynamic-theme"
    },
    {
        "description": "Replaces words with emojis.",
        "javascript_apis": [],
        "name": "emoji-substitution"
    },
    {
        "description": "Demonstrates how to configure an extension with eslint.",
        "javascript_apis": [],
        "name": "eslint-example"
    },
    {
        "description": "Demonstrates how to use export helpers like cloneInto to share objects with page scripts.",
        "javascript_apis": [
            "notifications.create",
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "export-helpers"
    },
    {
        "description": "An example options page, letting you store your favourite colour.",
        "javascript_apis": [
            "browserAction.onClicked",
            "runtime.openOptionsPage",
            "storage.managed",
            "storage.sync"
        ],
        "name": "favourite-colour"
    },
    {
        "description": "Demonstration of the find API.",
        "javascript_apis": [
            "browserAction.onClicked",
            "extension.getBackgroundPage",
            "find.find",
            "find.highlightResults",
            "runtime.getURL",
            "runtime.onMessage",
            "runtime.sendMessage",
            "tabs.create",
            "tabs.query",
            "tabs.Tab"
        ],
        "name": "find-across-tabs"
    },
    {
        "description": "Demonstrates how to use the omnibox API.",
        "javascript_apis": [
            "omnibox.onInputChanged",
            "omnibox.onInputEntered",
            "omnibox.setDefaultSuggestion",
            "tabs.create",
            "tabs.update"
        ],
        "name": "firefox-code-search"
    },
    {
        "description": "Demonstrates how to use the browsingData API.",
        "javascript_apis": [
            "browserAction.onClicked",
            "browsingData.remove",
            "notifications.create",
            "storage.local"
        ],
        "name": "forget-it"
    },
    {
        "description": "Demonstrates how to use the identity API.",
        "javascript_apis": [
            "browserAction.onClicked",
            "identity.getRedirectURL",
            "identity.launchWebAuthFlow",
            "notifications.create"
        ],
        "name": "google-userinfo"
    },
    {
        "description": "History API demo: deletes history items for a given domain",
        "javascript_apis": [
            "history.deleteUrl",
            "history.search",
            "pageAction.show",
            "tabs.onUpdated",
            "tabs.query"
        ],
        "name": "history-deleter"
    },
    {
        "description": "Demonstrates how to rewrite HTTP responses using the webRequest.filterResponseData() API.",
        "javascript_apis": [
            "webRequest.filterResponseData",
            "webRequest.onBeforeRequest"
        ],
        "name": "http-response"
    },
    {
        "description": "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.",
        "javascript_apis": [
            "extension.getURL",
            "runtime.onMessage",
            "tabs.executeScript",
            "tabs.query",
            "tabs.sendMessage"
        ],
        "name": "imagify"
    },
    {
        "description": "Shows the last downloaded item, and lets you open or delete it.",
        "javascript_apis": [
            "downloads.erase",
            "downloads.getFileIcon",
            "downloads.open",
            "downloads.removeFile",
            "downloads.search"
        ],
        "name": "latest-download"
    },
    {
        "description": "This extensions list the cookies in the active tab.",
        "javascript_apis": [
            "cookies.getAll",
            "tabs.query"
        ],
        "name": "list-cookies"
    },
    {
        "description": "Shows how to set up a single letter access key for a menu item.",
        "javascript_apis": [
            "i18n.getMessage",
            "menus.update",
            "menus.create",
            "menus.onClicked"
        ],
        "name": "menu-accesskey-visible"
    },
    {
        "description": "Demonstrates adding and manipulating menu items using the menus API.",
        "javascript_apis": [
            "i18n.getMessage",
            "menus.create",
            "menus.onClicked",
            "menus.remove",
            "menus.update",
            "runtime.lastError",
            "tabs.executeScript"
        ],
        "name": "menu-demo"
    },
    {
        "description": "Shows how an extension can listen for the display of a menu and then add, remove, or update its menu items.",
        "javascript_apis": [
            "menus.create",
            "menus.onClicked",
            "menus.onShown",
            "menus.refresh",
            "menus.update",
            "tabs.update"
        ],
        "name": "menu-labelled-open"
    },
    {
        "description": "Shows how to detect the page element at the cursor position and remove that element, or a parent element, from the page. This example includes use of the polyfill, illustrating cross-browser extension development.",
        "javascript_apis": [
            "menus.create",
            "menus.onClicked",
            "menus.getTargetElement",
            "pageAction.openPopup",
            "pageAction.show",
            "tabs.executeScript"
        ],
        "name": "menu-remove-element"
    },
    {
        "description": "Illustrates how to retrieve a list of search engines and issue a search request, using search engine details added to the context menu for selected text.",
        "javascript_apis": [
            "search.search",
            "search.get",
            "menus.create",
            "menus.onClicked"
        ],
        "name": "menu-search"
    },
    {
        "description": "This example shows two methods of testing an extension: running tests from within the extension, and running tests from the command line using Karma.",
        "javascript_apis": [
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "mocha-client-tests"
    },
    {
        "description": "Example of native messaging, including a Python application and an extension which exchanges messages with it.",
        "javascript_apis": [
            "browserAction.onClicked",
            "runtime.connectNative"
        ],
        "name": "native-messaging"
    },
    {
        "description": "Demonstration of the webNavigation API, showing basic stats about which pages you've visited.",
        "javascript_apis": [
            "storage.local",
            "webNavigation.onCommitted",
            "webNavigation.onCompleted"
        ],
        "name": "navigation-stats"
    },
    {
        "description": "Shows a localized notification when the user clicks on links.",
        "javascript_apis": [
            "extension.getURL",
            "i18n.getMessage",
            "notifications.create",
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "notify-link-clicks-i18n"
    },
    {
        "description": "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.",
        "javascript_apis": [
            "browserAction.onClicked",
            "tabs.create"
        ],
        "name": "open-my-page-button"
    },
    {
        "description": "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.",
        "javascript_apis": [],
        "name": "page-to-extension-messaging"
    },
    {
        "description": "Demonstrates optional permissions using the permissions API.",
        "javascript_apis": [
            "browserAction.onClicked",
            "permissions.getAll",
            "permissions.remove",
            "permissions.request",
            "runtime.getURL",
            "tabs.create"
        ],
        "name": "permissions"
    },
    {
        "description": "Example dynamic theme: sets a dark theme for private windows.",
        "javascript_apis": [
            "theme.reset",
            "theme.update",
            "windows.getAll",
            "windows.onCreated"
        ],
        "name": "private-browsing-theme"
    },
    {
        "description": "Uses the proxy API to block requests to hosts specified on a list.",
        "javascript_apis": [
            "extension.getURL",
            "proxy.onRequest",
            "proxy.onError",
            "storage.local",
            "storage.onChanged"
        ],
        "name": "proxy-blocker"
    },
    {
        "description": "Allows the user to make quick notes by clicking a button and entering text into the resulting popup. The notes are saved in storage.",
        "javascript_apis": [
            "storage.local"
        ],
        "name": "quicknote"
    },
    {
        "description": "Shows how to get details about a request's TLS connection.",
        "javascript_apis": [
            "webRequest.getSecurityInfo"
        ],
        "name": "root-cert-stats"
    },
    {
        "description": "Demo of various runtime APIs.",
        "javascript_apis": [
            "browserAction.onClicked",
            "notifications.create",
            "runtime.getManifest",
            "runtime.onInstalled",
            "runtime.reload"
        ],
        "name": "runtime-examples"
    },
    {
        "description": "Demonstrates how to write to the clipboard from a content script",
        "javascript_apis": [],
        "name": "selection-to-clipboard"
    },
    {
        "description": "Demonstrates how to retrieve extension-defined state from restored tabs.",
        "javascript_apis": [
            "menus.create",
            "menus.onClicked",
            "sessions.getTabValue",
            "sessions.setTabValue",
            "tabs.insertCSS",
            "tabs.onCreated",
            "tabs.onUpdated",
            "tabs.query"
        ],
        "name": "session-state"
    },
    {
        "description": "Demonstrates how to use the idb-file-storage library to store and manipulate files in an extension.",
        "javascript_apis": [
            "browserAction.onClicked",
            "contextMenus.create",
            "contextMenus.onClicked",
            "runtime.onMessage",
            "runtime.sendMessage",
            "tabs.create",
            "windows.create"
        ],
        "name": "store-collected-images"
    },
    {
        "description": "Performs basic authentication by supplying stored credentials.",
        "javascript_apis": [
            "storage.local",
            "webRequest.onAuthRequired",
            "webRequest.onCompleted",
            "webRequest.onErrorOccurred"
        ],
        "name": "stored-credentials"
    },
    {
        "description": "Demonstrates tab manipulation: opening, closing, moving, zooming tabs.",
        "javascript_apis": [
            "browserAction.setBadgeBackgroundColor",
            "browserAction.setBadgeText",
            "tabs.create",
            "tabs.duplicate",
            "tabs.getZoom",
            "tabs.move",
            "tabs.onCreated",
            "tabs.onMoved",
            "tabs.onRemoved",
            "tabs.query",
            "tabs.reload",
            "tabs.remove",
            "tabs.setZoom",
            "tabs.Tab",
            "tabs.update"
        ],
        "name": "tabs-tabs-tabs"
    },
    {
        "description": "A sidebar that integrates with the current theme.",
        "javascript_apis": [
            "theme.getCurrent",
            "theme.onUpdated",
            "windows.getCurrent"
        ],
        "name": "theme-integrated-sidebar"
    },
    {
        "description": "An example of how to use the management API for themes.",
        "javascript_apis": [
            "management.getAll",
            "management.setEnabled"
        ],
        "name": "theme-switcher"
    },
    {
        "description": "A collection of themes illustrating:<ul><li>weta_fade: a basic theme employing a single image specified in <code>theme_frame:</code>.</li><li>weta_fade_chrome: the weta_fade theme implemented with Chrome compatible manifest keys.</li><li>weta_tiled: a theme using a tiled image.</li><li>weta_mirror: a theme using multiple images and aligning those images in the header.</li><li>animated: use of an animated PNG.</li></ul>",
        "javascript_apis": [],
        "name": "themes"
    },
    {
        "description": "Demonstration of the topSites API.",
        "javascript_apis": [
            "topSites.get"
        ],
        "name": "top-sites"
    },
    {
        "description": "Demonstrates using the webRequest API to rewrite the User-Agent HTTP header.",
        "javascript_apis": [
            "extension.getBackgroundPage",
            "webRequest.onBeforeSendHeaders"
        ],
        "name": "user-agent-rewriter"
    },
    {
        "description": "Illustrates how an extension can register URL-matching user scripts at runtime.",
        "javascript_apis": [
            "userScripts.register",
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "user-script-register"
    },
    {
        "description": "Demonstrates how to use webpack to package npm modules in an extension.",
        "javascript_apis": [
            "runtime.onMessage",
            "runtime.sendMessage"
        ],
        "name": "webpack-modules"
    },
    {
        "description": "Demonstrates how to manipulate windows: opening, closing, resizing windows.",
        "javascript_apis": [
            "windows.create",
            "windows.getAll",
            "windows.getCurrent",
            "windows.remove",
            "windows.update",
            "windows​.Window"
        ],
        "name": "window-manipulator"
    },
    {
        "description": "Demonstrates the use of protocol handlers.",
        "javascript_apis": [],
        "name": "open-irc-links"
    }
]
