Differences between desktop and Android extensions
There are some important distinctions to know when developing an extension for Android
There are some important distinctions to know when developing an extension for Android
In August 2020, Mozilla launched a new, reimagined Firefox for Android experience (codenamed "Fenix"). The browser for Android has been rebuilt from the ground up using GeckoView, Mozilla's mobile browsing engine.
Currently, only a limited number of Recommended Extensions are supported. However, we are continuously working on increasing support, taking into account usage and feedback to ensure we are making the most of our available resources. We will post updates to The Add-ons Blog as plans solidify each quarter.
For information about extension development in Firefox for Android 79+, please see this article.
This article was last updated prior to Firefox 54 and is out of date.
Firefox for Android offers a subset of the WebExtensions APIs available to the desktop version of Firefox. Some of these differences are due to the nature of the Android environment and therefore the features Firefox can implement, others are where Firefox for Android does not yet offer all the desktop features. This article describes and explains these differences and looks at the impact they might have on your add-on development.
This summary is based on the features planned for Firefox version 54.
A detailed list of the WebExtension APIs supported in Firefox for Android is provided on the Browser support for JavaScript APIs page and details of the supported manifest.json
keys are provided on the manifest.json section page.
Firefox for Android offers a streamlined version of the UI found in desktop Firefox, ensuring Firefox offers an enjoyable and engaging experience on mobile. Some of the differences relate to how the Android UI differs from the desktop UIs found in Linux, Mac OS, and Windows. For example, Android does not support a windowing environment, and devices do not usually include a physical keyboard, from which keyboard shortcuts can be issued. Other differences relate to optimizing usability on smaller mobile device screens.
As a result of the UI differences, extensions for Firefox for Android do not support the following APIs and manifest.json
keys:
commands
and the related commands
manifest.json
key, as Android tablets and smartphones do not usually have a physical keyboard from which ‘commands’ can be issued.sidebarAction
and the related sidebar_action
manifest.json
key, due to the limited screen real estate on Android devices sidebars, such as the browser history, are presented in full browser tabs. Where possible, you should move any sidebar content to tabs as well.windows
as there is only one Firefox on Android 'window', so it has no ability to open or otherwise manipulate additional browser windows.Support for browserAction
and the browser_action
manifest.json
key is under development. Firefox 55 will support default_title
and default_popup
of the manifest.json
key browser_action
, using default_title
to add an item to the Firefox for Android menu, and the browserAction.onClicked()
event will be available to listen for the menu item being tapped. Additionally, in Firefox 57 support for the browserAction.setTitle
and browserAction.getTitle
methods will be added.
These differences impact the way you expose your add-on in the Firefox UI. The most common option, adding a button for your add-on to the Firefox toolbar with browserAction
, is not available (at least until Firefox 55). Nor can you expose your add-on through a sidebar or context menu. You will, therefore, use an address bar button (through the manifest.json
page_action
key and pageAction
API) remembering that by default this button is hidden and must be shown programmatically.
The features of pageAction
are also reduced in Firefox for Android. The manifest.json
key page_action enables you to define the button icon and a popup. You then have use of pageAction.show()
and pageAction.hide()
however, once ‘shown’, note that the address bar button is visible in all tabs (unlike the desktop behavior, where the button is shown only for a specified tab.) But you will still be able to hide the pageAction using pageAction.hide()
on a specific tab (say, for example, you wish to hide your extension's page action icon in about:addons
or about:memory
tabs) And you can set a listener to pageAction.onClicked()
. pageAction.setPopup()
and pageAction.getPopup()
are also available, so you can update the popup or create a popup once the add-on is running.
Also, in both pageAction
and browserAction
popup content is opened in a new tab and persists until the user manually closes the tab.
You can also manipulate tabs on Firefox for Android. The tabs
API enables you to perform most of the actions you can on the desktop, the main exceptions are:
manifest.json
key differencesThere are some other UI features not supported, these are:
bookmarks
, which means you cannot manipulate the user's bookmarks, although the user can do this themselves through the UI.browsingData
, which means you cannot offer users features to clear browser data such as history, downloads, passwords, and alike.chrome_url_overrides
and chrome_settings_overrides
manifest.json
keys, which means you cannot add custom home and new tab pages.contextMenus
, which means you cannot add options to context menus.history
, which means you cannot search or manipulate the history of browsed pages.omnibox
and the related omnibox
manifest.json
key, which means you cannot provide custom address bar suggestions.sessions
, which means you cannot list and restore tabs that have been closed while the browser has been running.options_ui
manifest.json
key can be used only from Firefox for Android version 57 and above.Developer tools for Firefox for Android are provided through remote debugging mechanisms over USB or Wi-Fi that connect to the WebIDE on a desktop. Therefore, Firefox for Android does not provide any built-in developer tools and its extensions do not support the APIs to extend the developer tools:
devtools.inspectedWindow
devtools.network
devtools.panels
and the related devtools_page
manifest.json
key.You do not have the ability to interact with native applications as runtime.connectNative()
and runtime.sendNativeMessage()
are not available.
Permissions to use certain WebExtension APIs must be requested in the manifest.json
file. On the desktop version of Firefox users are warned when an extension requests a permission and are given the option to deny the add-on that permission. However, on Firefox for Android permissions are granted automatically and the user isn’t given the option to deny them. It is currently planned to resolve this issue in Firefox 57.
At the time of writing there was an issue with storage.sync()
and data is not synchronized with the user’s Firefox account from Firefox for Android. More details can be found in bug 1316442.
Develop
Develop
Develop