# Chrome 136

**Stable release date:** April 29th, 2025


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

<br />

## HTML and DOM

### Language support for `CanvasTextDrawingStyles`

The `<canvas>` DOM element, like all DOM elements, accepts a `lang` attribute
that is used to define language specific treatment for font selection (when
fonts have locale specific glyphs). Browsers respect this attribute. However,
when an `OffscreenCanvas` is created there is no way to set locale information,
possibly resulting in a state where an offscreen canvas produces rendered
results that differ from the canvas in which its output is used. This feature
adds a `lang` IDL attribute to `CanvasTextDrawingStyles` to give developers direct
control over the language for the text drawing and metrics.


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

<br />

## CSS and UI

### The `dynamic-range-limit` property

Enables a page to limit the maximum brightness of HDR content.


[Tracking bug #1470298](https://issues.chromium.org/issues/1470298) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5146250411769856) \| [Spec](https://drafts.csswg.org/css-color-hdr/#controlling-dynamic-range)

<br />

### Partition `:visited` links history

To eliminate user browsing history leaks, anchor elements are styled as
`:visited` only if they have been clicked from this top-level site and frame
origin before.

There is an exception for "self-links", where links to a site's own pages can be
styled as `:visited` even if they have not been clicked on in this exact
top-level site and frame origin before. This exemption is only enabled in
top-level frames or subframes which are same-origin with the top-level frame.
The privacy benefits are still achieved because sites already know which
of its subpages a user has visited, so no new information is exposed. This was a
community-requested exception which improves user experience.


[Tracking bug #1448609](https://issues.chromium.org/issues/1448609) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5101991698628608) \| [Spec](https://drafts.csswg.org/selectors-4/#visited-privacy)

<br />

### Unprefixed `print-color-adjust`

The `print-color-adjust` property lets you adjust colors in printed web pages.
This is the same as Chrome's already-supported `-webkit-print-color-adjust`, but
with a standardized name.

The `-webkit-` prefixed version is not removed.


[MDN Docs](https://developer.mozilla.org/docs/Web/CSS/print-color-adjust) \| [Tracking bug #376381169](https://issues.chromium.org/issues/376381169) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5159639697850368) \| [Spec](https://drafts.csswg.org/css-color-adjust/#propdef-print-color-adjust)

<br />

### Rename `string` `attr()` type to `raw-string`

The CSS Working Group has resolved to replace `string` `attr()` type with
`raw-string`.

Therefore from Chrome 136 `attr(data-foo string)` becomes
`attr(data-foo raw-string)`.


[Tracking bug #400981738](https://issues.chromium.org/issues/400981738) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5191129693421568) \| [Spec](https://drafts.csswg.org/css-values-5/#attr-notation)

<br />

### Type-agnostic `var()` fallback

The fallback part of a `var()` function does not validate against the type of the
custom property being referenced.


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

<br />

## Web APIs

### Dispatch click events to captured pointer

If a pointer is captured while the `pointerup` event is being dispatched, the
`click` event is now dispatched to the captured target instead of the nearest
common ancestor of `pointerdown` and `pointerup` events as per the UI Event
spec.

For uncaptured pointers, the `click` target remains unchanged.


[Tracking bug #40851596](https://issues.chromium.org/issues/40851596) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5143357002874880) \| [Spec](https://w3c.github.io/pointerevents/#event-dispatch)

<br />

### Explicit compile hints with magic comments

Allows attaching of information about which functions should be eager parsed and
compiled in JavaScript files.

The information is encoded as magic comments.


[Tracking bug #13917](https://issues.chromium.org/issues/13917) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5100466238652416) \| [Spec](https://wicg.github.io/explicit-javascript-compile-hints-file-based)

<br />

### Incorporate navigation initiator into the HTTP cache partition key

Chrome's HTTP cache keying scheme is updated to include an
`is-cross-site-main-frame-navigation` boolean to mitigate cross-site leak
attacks involving top-level navigation.

Specifically, this will prevent
cross-site attacks in which an attacker can initiate a top-level navigation to a
given page and then navigate to a resource known to be loaded by the page in
order to infer sensitive information using load timing. This change also improves
privacy by preventing a malicious site from using navigations to infer whether a
user has visited a given site previously.


[Tracking bug #398784714](https://issues.chromium.org/issues/398784714) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5190577638080512) \| [Spec](https://developer.chrome.com/release-notes/136/None)

<br />

### Protected audience: text conversion helpers

Protected Audience bidding and scoring scripts that interface with WebAssembly
need to efficiently convert string-typed data to (and from) byte arrays
(for example, to pass strings into and out of WebAssembly with the "memory"
ArrayBuffer). This
provides two standalone functions, `protectedAudience.encodeUtf8`, and
`protectedAudience.decodeUtf8` to perform these tasks about an order of magnitude
more efficiently than doing it in JavaScript.


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

<br />

### `RegExp.escape`

RegExp.escape is a static method that takes a string and returns an escaped
version that may be used as a pattern inside a regular expression.

For example:  

    const str = prompt("Please enter a string");
    const escaped = RegExp.escape(str);
    const re = new RegExp(escaped, 'g'); // handles reg exp special tokens with the replacement.
    console.log(ourLongText.replace(re));


[ChromeStatus.com entry](https://chromestatus.com/feature/5179154657705984) \| [Spec](https://tc39.es/proposal-regex-escaping)

<br />

### Speculation rules: tag field

This enables developers to add tag field to speculation rules. This optional
field can be used to track the source of speculation rules. For example, to treat them
differently at an intermediary server. Any tags associated with a speculation
will be sent with the `Sec-Speculation-Tags` header.


[Tracking bug #381687257](https://issues.chromium.org/issues/381687257) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6503137340555264) \| [Spec](https://wicg.github.io/nav-speculation/speculation-rules.html)

<br />

### Update ProgressEvent to use double type for `loaded` and `total`

The ProgressEvent has attributes `loaded` and `total` indicating the progress,
and their type is `unsigned long long` now.

With this feature, the type for these two attributes is changed to `double`
instead, which gives the developer more control over the value. For example, the
developers can now create a ProgressEvent with the `total` of 1 and the `loaded`
increasing from 0 to 1 gradually. This is aligned with the default behavior of
the `<progress>` HTML element if the max attribute is omitted.


[ChromeStatus.com entry](https://chromestatus.com/feature/5067669587623936) \| [Spec](https://whatpr.org/xhr/394.html#interface-progressevent)

<br />

## Privacy and security

### Permissions Policy reports for iframes

Introduces a new violation type called "Potential Permissions Policy violation",
which will only look at Permissions Policy (including report-only policy) and
the `allow` attribute set in iframes to detect the conflict between Permissions
Policy enforced versus permissions propagated to iframes.


[Tracking bug #40941424](https://issues.chromium.org/issues/40941424) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5154241037205504) \| [Spec](https://github.com/w3c/webappsec-permissions-policy/pull/546)

<br />

### Reduce fingerprinting in Accept-Language header information

Reduces the amount of information the `Accept-Language` header value
string exposes in HTTP requests and in navigator.languages. Instead of sending a
full list of the user's preferred languages on every HTTP request, Chrome
now sends the user's most preferred
language in the Accept-Language header.


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

<br />

## Identity

### FedCM updates

Allows FedCM to show multiple identity providers in the same dialog,
by having all providers in the same `get()` call. This
provides developers with a convenient way to present all supported identity
providers to users.

Chrome 136 also removes support for **add another account** in FedCM passive mode.
This feature allows showing a **use another account** button alongside other IdP
accounts in the chooser. The feature is currently unused, and UX conversations
have led us to believe that supporting this leads to a more complicated flow
without much benefit. This feature will still work in FedCM active mode.


[Tracking bug #1348262](https://issues.chromium.org/issues/1348262) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5067784766095360) \| [Spec](https://github.com/w3c-fedid/FedCM/pull/686)

<br />

### Web authentication conditional create (passkey upgrades)

WebAuthn conditional create requests let websites upgrade existing password
credentials to a passkey.


[Tracking bug #377758786](https://issues.chromium.org/issues/377758786) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5135710007590912) \| [Spec](https://w3c.github.io/webappsec-credential-management/#dom-credentialmediationrequirement-conditional:~:text=For%20create)

<br />

## Images and media

### `AudioContext` Interrupted State

Adds an `"interrupted"` state to `AudioContextState`. This new state lets the
User Agent pause playback during exclusive audio access (VoIP) or when a laptop
lid is closed.


[Tracking bug #374805121](https://issues.chromium.org/issues/374805121) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5172068166139904) \| [Spec](https://webaudio.github.io/web-audio-api/#dom-audiocontextstate-interrupted)

<br />

### Captured surface control

A Web API that lets web applications:

1. Forward wheel events to a captured tab.
2. Read and change the zoom level of a captured tab.


[Tracking bug #1466247](https://issues.chromium.org/issues/1466247) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5092615678066688) \| [Spec](https://w3c.github.io/mediacapture-surface-control)

<br />

### CapturedSurfaceResolution

Expose pixel ratio of the captured surface while screensharing.

This feature helps applications to conserve their system resources or adapt the
quality over bandwidth trade-off according to the physical and logical resolutions of
the captured surface.


[Tracking bug #383946052](https://issues.chromium.org/issues/383946052) \| [ChromeStatus.com entry](https://chromestatus.com/feature/6738236535472128) \| [Spec](https://w3c.github.io/mediacapture-screen-share/#dfn-screenpixelratio)

<br />

### H265 (HEVC) codec support in WebRTC

After this change, HEVC will join VP8, H.264, VP9,
and AV1 as supported codecs in WebRTC. Support will be queryable using the
MediaCapabilities API.


[Tracking bug #391903235](https://issues.chromium.org/issues/391903235) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5153479456456704) \| [Spec](https://w3c.github.io/webrtc-pc)

<br />

### H26x Codec support updates for MediaRecorder

Chromium's MediaRecorder API now supports HEVC encoding, introducing the hvc1.\*
codec string, and adds new codecs (hev1.\* and avc3.\*) supporting variable
resolution video in MP4.

Support for HEVC platform encoding was added in WebCodecs in Chromium M130. As a
follow-up, support has been added to the MediaRecorder API in Chromium. The API
now supports both MP4 and Matroska muxer types with different HEVC and H.264
mime type specifications. HEVC encoding is only supported if the user's device
and operating system provide the necessary capabilities.


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

<br />

### Use `DOMPointInit` for `getCharNumAtPosition`, `isPointInFill`, `isPointInStroke`

This change brings Chromium code in line with the latest W3C specification for
`SVGGeometryElement` and `SVGPathElement` in terms of use of `DOMPointInit` over
`SVGPoint` for `getCharNumAtPosition`, `isPointInFill`, `isPointInStroke`.


[Tracking bug #40572887](https://issues.chromium.org/issues/40572887) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5203869052960768) \| [Spec](https://svgwg.org/svg2-draft)

<br />

### WebGPU: `GPUAdapterInfo` `isFallbackAdapter` attribute

The `GPUAdapterInfo` `isFallbackAdapter` boolean attribute indicates if an
adapter has significant performance limitations in return for wider
compatibility, more predictable behavior, or improved privacy. Note that a
fallback adapter may not be present on all systems.


[Tracking bug #403172841](https://issues.chromium.org/issues/403172841) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5188955424948224) \| [Spec](https://gpuweb.github.io/gpuweb/#dom-gpuadapterinfo-isfallbackadapter)

<br />

## Browser changes

### Fluent scrollbars

This feature modernizes the Chromium scrollbars (both overlay and non-overlay)
on Windows and Linux to fit the Windows 11 Fluent design language.

Non-overlay Fluent scrollbars will be enabled by default in Linux and Windows.
This change applies to Linux as well because Chromium's Linux scrollbar design
has historically been aligned with what ships on Windows. How to expose enabling
overlay Fluent scrollbars is still being decided.


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

<br />

## Origin trials

### Audio Output Devices API: `setDefaultSinkId()`

This feature adds `setDefaultSinkId()` to `MediaDevices`, which enables the
top-level frame to change the default audio output device used by its subframes.


[Origin Trial](https://developer.chrome.com/origintrials/#/view_trial/1173750652883435521) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5098834847072256) \| [Spec](https://docs.google.com/document/d/1xVn0VwLa8w7jwXl6aeOfYn0mYK7zEc4pSmHelHAbi2g/edit?usp=sharing)

<br />

### Enable web applications to understand bimodal performance timings

Web applications may suffer from bimodal distribution in page load performance,
due to factors outside of the web application's control. For example:

- When a user agent first launches (a "cold start" scenario), it must perform many expensive initialization tasks that compete for resources on the system.
- Browser extensions can affect the performance of a website. For instance, some extensions run additional code on every page you visit, which can increase CPU usage and result in slower response times.
- When a machine is busy performing intensive tasks, it can lead to slower loading of web pages.

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


[Origin Trial](https://developer.chrome.com/origintrials/#/view_trial/-8409909354160979967) \| [Tracking bug #1413848](https://issues.chromium.org/issues/1413848) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5186950448283648) \| [Spec](https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/PerformanceNavigationTiming%20for%20User%20Agent%20Launch/explainer.md)

<br />

### Update of Canvas text rendering implementation

This is not a web-exposed change.

The implementation of `CanvasRenderingContext2D` `measureText()`, `fillText()`, and
`strokeText()` has a drastic change. This might affect performance, so we'd like
to run an origin trial so canvas-heavy applications can try out the new
implementation.


[Origin Trial](https://developer.chrome.com/origintrials/#/view_trial/3227392082964381697) \| [Tracking bug #389726691](https://issues.chromium.org/issues/389726691) \| [ChromeStatus.com entry](https://chromestatus.com/feature/5123274645962752)

<br />

## Deprecations and removals

### Remove `HTMLFencedFrameElement.canLoadOpaqueURL()`

The `HTMLFencedFrameElement` method `canLoadOpaqueURL()` was replaced with
`navigator.canLoadAdAuctionFencedFrame()` in 2023, and calling it has resulted
in a deprecation console warning ever since pointing to the new API. The method
is removed from Chrome 136.


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

<br />