Firefox for Android offers a subset of WebExtension features 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.
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, WebExtensions for Firefox for Android do not support the following APIs and manifest.json keys:
commandsand the related
commandsmanifest.json key, as Android tablets and smartphones do not usually have a physical keyboard from which ‘commands’ can be issued.
sidebarActionand the related
sidebar_actionmanifest.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.
windowsas there is only one Firefox on Android 'window', so it has no ability to open or otherwise manipulate additional browser windows.
browserAction and the browser_action manifest.json key is under development. Firefox 55 will support
default_popup of the manifest.json key
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.getTitle methods will be added.
Effect on your add-on UI
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.
At the time of writing there was an issue with
pageAction.show() not working, which means the page action button cannot be displayed. More details can be found in bug 1364716. To work around this issue use a bundled wep page, displayed using
tabs, to provide access to your add-on's features. You may also want to listen for the tab containing the page being closed, using
tabs.onRemoved, and reopen it automatically to maintain access to your add-on's page.
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.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.) And you can set a listener to
pageAction.getPopup() are also available, so you can update the popup or create a popup once the add-on is running.
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:
- zoom features, Firefox for Android has one zoom level only, which the user can override with a pinch gesture on the page.
- features related to selecting and moving tabs, again as these features are not supported on Android.
- the ability to detect a tab's language or muted status.
Other UI related API and manifext.json key differences
There 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.
- The chrome_url_overrides and chrome_settings_overrides manifest.jason 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.
omniboxand 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.
- The options_ui manifest.json key, which means you cannot provide options settings on about:addons. (And, as a consequence,
runtime.openOptionsPage()is not available either.) You can, however, offer your users a page for setting add-on options using a bundled wep page displayed using
tabs, you just have to add a button or other mechanism in your add-on to access the page.
- At the time of writing the options_ui key was being implemented under bug 1302504.
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 WebExtensions do not support the APIs to extend the developer tools:
- devtools.panels and the related devtools_page manifest.json key.
Native application interaction
Permissions to use certain WebExtension APIs must be requested in the manifest.json file. On the desktop version of Firefox users are warned when a WebExtension 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.