And now for … Firefox 84

As December ushers in the final curtain for this rather eventful year, there is time left for one more Firefox version to be given its wings. Firefox 84 includes some interesting new features including tab order inspection, complex selector support in :not(), the PerformancePaintTiming API, and more!

This blog post provides merely a set of highlights; for all the details, check out the following:

DevTools gets tab order inspection

The Firefox Developer Tools have gotten a rather nice addition to the Accessibility Inspector this time around — A “Show Tabbing Order” checkbox. When checked, this toggles a visual overlay showing the tabbing order or table items on the current page. This provides a high-level overview of how the page will be navigated using the tab key, which may highlight problems more effectively than simply tabbing through the elements.

a web page with multiple tabbable items showing the tab order for those items visuallly

Web platform additions

Firefox 84 brings some new Gecko platform additions, the highlights of which are listed below.

Complex selector support in :not()

The :not() pseudo-class is rather useful, allowing you to apply styles to elements that don’t match one or more selectors. For example, the following applies a blue background to all elements that aren’t paragraphs:

:not(p) {
  background-color: blue;

However, it was of limited use until recently as it didn’t allow any kind of complex selectors to be negated. Firefox 84 adds support for this, so now you can do things like this:

:not(option:checked) {
  color: #999;

This would set a different text color on <select> options that are not currently selected.


The PerformancePaintTiming interface of the Paint Timing API provides timing information about “paint” (also called “render”) operations during web page construction, which is incredibly useful for developers wishing to develop their own performance tooling.

For example:

function showPaintTimings() {
  if (window.performance) {
    let performance = window.performance;
    let performanceEntries = performance.getEntriesByType('paint');
    performanceEntries.forEach( (performanceEntry, i, entries) => {
      console.log("The time to " + + " was " + performanceEntry.startTime + " milliseconds.");
  } else {
    console.log('Performance timing isn\'t supported.');

Would output something like this in supporting browsers:

The time to first-paint was 2785.915 milliseconds.
The time to first-contentful-paint was 2787.460 milliseconds.

AppCache removal

AppCache was an attempt to create a solution for caching web app assets offline so the site could continue to be used without network connectivity. It seemed to be a good idea because it was really simple to use and could solve this very common problem easily. However, it made many assumptions about what you were trying to do and then broke horribly when your app didn’t follow those assumptions exactly.

Browser vendors have been planning its removal for quite some time, and as of Firefox 84, we have finally gotten rid of it for good. For creating offline app solutions, you should use the Service Worker API instead.


Starting with Firefox 84, users will be able to manage optional permissions for installed add-ons through the Add-ons Manager.

web extensions permissions dialog showing that you cna turn optional permissions on an off via the UI

We recommend that extensions using optional permissions listen for browser.permissions.onAdded and browser.permissions.onRemoved API events. This ensures the extension is aware of the user granting or revoking optional permissions.

Additionally, extension developers can now zoom extension panels, popups, and sidebars using Ctrl + scroll wheel (Cmd + scroll wheel on macOS).

We’ve also fixed an issue where search engine changes weren’t being reset under certain circumstances when an add-on was uninstalled.

WebRender comes to Linux and Android

In our previous Firefox release we added support for our WebRender rendering architecture to a number of new Windows and macOS versions. This time around we are pleased to add a subset of Linux and Android devices. In particular, we’ve enabled WebRender on:

  • Gnome-, X11-, and GLX-based Linux devices.
  • Android Mali-G GPU series phones (which represent approximately 27% of the Fenix release population).

We’re getting steadily closer to our dream of a 60fps web for everyone.

Localhost improvements

Last but not least, we’d like to draw your attention to the fact that we’ve made some significant improvements to the way Firefox handles localhost URLs in version 84. Firefox now ensures that localhost URLs — such as http://localhost/ and http://dev.localhost/ — refer to the local host’s loopback interface (e.g.

As a result, resources loaded from localhost are now assumed to have been delivered securely (see Secure contexts), and also will not be treated as mixed content. This has a number of implications for simplifying local testing of different web features, especially for example those requiring secure contexts (like service workers).

About Chris Mills

Chris Mills is a senior tech writer at Mozilla, where he writes docs and demos about open web apps, HTML/CSS/JavaScript, A11y, WebAssembly, and more. He loves tinkering around with web technologies, and gives occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. He lives near Manchester, UK, with his good lady and three beautiful children.

More articles by Chris Mills…


  1. Stephan Sokolow

    For creating offline app solutions, you should use the Service Worker API instead.

    I guess I won’t be creating or using offline app solutions then.

    I disabled service workers in about:config ages ago (and locked it down in user.js) for lack of a NoScript analogue. Aside from games, web browsers are already the heaviest interactive thing my system runs by an order of magnitude.

    December 15th, 2020 at 12:48

  2. Ty

    They should focus on those problems with YouTube. I am so getting tired of having to switch to Chrome when I watch anything heavier than 1080p, and the comment section often loads forever, or doesn’t appear at all.

    December 15th, 2020 at 18:15

    1. Eamon

      @Ty – youtube should work fine; it does on various machines I use, including 4k videos. It’s possible there’s some addon issue, and stuff like this tends to be dependant on details of the GFX pipeline setup, so even if whatever issue you’re running into is firefox-specific, the details of which OS, which GPU, and any unusual display-driver settings are likely necessary to resolve the issue.

      (But be sure to try and reproduce it on a clean profile, with 0 addons, to isolate that factor)

      December 16th, 2020 at 02:45

  3. zakius

    okay, so optional permissions landed so it’s time to allow ContentScripts to run on Mozilla pages, pages generated by extensions and internal pages (except extension management, just to be extra sure)
    without that WebExtensions only products stay useless
    and even with that it’s merely a workaround of a bigger problem

    December 16th, 2020 at 00:54

    1. Klaster_1

      Second this, I am really bummed when I suddenly can’t use gestures on a page, especially when changing tabs with a mouse scroll and one of the tabs is an internal page and the gesture stops.

      December 17th, 2020 at 03:40

  4. Al

    Thanks for the update Chris!

    December 16th, 2020 at 05:06

  5. Eugene

    They to fixed from running TOO many process on my computer and freezing. There was a time firefox ran smooth w/a bunch of tabs open.

    December 16th, 2020 at 08:15

  6. Mark

    How do I turn off that irritating popup on top of the screen when I try to open a magnet link, it is irritating.

    December 18th, 2020 at 02:00

  7. Simon

    I have a Apache web server running on a the local IP network address with several virtual hosts, e.g. https://myserver.localhost. It seems I can no longer access them with Firefox 84.

    December 18th, 2020 at 06:30

    1. Konstantinos Liakos

      >I have a Apache web server running on a the local IP network address > with several virtual hosts, e.g. https://myserver.localhost. It >seems I can no longer access them with Firefox 84.


      December 18th, 2020 at 09:23

  8. Simon

    Seems that Firefox 84 enforces now that TLD .localhost is served from I had to change all my virtual domains to .test

    December 19th, 2020 at 03:04

  9. Denis

    For those who suffered from forced resolution of *.localhost as

    Go to about:config and try to set`network.proxy.allow_hijacking_localhost` to `true`.

    It worked for me.

    January 4th, 2021 at 09:16

Comments are closed for this article.