**Stable release date:** April 7th, 2026


Unless otherwise noted, the following changes apply to Chrome 147 stable
channel release for Android, ChromeOS, Linux, macOS, and Windows.
Want just the highlights? Check out [New in Chrome 147](https://developer.chrome.com/blog/new-in-chrome-147).

<br />

## CSS and UI

### Element-scoped view transitions

Exposes `element.startViewTransition()` on arbitrary HTML elements.
The element establishes a scope for the transition,
which means that the transition pseudo-elements are affected by ancestor clips
and transforms,
and multiple transitions on separate elements can run concurrently.


[Tracking bug #394052227](https://issues.chromium.org/issues/394052227) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5109852273377280) \| [Spec](https://drafts.csswg.org/css-view-transitions-2)

<br />

### CSS `contrast-color()`

This function helps you meet contrast requirements for accessibility.

You can use the `contrast-color()` function anywhere in CSS where a color value
is expected. It takes a color value argument and returns either 'black' or
'white', depending on which provides the highest contrast against the color
argument.


[Tracking bug #40142548](https://issues.chromium.org/issues/40142548) \| [ChromeStatus.com entry](https://chromestatus.com/feature/4841046007742464) \| [Spec](https://drafts.csswg.org/css-color-5/#contrast-color)

<br />

### Timeline named range `scroll`

This feature expands the set of named ranges for view timelines by adding a
`scroll` range to the existing set of `entry`, `exit`, `cover`, and `contain`.


[Tracking bug #41483848](https://issues.chromium.org/issues/41483848) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6522328437620736) \| [Spec](https://drafts.csswg.org/scroll-animations-1/#valdef-animation-timeline-range-scroll)

<br />

### CSS `border-shape` property

The CSS `border-shape` property lets you create non-rectangular borders with any
arbitrary shape, for example, a polygon, circle, or `shape()`.

Although `border-shape` accepts the same shapes as `clip-path`, it is
fundamentally different. `border-shape` defines the shape of the border,
decorates it, and clips only the inside.

`border-shape` has two variants: one that strokes a shape and another that fills
between two shapes.


[Tracking bug #370041145](https://issues.chromium.org/issues/370041145) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5459864205393920) \| [Spec](https://drafts.csswg.org/css-borders-4/#border-shape)

<br />

### `CSSPseudoElement` interface

The `CSSPseudoElement` interface represents a pseudo-element in JavaScript.

`CSSPseudoElement` is returned from `Element.pseudo(type)`, where `type` is
currently `::after`, `::before`, or `::marker`. `CSSPseudoElement` is a proxy
object that represents a pseudo-element. Unlike a pseudo-element, a
`CSSPseudoElement` always exists.

The `CSSPseudoElement` has the following attributes and methods:

- The `type` attribute is a string that represents the pseudo-element's type.
- The `element` attribute is the pseudo-element's ultimate originating element.
- The `parent` attribute is the pseudo-element's originating element (either `Element` or `CSSPseudoElement` for nested pseudo-elements).
- The `pseudo(type)` method retrieves nested pseudo-elements.


[Tracking bug #40639103](https://issues.chromium.org/issues/40639103) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5194399398756352) \| [Spec](https://www.w3.org/TR/css-pseudo-4/#CSSPseudoElement-interface)

<br />

### Pseudo target on events

Specific events now include a `.pseudoTarget`, which is either
`CSSPseudoElement` (if the interaction was with a pseudo-element) or `null`.

This provides more specific information about the event origin. For example, it
indicates that a `::after` pseudo-element was clicked, not just the ultimate
originating element (`Event.target`). Note that `Event.target` remains
unchanged, so the event only has extra information about pseudo-element
interaction.

The events are `UIEvent`, `AnimationEvent`, and `TransitionEvent`.

`mouseover`, `mouseout`, `mouseenter`, `mouseleave`, and their `pointer*`
counterparts are not yet supported.


[Tracking bug #40639103](https://issues.chromium.org/issues/40639103) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5179328935624704) \| [Spec](https://github.com/w3c/uievents/pull/413/changes)

<br />

### Decouple `*-width` and `*-style` properties

Chrome 147 aligns with updated [CSS
specifications](https://www.w3.org/TR/css-2025/) for the behavior of the
`border-width`, `outline-width`, and `column-rule-width` properties. Previously,
if the corresponding `border-style`, `outline-style`, or `column-rule-style` was
set to `none` or `hidden`, the computed width of these properties was forced to
`0px`, regardless of the specified value.

With this change, the computed values of `border-width`, `outline-width`, and
`column-rule-width` always reflect the author-specified values, independent of
the `*-style` property. Additionally, the resolved values (as returned by
`getComputedStyle()`) for `outline-width` and `column-rule-width` also reflect
the specified values.

This change aligns Chrome with Firefox and WebKit, which have already
implemented this behavior.


[Tracking bug #393631108](https://issues.chromium.org/issues/393631108) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5133099851317248) \| [Spec](https://github.com/w3c/csswg-drafts/pull/11913/files)

<br />

### Support `path` attribute on SVG `<textPath>` element

This change adds support for the `path` attribute on the SVG `<textPath>`
element. This lets developers define text path geometry inline using SVG path
data and reduces the need for separately defined `<path>` elements.

The `<textPath>` element resolves its text path geometry using the following
rules:

1. If both `path` and `href` are present, geometry is resolved from the `path` attribute.
2. If only the `path` attribute is present and parses successfully, the inline path definition is used.
3. If the `path` attribute is absent or fails to parse, and an `href` attribute is provided, the referenced `<path>` element is used as a fallback.
4. Existing `href`-only behavior is preserved without change.

This implementation follows the SVG 2 specification's definition of the `path`
attribute on `<textPath>`. The resolution behavior is consistent with other
browser engines, which improves interoperability and standards compliance. Note:
When both `path` and `href` are specified on `<textPath>`, `path` now takes
precedence, according to the SVG 2 specification.


[Tracking bug #374010056](https://issues.chromium.org/issues/374010056) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5157546589552640) \| [Spec](https://svgwg.org/svg2-draft/text.html#TextPathElement)

<br />

## Device

### WebXR Plane Detection

The WebXR Plane Detection API lets sites retrieve the set of planes detected in
the user's environment. This is less work for developers and more powerful than
using the depth-sensing WebXR feature. For example, planes such as walls that
are occluded by objects can still be fully represented if the system is aware of
the wall's boundaries. A depth map would show the wall, but objects in front of
it would break it up, potentially obscuring the wall's full scope. Furthermore,
semantic labeling information is exposed when the device is aware of such labels
and they fit into predefined categories, which provides better knowledge about
the world.


[Tracking bug #394636076](https://issues.chromium.org/issues/394636076) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5177993049800704) \| [Spec](https://immersive-web.github.io/plane-detection)

<br />

## DOM

### JSON and style support for `link rel=modulepreload`

Adds support for JSON and style module types as `<link rel="modulepreload">`
destinations. `<link rel="modulepreload">` is already supported in Chromium (see
[Chromestatus feature](https://chromestatus.com/feature/5762805915451392)), but
it currently only supports preloading script-like module scripts. This feature
addresses a functionality gap because JSON and CSS module scripts are supported
in Chromium elsewhere but not as `<link rel="modulepreload">` destinations. You
can preload style modules with
`<link rel="modulepreload" as="style" href="...">` and JSON modules with
`<link rel="modulepreload" as="json" href="...">`.


[Tracking bug #466888680](https://issues.chromium.org/issues/466888680) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5202661416763392) \| [Spec](https://github.com/whatwg/html/pull/11981)

<br />

### XML Parsing in Rust for non XSLT scenarios

Implements the Rust XML parser for scenarios where no XSLT processing is required.

The Rust XML parser improves security by eliminating memory corruption bugs in
XML parsing. It replaces the use of `libxml2` (written in C) with a safe
alternative.

We are deprecating XSLT. While this process
continues, you can already use safe Rust XML parsing in scenarios where XSLT is
not required.


[Tracking bug #466303347](https://issues.chromium.org/issues/466303347) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5309598397497344)

<br />

## Graphics

### WebXR Layers

WebXR Layers offers a more efficient way to draw immersive content.

In addition to supporting native color and depth textures and texture arrays, it
also provides support for different layer types that the system compositor
manages (as opposed to JavaScript).


[Tracking bug #409255534](https://issues.chromium.org/issues/409255534) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6634466544058368) \| [Spec](https://www.w3.org/TR/webxrlayers-1)

<br />

## JavaScript

### `Math.sumPrecise`

Implements a TC39 proposal to add a method to sum multiple values in JavaScript.

Add an iterable-taking `Math.sumPrecise` method that returns the sum of the
values in the iterable using a more precise algorithm than naive summation.


[Tracking bug #374310075](https://issues.chromium.org/issues/374310075) \| [ChromeStatus.com entry](https://chromestatus.com/feature/4790090146643968) \| [Spec](https://github.com/tc39/proposal-math-sum)

<br />

## Network / Connectivity

### `Request.isReloadNavigation` attribute

Adds the read-only boolean attribute `isReloadNavigation` to the Fetch API's
`Request` interface. This attribute indicates whether the current navigation
request was initiated as a user-triggered reload (for example, using the
**Refresh** button, `location.reload()`, or `history.go(0)`). This signal is
primarily exposed on the `Request` object within a Service Worker's
`FetchEvent`.


[Tracking bug #40487194](https://issues.chromium.org/issues/40487194) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5154214529597440) \| [Spec](https://fetch.spec.whatwg.org/#dom-request-isreloadnavigation)

<br />

## Performance

### Update Device Memory API limits

Updates to a new set of possible values for the Device Memory API:

- Android: 1, 2, 4, 8
- Others: 2, 4, 8, 16, 32 These values replace the old values of 0.25, 0.5, 1, 2, 4, and 8, which have grown outdated.

This reduces fingerprinting risks at the lower end because device capabilities
have improved since these were set. It also allows better usage and segmenting
of high-end devices, as developers requested. For more information, see [Device
Memory issue](https://github.com/w3c/device-memory/issues/50).


[Tracking bug #454354290](https://issues.chromium.org/issues/454354290) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6330376953921536) \| [Spec](https://github.com/w3c/device-memory/pull/53)

<br />

## Local Network Access (LNA)

For more information about LNA, see
[Local Network Access](https://developer.chrome.com/blog/local-network-access).

### Local Network Access restrictions on service worker `WindowClient.navigate()`

Local Network Access (LNA) restrictions were recently added to prevent websites
from unilaterally making requests to local networks and local devices. These restrictions
were added for service worker-initiated fetch requests but not for navigations
that service workers perform through `WindowClient.navigate()`.

This launch closes this gap by adding LNA restrictions to
`WindowClient.navigate()` calls. It uses the `WindowClient` as the initiator of
the navigation to determine if the navigation is an LNA request.

This only applies if the `WindowClient` being navigated is a subframe. Chrome
does not currently enforce any LNA restrictions on main frame navigations.


[ChromeStatus.com entry](https://chromestatus.com/feature/5172375182245888)

<br />

### Local network access restrictions for WebTransport

Restricts the ability to make requests to the user's local network using
WebTransport, which is gated behind a permission prompt.

A local network request is any request from a public website to a local IP
address or loopback, or from a local website (for example, an intranet) to
loopback. Gating websites' ability to perform these requests behind a permission
reduces sites' ability to use these requests to fingerprint the user's local
network.

This permission is restricted to secure contexts.


[Tracking bug #421216834](https://issues.chromium.org/issues/421216834) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5126430912544768) \| [Spec](https://wicg.github.io/local-network-access/#integration-with-webtransport)

<br />

### Local network access restrictions for WebSockets

Local Network Access (LNA) restrictions are expanding to include WebSockets.
WebSockets connections to local addresses now trigger permission prompts.

All current LNA enterprise policies still apply to the LNA WebSockets
restrictions (`LocalNetworkAccessAllowedForUrls`,
`LocalNetworkAccessBlockedForUrls`, and
`LocalNetworkAccessRestrictionsTemporaryOptOut`).


[Tracking bug #421156866](https://issues.chromium.org/issues/421156866) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5197681148428288) \| [Spec](https://wicg.github.io/local-network-access/#integration-with-websockets)

<br />

## Isolated Web Apps (IWA)

### Web Printing API

This API enables deeper integration with printer-related functionality in
Isolated Web Apps.

This API targets Isolated Web Apps only and follows the [Isolated Web Apps
process](https://www.chromium.org/blink/launching-features/isolated-web-apps/).

This API provides a set of JavaScript methods that let developers query local
printers, submit print jobs to the most appropriate printers, and manage print
job options and status. To represent these concepts, it relies on attribute
names and semantics from the Internet Printing Protocol (IPP) specifications.


[Tracking bug #302505962](https://issues.chromium.org/issues/302505962) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5100352332627968) \| [Spec](https://wicg.github.io/web-printing)

<br />

## Origin trials

### Prerender cross-origin iframes

Prerenders cross-origin iframes using an opt-in response header.

Browsers now prerender all cross-origin frames if the top-level frame's HTTP
response includes `Supports-Loading-Mode: prerender-cross-origin-frames`.


[Origin Trial](https://developer.chrome.com/origintrials#/register_trial/790944684556943361) \| [Tracking bug #440387014](https://issues.chromium.org/issues/440387014) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5112398709129216) \| [Spec](https://wicg.github.io/nav-speculation/prerendering.html)

<br />

### Autofill event

Autofill is a key web feature that reduces friction for millions of users every
day. However, getting autofill to work reliably with dynamic forms across
multiple implementations requires significant effort.

This feature adds an `autofill` event that lets developers modify their forms to
fit the autofilled data and notify the browser when they have done so.


[Origin Trial](https://developer.chrome.com/origintrials#/register_trial/268527127781965825) \| [Tracking bug #466333215](https://issues.chromium.org/issues/466333215) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5137581018841088) \| [Spec](https://wicg.github.io/autofill-event)

<br />

### WebNN

WebNN enables web applications and frameworks to take advantage of native
operating system services for machine learning and the underlying hardware
capabilities available on a user's computer. This helps implement consistent,
efficient, and reliable ML experiences on the web.


[Origin Trial](https://developer.chrome.com/origintrials#/register_trial/2250110963824984065) \| [Tracking bug #40206287](https://issues.chromium.org/issues/40206287) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5176273954144256) \| [Spec](https://webmachinelearning.github.io/webnn)

<br />

## Deprecations and removals

### Remove Inline XSLT for production of SVG

A specially crafted XML file might contain an XSL stylesheet that transforms
generic XML data into an SVG file.

For example, see
[gist.github.com](https://gist.github.com/drott/1fc70b3c7f0ac314d1fe2e5beecc5490?short_path=1c60adf).

This is a special case of XSLT processing that, according to recently introduced
use counters `XSLPIInSVGImage` (UseCounter ID 5777) and
`XSLPIInSVGStandaloneDoc` (UseCounter ID 5778), we consider virtually
non-existent on the web. We want to deprecate and remove it before fully phasing
out XSLT.

This rolls out in sync with experimental testing of the Rust-based XML parser.
This won't immediately deploy to 100% in Chrome 147.


[Tracking bug #482223009](https://issues.chromium.org/issues/482223009) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5143784390262784)

<br />