**Stable release date:** June 2nd, 2026


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

<br />

## CSS and UI

### CSS gap decorations

CSS gap decorations let you style gaps in container layouts like grid and
flexbox, similar to `column-rule` in multiple-column layout. This feature is
highly requested by web developers who must use hacks to style the gaps in grid
and flexbox layouts today.

It brings new CSS properties like `column-rule-inset`, `row-rule-inset`,
`column-rule-visibility-items`, and `row-rule-visibility-items`, and supports
animation of rule width, color, and insets.


[CSS gap decorations blog post](https://developer.chrome.com/blog/gap-decorations-stable) \| [Tracking bug #357648037](https://issues.chromium.org/issues/357648037) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5157805733183488) \| [Spec](https://drafts.csswg.org/css-gaps-1)

<br />

### Clip text overflow on user interaction

When a user interacts (for example, by editing or using caret navigation) with
text that has `text-overflow: ellipsis` set, the text temporarily switches from
ellipsis to clip. This lets the user see and interact with the hidden overflow
content. This feature applies to all editable and non-editable elements. For
form controls, such as `<textarea>` and `<input>`, this behavior is already
supported.


[Tracking bug #40731275](https://issues.chromium.org/issues/40731275) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5146265241387008) \| [Spec](https://www.w3.org/TR/css-overflow-3/#ellipsis-interaction)

<br />

### Remove explicit border color UA stylesheet rule for tables

This change removes the erroneous `border-color: gray` CSS rule from the UA
stylesheet for the `<table>` element. The HTML specification does not contain
this rule, and it prevented borders from defaulting to `currentColor`. Neither
Firefox nor WebKit have this `gray` border color rule in their UA stylesheet,
leading to interoperability issues.


[Tracking bug #494554835](https://issues.chromium.org/issues/494554835) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5077341928816640) \| [Spec](https://html.spec.whatwg.org/multipage/rendering.html#tables-2)

<br />

### Support `path()` and `shape()` in `shape-outside`

Adds support for the `path()` and `shape()` shape functions in the CSS
`shape-outside` property. These functions let developers define float exclusion
shapes more flexibly and support animation.


[Tracking bug #502328208](https://issues.chromium.org/issues/502328208) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5080980370096128) \| [Spec](https://drafts.csswg.org/css-shapes/#shape-outside-property)

<br />

### Support `rect()` and `xywh()` in `shape-outside`

Adds support for the `rect()` and `xywh()` basic shape functions in the CSS
`shape-outside` property. These functions let developers define float exclusion
shapes using rectangle coordinates, aligning Chrome with Firefox and Safari
which already support this feature.


[Tracking bug #490343453](https://issues.chromium.org/issues/490343453) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6323071520735232) \| [Spec](https://drafts.csswg.org/css-shapes/#shape-outside-property)

<br />

### User action pseudo-class top layer boundary

Changes `:hover`, `:active`, and `:focus-within` matching on parents of elements
to match only up to the first top layer element in the parent chain. Since top
layer elements are typically rendered disconnected from their parent chain
visually, it does not make sense to change parent styles when a top layer
element is hovered or activated.


[Tracking bug #407769114](https://issues.chromium.org/issues/407769114) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6296574159355904) \| [Spec](https://www.w3.org/TR/selectors-4/#useraction-pseudos)

<br />

### Web app scope system accent color

Restricts access to the system accent color for CSS keywords (`AccentColor` and
`AccentColorText`) and `accent-color: auto` to be only within a web app and
initial profile context. This limits a significant fingerprinting vector when
exposing the user's system colors widely on the web.


[Tracking bug #481353056](https://issues.chromium.org/issues/481353056) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5106043975761920) \| [Spec](https://drafts.csswg.org/css-ui-4/#widget-accent)

<br />

### `image-rendering: crisp-edges`

`image-rendering: crisp-edges` indicates that image should be scaled in a way
that preserves contrast and edges, and which avoids smoothing colors or
introducing blur to the image in the process.

Chrome, Firefox, and Safari treat `crisp-edges` and `pixelated` as synonyms and
implement both using nearest-neighbor scaling.


[Tracking bug #41073066](https://issues.chromium.org/issues/41073066) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5172217778405376) \| [Spec](https://www.w3.org/TR/css-images/#ref-for-valdef-image-rendering-crisp-edges)

<br />

### Support 'path-length' as a CSS property

Introduces a new CSS property, `path-length`, which maps to the SVG `pathLength`
presentation attribute. This applies to SVG geometry elements that support
`pathLength` (including `<path>`, `<circle>`, `<rect>`, `<line>`, `<polyline>`,
`<polygon>`, and `<ellipse>`), allowing authors to specify it in stylesheets,
inline styles, and animations.


[Tracking bug #40670251](https://issues.chromium.org/issues/40670251) \| [ChromeStatus.com entry](https://chromestatus.com/feature/4861677550043136) \| [Spec](https://github.com/w3c/svgwg/pull/1073)

<br />

## Web APIs

### `Intl.Locale.prototype.variants`

Adds `Intl.Locale.prototype.variants` as stated in the ECMA-402 specification,
and accepts `variants` in the options bag in the `Intl.Locale` constructor.


[ChromeStatus.com entry](https://chromestatus.com/feature/4709921706868736) \| [Spec](https://tc39.es/ecma402/#sec-Intl.Locale.prototype.variants)

<br />

### Payment Request: Allow payment handlers to report back internal errors

Lets payment handlers accessed using the Payment Request API return distinct
errors for "user cancelled" (`AbortError`) versus "internal payment app error"
(`OperationError`). This lets developers retry or fall back to a different flow
when an internal app error occurs, while properly stopping if the user cancels.


[Tracking bug #473478138](https://issues.chromium.org/issues/473478138) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5942637229113344) \| [Spec](https://w3c.github.io/payment-request/#payment-handler-indicates-an-internal-error-algorithm)

<br />

### Respect `autocorrect="off"` for Windows touch keyboard in TSF

Makes Chrome's TSF integration detect and revert touch keyboard autocorrections
on Windows when the focused editable element has `autocorrect="off"` set.


[Tracking bug #487613498](https://issues.chromium.org/issues/487613498) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5196629995028480) \| [Spec](https://html.spec.whatwg.org/multipage/interaction.html#autocorrection)

<br />

### Selective Clipboard Format Read

Enhances the Asynchronous Clipboard API by deferring actual clipboard data
retrieval from the OS until the web application calls `getType()`. Instead of
eagerly fetching all available formats at `read()` time, the browser now returns
`ClipboardItem` objects with available MIME types but without the underlying
data, which reduces CPU usage and improves responsiveness.


[Tracking bug #435051711](https://issues.chromium.org/issues/435051711) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5203433409871872) \| [Spec](https://github.com/w3c/clipboard-apis/pull/248)

<br />

## Network and connectivity

### Disconnect WebSockets on bfcache entry

Active WebSocket connections no longer prevent a page from entering the
Back/Forward Cache (bfcache). By closing connections on bfcache entry instead of
marking the document as ineligible, the browser allows pages with active
WebSockets to be stored and restored.


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

<br />

## New origin trials

### Gamepad event-driven input API

Extends the Gamepad API with a new event-driven model that lets applications
receive gamepad input with lower latency. Instead of relying on frequent polling
using `navigator.getGamepads()`, developers can now listen for a
`rawgamepadinputchange` event, which fires whenever new input data is available
from the device.


[Origin Trial](https://developer.chrome.com/origintrials#/view_trial/3118179792000647169) \| [Tracking bug #40582297](https://issues.chromium.org/issues/40582297) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5989275208253440) \| [Spec](https://w3c.github.io/gamepad)

<br />

### Permissions Policy: `focus-without-user-activation`

Lets embedders control programmatic focus from embedded content with the
`focus-without-user-activation` permissions policy. When the policy is denied
for a frame, programmatic focus calls (`element.focus()`, `autofocus`,
`window.focus()`, `dialog.showModal()`, and popover focusing) are blocked unless
triggered by user activation.


[Origin Trial](https://developer.chrome.com/origintrials#/view_trial/1028509564900737025) \| [Tracking bug #40095111](https://issues.chromium.org/issues/40095111) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5179186249465856) \| [Spec](https://html.spec.whatwg.org/#focus-without-user-activation-feature)

<br />

### WebAssembly custom descriptors

Lets WebAssembly store data associated with source-level types more efficiently
in new "custom descriptor" objects. These custom descriptors can be configured
with prototypes for the WebAssembly objects of that source-level type, which
lets methods be installed on a WebAssembly object's prototype chain and called
directly from JavaScript using normal method call syntax.


[Origin Trial](https://developer.chrome.com/origintrials#/view_trial/619807898716864513) \| [Tracking bug #403372470](https://issues.chromium.org/issues/403372470) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6024844719947776) \| [Spec](https://github.com/WebAssembly/custom-descriptors/blob/main/proposals/custom-descriptors/Overview.md)

<br />