![Rachel Andrew](https://web.dev/images/authors/rachelandrew.jpg) Rachel Andrew Technical Writer [GitHub](https://github.com/rachelandrew) [LinkedIn](https://www.linkedin.com/in/rachelandrew) [Mastodon](https://front-end.social/@rachelandrew) [Bluesky](https://bsky.app/profile/rachelandrew.bsky.social) [Homepage](https://rachelandrew.co.uk)

<br />


Published: January 14, 2026

<br />

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 is beta as of January 14, 2026. You can download the
latest on [Google.com](https://www.google.com/chrome/beta/) for desktop or on
Google Play Store on Android.

## CSS and UI

### Support the `text-justify` CSS property

Developers can control how text is justified when `text-align: justify` is
applied by using the `text-justify` property. For example, forcing justification
by expanding inter-character space, even in English text.

### Refine `border-radius` shadow edge computation for high `border-radius` values

This improvement ensures that shadows and clip boundaries on near-circular
elements (where `border-radius` is close to 50%) precisely match the visual
contour of the curved edge.

This produces a more consistent rendering of complex rounded shapes, eliminating
visual discrepancies for high radius values. The border-radius adjustment
factor, which ensures corners appear sharp for small radii, is now progressively
dampened as the radius value approaches 50%.

This also applies to non-round contours (using `corner-shape`), which now use
the same radius adjustment mechanism.

### Column wrapping for CSS multi-column layout

From Chrome 145 the `column-wrap` and `column-height` properties are supported
in multi-column layout. These properties let you wrap columns onto a new row
in the block direction.

Prior to Chrome 145, if the height of the multicol container was restricted,
content that didn't fit into the available space would appear as overflow
columns in the inline direction. This would create a horizontal scrollbar on the
web. With the `column-height` and `column-wrap` properties you can set a height
for the row of columns and set the overflow columns to appear as a new row.

Find out more in [Support for wrapped columns in multi-column layout](https://developer.chrome.com/blog/multicol-wrapping.md.txt).

### Expose `onanimationcancel` event to `GlobalEventHandlers`

CSS Animations Level 1 extends the `GlobalEventsHandler` Interface defined in
the HTML specification, declaring four new event handlers: `onanimationstart`,
`onanimationiteration`, `onanimationend` and `onanimationcancel`.

The `onanimationcancel` event handler was missing from the GlobalEventsHandler
IDL, and is now exposed.

### CSS `letter-spacing` and `word-spacing`: percentage values

Enables percentage values for the `letter-spacing` and `word-spacing` CSS
property, as defined in the CSS Text Module Level 4 specification. Percentage
values are calculated relative to the advance measure of the space character
(U+0020). This gives developers more robust and flexible control over
typography, particularly in responsive designs where text spacing needs to adapt
to different viewports and font sizes.

### Customizable select listbox

This feature extends customizable select support to the listbox rendering mode,
including single-select and multi-select in listbox mode.

The listbox rendering mode means that the `<select>` element is rendered in-flow
or in the page rather than with a separate button and popup. Listbox rendering
mode is opted into across platforms through the multiple or size attributes,
like `<select multiple>` or `<select size=4>`. When the `appearance:base-select`
CSS property is applied to the `<select>` element with these attributes, it will
now have improved rendering and input behavior.

This feature does not support customizable select for the multi-select popup,
which will come later. The following attributes must be set to get a
multi-select popup: `<select multiple size=1>`.

### Enable monochrome emoji rendering in forced colors mode.

This change updates the emoji rendering behavior in Forced Colors Mode in
Chrome. During computed-value resolution, emoji whose `font-variant-emoji` value
computes to normal or unicode are rendered using their monochrome glyphs when
available.

Chrome will therefore suppress color emoji rendering, which ensures emoji fully
participate in the Forced Colors Mode pipeline and respect system high-contrast
colors. Behavior outside forced colors mode is unchanged.

### The `focusVisible` option on the `focus()` method

When calling the `focus()` method, developers can now supply a `focusVisible`
boolean in the `FocusOptions` dictionary. When true, a focus ring will always be
painted around the newly-focused element and it will match the `:focus-visible`
pseudo-class. When false, the focus ring won't be painted and `:focus-visible`
won't match. When missing, the user agent makes its own determination as to
whether the focus ring should be painted, and the `:focus-visible` pseudo-class
matches accordingly.

### Overscroll effect on non-root scrollers

Shows elastic overscroll effects on non-root scroll containers. When a nested
scrollable element reaches its scroll boundary, the overscroll affordance
applies to that element instead of only the root scroller. This reduces the need
for custom JavaScript workarounds and can be controlled per element with
`overscroll-behavior`.

### Show true window position on Android

Chrome on Android now accurately reports the browser window's position and size
using `window.screenX`, `window.screenY`, `window.outerWidth`, and
`window.outerHeight`.

Previously, Chrome incorrectly assumed all browser windows on Android start at
coordinates (0, 0). This is inaccurate for Android tablets using freeform
windowing mode, causing websites to always receive 0 when querying the window's
on-screen position using `window.screenX` and `window.screenY` (these fields
store the coordinates of window's top-left corner in global work area coordinate
space).

Moreover, Chrome on Android incorrectly assumed that outer dimensions of the
browser window are equal to the inner dimensions of the website viewport.

> [!NOTE]
> **Note:** `window.screenX` and `window.screenY` have aliases, `window.screenLeft` and `window.screenTop`.

## Web APIs

### Navigation API: expose destination in `navigation.transition`

Prior to Chrome 145, `NavigationTransition` has a `from` property, exposing the
old URL of the navigation. Exposing `to` (a `NavigationDestination`) completes
this. It is especially useful when using `precommit` handlers, as during
`precommit` the current URL has not yet switched to the destination.

> [!NOTE]
> **Note:** `navigation.transition` is only exposed for intercepted navigations. There are same-origin document-initiated navigations.

### WebGPU: `subgroup_uniformity` feature

Adds a new scope to the uniformity analysis and changes which parts of the
language are checked in each to allow subgroup functionality to be considered
uniform in more cases.

### Upsert

Implements the ECMAScript proposal for `Map.prototype.getOrInsert`,
`Map.prototype.getOrInsertComputed`, `WeakMap.prototype.getOrInsert`, and
`WeakMap.prototype.getOrInsertComputed`.

### InputEvent types for deletion commands on non-collapsed selections

Reports accurate `inputType` values for deletion keyboard shortcuts on selected
text. When deletion commands like <kbd>Control+Backspace</kbd> or <kbd>Control+Delete</kbd>
are used with selected text in contenteditable elements, the `beforeinput` and
`input` events now report `deleteContentBackward` or `deleteContentForward`
instead of `deleteWordBackward` or `deleteWordForward`. This lets web developers
correctly understand what editing operation occurred and implement reliable undo
and redo or custom editing behaviors.

### Cookie Store API `maxAge` attribute

Lets callers specify a `maxAge` when setting a cookie with the Cookie Store API.

Cookie expiry time is already configurable using the `expires` attribute, but
`maxAge` provides a more idiomatic option and aligns the Cookie Store API with
the options provided by `document.cookie` and the `Set-Cookie` HTTP Header.

### Secure Payment Confirmation: Browser Bound Keys

Adds an additional cryptographic signature over Secure Payment Confirmation
assertions and credential creation. The corresponding private key is not synced
across devices. This helps web developers meet requirements for device binding
for payment transactions.

### Sticky activation for the `clipboardchange` event

Chrome now requires sticky user activation or `clipboard-read` permission to
fire `clipboardchange` events, preventing unauthorized clipboard monitoring.
This change is as defined in the [Clipboard API
specification](https://www.w3.org/TR/clipboard-apis/#clipboard-event-clipboardchange).

### Expose `rtpTimestamp` from WebRTC video frames using `VideoFrame.metadata()`

Adds a `VideoFrame.metadata()` method that returns a dictionary containing the
`rtpTimestamp` field, if the underlying `VideoFrame` has this field in its
metadata. An empty dictionary is returned otherwise. Only video frames
originating from WebRTC sources will have the `rtpTimestamp` metadata attached.

### Let web applications understand bimodal performance timings

Web applications might suffer from bimodal distribution in page load performance
due to factors outside of the application's control. For example, when a user
agent first launches in a "cold start" scenario, it must perform many expensive
initialization tasks that compete for system resources. Browser extensions can
also affect performance, since some extensions run additional code on every page
you visit, increasing CPU usage and slowing response times. Likewise, when a
machine is already busy with intensive tasks, web pages might load more slowly
as a result.

In these scenarios, content the web app attempts to load will be in competition
with other work happening on the system. This makes it difficult to detect if
performance issues exist within web applications themselves, or because of
external factors.

A new `confidence` field on the `PerformanceNavigationTiming` object lets
developers discern if the navigation timings are representative for their web
application.

### Add `presentationTime` and `paintTime` to performance entries

Expose `paintTime` and `presentationTime` in element timing, LCP, long animation
frames, and paint timing.

`paintTime` means the time when the rendering phase ended and the browser
started the paint phase. `presentationTime` means the time when the "pixels
reached the screen", which is somewhat implementation-defined. See [LCP and INP are now Baseline Newly available](https://web.dev/blog/lcp-and-inp-are-now-baseline-newly-available#are_there_any_differences_in_the_implementations).

### Use of CSS pixels in the LayoutShift API

This feature changes the attribution data (`prevRect` and `currentRect`) in the
[LayoutShift API](https://wicg.github.io/layout-instability/) to be reported in
CSS pixels instead of physical pixels. The current behavior is inconsistent with
other layout-related APIs, which all use CSS pixels. This change improves
consistency, simplifies usage for developers, and aligns with expected units in
debugging and tooling.

Note that this does not impact the CLS metric value, but does affect debugging tools
showing screenshots and images of those shifts.

### Device Bound Session Credentials (DBSC)

A way for websites to securely bind a session to a single device.

It lets servers have a session that is securely bound to a device. The browser
renews the session periodically as requested by the server, with proof of
possession of a private key.

### Local Network Access split permissions

This is an enhancement to the Local Network Access (LNA) restrictions, where we
split the permission required from one Local Network Access permission, into two
separate permissions.

Old permission: `local-network-access`

New Permissions:

- `local-network`: for LNA requests to IPs in the local address space.
- `loopback-network`: for LNA requests to IPs in the loopback address space.

The old permission is kept as an alias and should continue to work for
`permissions.query` and Permissions Policy. Current enterprise policies will
continue to work the same; newer more granular enterprise policies will be added
at a later point in time.

### The Origin API

The [origin](https://datatracker.ietf.org/doc/rfc6454/) is a fundamental
component of the web's implementation, essential to both the security and
privacy boundaries which user agents maintain. The concept is well-defined
between HTML and URL, along with widely-used adjacent concepts like *site*.

Origins, however, are not directly exposed to web developers. Though there are
various origin getters on various objects, each of those returns the ASCII
serialization of an origin, not the origin itself. This has a few negative
implications. Practically, developers attempting to do same-origin or same-site
comparisons when handling serialized origins often get things wrong in ways that
lead to vulnerabilities. Philosophically, it seems like a missing security
primitive that developers struggle to polyfill accurately.

The Origin API addresses this gap in the platform by introducing an `origin`
object that encapsulates the origin concept, and provides helpful methods for
comparison, serialization, and parsing.

### Sanitizer API

The [Sanitizer
API](https://developer.mozilla.org/docs/Web/API/HTML_Sanitizer_API/Using_the_HTML_Sanitizer_API)
provides a way for developers to remove content that may execute script from
arbitrary, user-supplied HTML content. The goal is to make it easier to build
XSS-free web applications.

> [!NOTE]
> **Note:** A previous version of this API shipped in Chrome 105, and was [removed in
> Chrome 119](https://developer.chrome.com/blog/sanitizer-api-deprecation).

### Trusted Types specification alignment

[Trusted Types](https://developer.mozilla.org/docs/Web/API/Trusted_Types_API)
was originally implemented and launched in Chrome in 2019.

The Trusted Type specification is now being implemented in other browsers. As
part of that process, various inconsistencies are being identified and fixed in
the specification. This release fixes these issues in Chrome to align with the
new specification.

## New origin trials

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

### WebAudio: Configurable render quantum

`AudioContext` and `OfflineAudioContext` now take an optional `renderSizeHint`,
which lets users ask for a particular render quantum size when an integer is
passed, to use the default of 128 frames if nothing or `default` is passed, or
to ask the User-Agent to pick a good render quantum size if `hardware` is
specified.

## Deprecations and removals

This version of Chrome introduces the following deprecations and removals. Visit
ChromeStatus.com for lists of planned deprecations, current deprecations and
previous removals.

### Chrome removes support for obsolete virtual cameras on macOS

From Chrome 145, support is removed for obsolete virtual cameras for all macOS
releases that it supports.

On macOS, modern virtual cameras are built using the [Core Media
IO](https://developer.apple.com/documentation/coremediaio) framework, which has
been available since macOS 12.3. Apple has performed outreach, and all modern
virtual camera software has been migrated to use this [Core Media IO
framework](https://developer.apple.com/videos/play/wwdc2022/10022/).

Obsolete virtual cameras, built as DAL plugins, have been blocked by macOS
itself starting with macOS 14.1 (2023), and have been unsupported in Safari
since 2018, if not earlier.

### Remove BMP Extension for Embedding JPEG-or-PNG-in-BMP

Chrome is removing the BMP extension for embedding JPEG-or-PNG-in-BMP as no
other browsers support this extension, and it has no use (as registered using
UMA data).

### Reduced User-Agent strings by default

Starting in Chrome 145, the `UserAgentReduction` policy will be completely
removed. This policy was previously available to control whether Chrome sent a
reduced or full User-Agent string.

To enhance user privacy and reduce passive tracking capabilities, Chrome began
reducing the information contained in the User-Agent header by default in Chrome
version 110. The `UserAgentReduction` policy was provided as a temporary measure
for enterprises to manage this transition.

The recommended mechanism for websites to access browser and device information
is now User-Agent Client Hints (UA-CH). UA-CH requires websites to actively
request specific information, which is a more privacy-preserving approach than
the legacy User-Agent string.

From Chrome 145 onwards, the `UserAgentReduction` policy will have no effect.
Chrome will send a reduced User-Agent string by default. Systems or applications
that relied on this policy to receive the full (legacy) User-Agent string may no
longer receive the detailed information they expect.