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
--------------------------

### HTML

* 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).
### CSS

* 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`.
### JavaScript

* 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).
### APIs

* The `sendOrder` property of the `WebTransportSendStream` interface is now supported, allowing the relative priority of outgoing WebTransport API *bidirectional* streams to be read and changed after the stream is created. Note that this cannot be used to modify the priority of unidirectional streams, as Firefox implements them as `WritableStream` instead of `WebTransportSendStream`. (For more information see Firefox bug 1853444.)

#### DOM

* `HTMLInputElement.showPicker()` now works for `<input type="week">` and `<input type="month">` elements on Android (Firefox bug 1853797).
### WebAssembly

* 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 the `browsingContext.contextDestroyed` event that is emitted when a browsing context is discarded (Firefox bug 1694390).
* Added support for the `userActivation` parameter for the `script.callFunction` and `script.evaluate` commands which allows evaluating JavaScript while emulating the user action. (Firefox bug 1845488).
* Added support for the `defaultValue` field for the `browsingContext.userPromptOpened` event that allow users to retrieve the default value of prompts (Firefox bug 1851761).
* Renamed the `viewportOptions` parameter for the `browsingContext.captureScreenshot` command to `boxOptions` (Firefox bug 1859258).
* Removed the `scrollIntoView` parameter for the `browsingContext.captureScreenshot` command, in favor of the `origin` parameter below (Firefox bug 1862649).
* Added support for the `origin` parameter for the `browsingContext.captureScreenshot` command which allows defining the origin and bounds of the screenshot. The accepted values are `"document"` and `"viewport"` (Firefox bug 1840999).
* When serializing `Window` objects, the serialized value now contains a `context` property set to the context id for the `Window` object which can also be exchanged with Marionette to reference specific windows and frames (Firefox bug 1841049).
* Fixed a bug where serialization of a Node nested in a data structure (array, map, etc.) would fail (Firefox bug 1861000).
* Fixed a bug where the `browsingContext.navigate` command could return an incorrect navigation id (Firefox bug 1861655).

#### Marionette

* 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: `dom.select.showPicker.enabled`

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
--------------

* Firefox 120 for developers
* Firefox 119 for developers
* Firefox 118 for developers
* Firefox 117 for developers
* Firefox 116 for developers
* Firefox 115 for developers
* Firefox 114 for developers
* Firefox 113 for developers
* Firefox 112 for developers
* Firefox 111 for developers
* Firefox 110 for developers
* Firefox 109 for developers
* Firefox 108 for developers
* Firefox 107 for developers
* Firefox 106 for developers
* Firefox 105 for developers
* Firefox 104 for developers
* Firefox 103 for developers
* Firefox 102 for developers
* Firefox 101 for developers
* Firefox 100 for developers
* Firefox 99 for developers
* Firefox 98 for developers
* Firefox 97 for developers
* Firefox 96 for developers
* Firefox 95 for developers
* Firefox 94 for developers
* Firefox 93 for developers
* Firefox 92 for developers
* Firefox 91 for developers
* Firefox 90 for developers