Unless otherwise noted, the following changes apply to the newest Chrome beta
channel release for Android, ChromeOS, Linux, macOS, and Windows. Learn more
about the features listed here through the provided links or from the list on
ChromeStatus.com. Chrome 124 is beta as of 20 March 2024. You can download the
latest on [Google.com](https://www.google.com/chrome/beta/) for desktop or on
Google Play Store on Android.

## CSS

This release adds two new CSS features.

### `CSSImportRule.styleSheet`

Allow `CSSImportRule.styleSheet` to be nullable. The `styleSheet` attribute in
`CSSImportRule` can be null if there is no associated CSS style sheet.

### `CSSKeyframesRule.length`

Exposes the `length` attribute of `CSSKeyframesRule`. Interfaces that support
indexed properties must define an integer-typed attribute named `length`.

## HTML

This release adds two new HTML features.

### The `writingsuggestions` attribute

Browsers are starting to provide writing suggestions to users as they type on
various editable fields across the web. While this is generally useful for
users, there are cases when developers may want to turn off browser-provided
writing assistance, such as extensions or sites that provide similar
functionality of their own.

The new attribute `writingsuggestions` has values of `true` or `false` that
allow developers to turn on or off browser-provided writing suggestions. The
attribute's state for an element can also be inherited from ancestor elements,
thereby allowing developers to control this functionality at a per-element or
per-document or sub-document scale.

### Keyboard-focusable scroll containers

Improves accessibility by making scroll containers focusable using sequential
focus navigation. Prior to this change, the tab key doesn't focus scrollers
unless `tabIndex` is explicitly set to 0 or more.

By making scrollers focusable by default, users who can't (or don't want to) use
a mouse will be able to focus clipped content using a keyboard's tab and arrow
keys. This behavior is enabled only if the scroller does not contain any
keyboard focusable children.

This feature will be rolled out slowly starting from Chrome 124, and available
to all users by Chrome 125. Learn more about
[keyboard focusable scrollers](https://developer.chrome.com/blog/keyboard-focusable-scrollers.md.txt).

## Web APIs

### Additions to the Attribution Reporting API

Features have been added to the Attribution Reporting API to create additional
debugging capabilities by supporting parsing failure debug reports, improve API
ergonomics by supporting a field to specify preferred registration platform, and
improve privacy.

### Document picture-in-picture: add option to hide back-to-tab button

This adds a new parameter (`disallowReturnToOpener`) to the document
picture-in-picture API that, when set to true, hints to the browser that it
shouldn't show a button in the picture-in-picture window that allows the user
to go back to the opener tab.

While having a button to return to the opener tab always makes sense in the
video picture-in-picture case (the video stream can be returned to the video
element in the opener tab), this is not always the case for document
picture-in-picture experiences. This gives developers more control over the user
experience when they determine that such a button does not make sense for their
use case.

Learn more in the
[documentation for Document picture-in-picture](https://developer.chrome.com/docs/web-platform/document-picture-in-picture.md.txt#hide_the_back_to_tab_button_of_the_picture-in-picture_window).

### Document render-blocking

This feature enables authors to block rendering of a document until the critical
content has been parsed, ensuring a consistent first paint across all browsers.
Without this feature, the first paint's state depends on the heuristics for
parser yielding which can vary across browsers.

This is particularly important for View Transitions where the parsed DOM state
on the first frame can drastically change the transition created.

Note that this feature implements a `<link rel=expect href="#id">` syntax that
allows a link element to reference another expected element on the page. The
rendering is then blocked until the expected element is fully parsed. This
supersedes the previous implementation of an HTML attribute that allows the
whole document to be render-blocked.

### `jitterBufferTarget` attribute

The `jitterBufferTarget` attribute allows applications to specify a target
duration of time in milliseconds of media for the `RTCRtpReceiver` jitter buffer
to hold. This influences the amount of buffering done by the user agent, which
in turn affects retransmissions and packet loss recovery. Altering the target
value allows applications to control the tradeoff between playout delay and the
risk of running out of audio or video frames due to network jitter.

### `pageswap` event

The `pageswap` event is fired on a document's window object when a navigation
will replace this document with a new document. The event provides activation
info about the navigation (`type`, `NavigationHistoryEntry` for the new
document).

If the navigation has a cross-document view transition, the event is dispatched
before capturing state for the old document. This allows the developer to
configure the old state captured for the transition based on the navigation's
activation info and the current visual state of the old document.

### `priority` HTTP request header

This adds the `priority` request header for all HTTP requests with the priority
information for the request at the time that it was sent.

RFC 9218 (Extensible Prioritization Scheme for HTTP) defines a `priority` HTTP
request header to use for signaling request priority to origins (and
intermediaries). It also defines negotiation processes and protocol-level frames
for HTTP/2 and HTTP/3 to carry the same priority information.

The header can only signal the initial priority for a resource when it was first
requested while the frame-based mechanisms allow for modifying the priority
after the fact.

The header can operate end-to-end to the origin servers (and provide a mechanism
for the origin to override the priority if recognized by intermediaries) while
the frames are limited to operating on a link level.

This feature is specifically for supporting the header-based prioritization
scheme.

### Private Network Access permission to relax mixed content

To establish connections to devices on a local network that don't have globally
unique names, and therefore cannot obtain TLS certificates, this feature
introduces a new option to `fetch()` to declare a developers' intent to talk to
such a device. This includes a new policy-controlled feature to gate each site's
access to this capability, and new headers for the server's preflight response
to provide additional metadata.

### Sec-CH-UA-Form-Factors client hint

This hint gives a server information about the user agent's form-factors. It
returns one or more of the following form-factor values:

- **Desktop**: A user-agent running on a personal computer.
- **Automotive**: A user-agent embedded in a vehicle, where the user may be responsible for operating the vehicle and unable to attend to small details.
- **Mobile**: Small, touch-oriented device typically carried on a user's person.
- **Tablet**: A touch-oriented device larger than "Mobile" and not typically carried on a user's person.
- **XR**: Immersive devices that augment or replace the environment around the user.
- **EInk**: A device characterized by slow screen updates and limited or no color resolution.
- **Watch**: A mobile device with a tiny screen (typically less than two inches), carried in such a way that the user can glance at it quickly.

### `setHTMLUnsafe` and `parseHTMLUnsafe`

The `setHTMLUnsafe` and `parseHTMLUnsafe` methods allow the Declarative Shadow
DOM to be used from JavaScript. These methods also offer an easier way to
imperatively parse HTML into DOM, as compared to `innerHTML` or `DOMParser`.

### Updates to the Shared Storage API

This update adds support for running cross origin worklets without having to
create an iframe.

### Streams API: ReadableStream async iteration

The streams APIs provide ubiquitous, interoperable primitives for creating,
composing, and consuming streams of data. This change adds support for the
[async iterable protocol to the ReadableStream API](https://web.dev/articles/streams#asynchronous_iteration),
enabling readable
streams to be used as the source of for `await...of` loops.

### SVG `context-fill` and `context-stroke`

Implements an existing SVG feature that allows the keywords `context-fill` and
`context-stroke` when specifying fill and stroke properties. This only affects
SVG sub-trees that are instantiated with a `<use>` element, and `<marker>`
elements that are instantiated using the `marker` property on a `<path>`
element. In those circumstances, `context-fill` and `context-stroke` are
resolved to the value of the `fill` and `stroke` properties on the `<use>` or
`<path>`.

### WebGPU: ServiceWorker and SharedWorker support

ServiceWorker and SharedWorker support is added to WebGPU, aligning with
existing WebGL capabilities.

Service Workers enable offline capabilities and background processing for
WebGPU. This means graphics-intensive web applications or Chrome Extensions can
cache resources and perform computations even when the user isn't actively
interacting with the page.

Shared Workers allow multiple tabs or extension contexts to coordinate and share
WebGPU resources. This leads to smoother performance and more efficient use of
the user's graphics hardware.

### The WebSocketStream API

The WebSocket API provides a JavaScript interface to the RFC6455 WebSocket
protocol. While it has served well, it is awkward from an ergonomics perspective
and is missing the important feature of backpressure. The intent of the
WebSocketStream API is to resolve these deficiencies by integrating WHATWG
Streams with the WebSocket API.

Learn more in
[WebSocketStream: integrating streams with the WebSocket API](https://developer.chrome.com/docs/capabilities/web-apis/websocketstream.md.txt).

### X25519Kyber768 key encapsulation for TLS

Protects current Chrome TLS traffic against future quantum cryptanalysis by
deploying the Kyber768 quantum-resistant key agreement algorithm.

This is a hybrid X25519 and Kyber768 key agreement based on an IETF standard.
This specification and launch is outside the scope of W3C. This key agreement
will be launched as a TLS cipher, and should be transparent to users.

Learn more in
[Protecting Chrome Traffic with Hybrid Kyber KEM](https://blog.chromium.org/2023/08/protecting-chrome-traffic-with-hybrid.html).

## Origin trials in progress

In Chrome 124 you can opt into the following new [origin
trials](https://developer.chrome.com/docs/web-platform/origin-trials).

### Deprecation trial for mutation events

Mutation events, including `DOMSubtreeModified`, `DOMNodeInserted`,
`DOMNodeRemoved`, `DOMNodeRemovedFromDocument`, `DOMNodeInsertedIntoDocument`,
and `DOMCharacterDataModified`, can damage page performance, and also
significantly increase the complexity of adding new features to the Web. These
APIs were deprecated from the specification in 2011, and were replaced (in 2012)
by the much better-behaved Mutation Observer API.

Mutation event support
[will be disabled by default starting in Chrome 127](https://developer.chrome.com/blog/mutation-events-deprecation.md.txt),
around July 30, 2024. Code should be
migrated to the Mutation Observer API before that date to avoid site breakage.
If more time is needed, register for
[Mutation events deprecation trial](https://developer.chrome.com/origintrials#/view_trial/919297273937002497)
to re-enable the feature
for a limited time on a given site. This can be used through Chrome 134, ending
March 25, 2025.

Alternatively, a `MutationEventsEnabled` enterprise policy can also be used for
the same purpose, also through Chrome 134.

Register for the
[Mutation events deprecation trial](https://developer.chrome.com/origintrials#/view_trial/919297273937002497).

## Deprecations and removals

This version of Chrome introduces the following deprecations and removals.
Visit [ChromeStatus.com](https://chromestatus.com)
for lists of planned deprecations, current deprecations
and previous removals.

This release of Chrome removes one feature.

### Remove "window-placement" alias for permission and permission policy "window-management"

Removes the "window-placement" alias for permission and permission policy
"window-management". This is part of a larger effort to rename the strings by
eventually
[deprecating and removing "window-placement"](https://developer.chrome.com/docs/capabilities/web-apis/window-management.md.txt#the_window-management_permission).
The terminology change improves the longevity of the descriptor as the Window
Management API evolves over time.