Firefox 121 for developers

This article provides information about the changes in Firefox 121 that affect developers. Firefox 121 was released on December 19, 2023.

Changes for web developers


  • Lazy loading of <iframe> elements is now supported, allowing developers to hint that particular <iframe> elements should only be loaded when (and if) they become visible. This can speed up initial load time by reducing the resources that need to be fetched on page load (some <iframe> elements may not need to be fetched at all). The hint can be provided via the loading attribute on the <iframe> element, or in JavaScript using HTMLIFrameElement.loading. (Firefox bug 1622090).


  • The text-wrap property has been updated with support for the values balance and stable. The balance value is used for short blocks of content, such as headings, and will make sure that the content is balanced and easy to read when spread over multiple lines. The stable value makes sure that editable content does not reflow while the user is editing it (Firefox bug 1731541).
  • The :has() selector, commonly referred to as the parent selector, is now supported. It allows developers to apply styles to an element based on related elements, e.g. li:has(ul) will match a list which contains a sub-list, or h1:has(+ p) will match a heading with a paragraph directly after it.
  • The text-indent CSS property now supports the each-line and hanging property values (Firefox bug 784648), allowing developers to more easily specify certain text indentation styles. Additionally, developers can now combine multiple text-indent property values for more creativity, e.g. text-indent: 3em hanging each-line.


  • The Promise.withResolvers() static method is now supported. This exposes the resolve and reject callback functions in the same scope as the returned Promise, allowing code that resolves or rejects the promise to be defined after its construction (Firefox bug 1845586).
  • Date.parse() now accepts several additional date formats:
    • Year > 9999 for YYYY-MMM-DD format (e.g. 19999-Jan-01) (Firefox bug 1858851)
    • MMM-DD-YYYY (e.g. Jan-01-1970) (Firefox bug 1863489)
    • Milliseconds for non-ISO date formats (e.g. Jan 1 1970 10:00:00.050) (Firefox bug 1863125)
    • Day of week at the beginning of formats which were being rejected, such as:
      • Wed, 1970-01-01
      • Wed, 1970-Jan-01
      The day of week does not need to be correct, or a day of week at all; for example, foo 1970-01-01 works (Firefox bug 1617562).
  • Other Date.parse() fixes:
    • YYYY-M-DD and YYYY-MM-D are no longer assumed GMT as an ISO date YYYY-MM-DD would be (Firefox bug 1783731).
    • Milliseconds for all formats are truncated after 3 digits, rather than being rounded (Firefox bug 746529).




  • WebAssembly now supports tail call optimization via new return_call and return_call_indirect alternatives to the call instruction. This improves performance, reduces stack space usage, and enhances compatibility with programming languages that use tail calls. (Firefox bug 1858855).

WebDriver conformance (WebDriver BiDi, Marionette)

WebDriver BiDi


  • Added support for serializing and deserializing Window and Frame objects (Firefox bug 1274251).

Experimental web features

These features are newly shipped in Firefox 121 but are disabled by default. To experiment with them, search for the appropriate preference on the about:config page and set it to true. You can find more such features on the Experimental features page.

Custom element state pseudo-class: dom.element.customstateset.enabled

Custom elements can expose their internal state via the states property as a CustomStateSet. A CSS custom state pseudo-class such as :--somestate can match that element's state. (Firefox bug 1861466)

showPicker() method for HTML select elements:

The HTMLSelectElement.showPicker() method programmatically launches the browser picker for a <select> element, triggered by user interaction. (Firefox bug 1854112)

Changes for add-on developers

  • Fixed a bug that resulted in background pages not starting when a manifest.json background key contains service_worker and scripts declarations (Firefox bug 1860304).

    Note: Incidentally, a change in Chrome 121 sees the scripts property ignored when specified with the service_worker property. Previously, Chrome refused to load extensions containing both properties (Chromium bug 1418934). For more information, see Browser support of the background manifest key.

Older versions