BrowserDigest Browser Digest
Back to Blog

Chrome logo

What Changed in Blink: Chromium 130 → 131

Blink Engine
📊 1,282 commits 🐛 906 bugs referenced 👥 259 contributors 📁 8 areas

Why This Matters

Blink is the rendering engine behind Chrome, Edge, Opera, Brave, Vivaldi, and virtually every Chromium-based browser — which together account for roughly 70% of all web traffic. When Blink changes, the web changes. A single commit here can affect billions of page loads per day.

Between versions 130 and 131, the Blink team landed 1,282 commits from 259 contributors, referencing 906 bug reports. This cycle was dominated by a massive code modernization effort (“spanification”), WebGPU maturation, and improvements to prerendering and speculation rules. Here’s what it all means.

At a Glance

MetricCount
Total commits1,282
Areas touched8
Bugs referenced906
Contributors259

CSS

CSS received 286 changes this cycle. A major theme was rendering correctness: the team fixed how <embed> elements handle layout enforcement when the type is set to image — a subtle but important change for pages embedding mixed content. Counter styles got a correctness fix ensuring nonoverridable names aren’t incorrectly marked as tree-scoped references, which matters for complex list styling.

On the visual side, image filter quality saw updates to sampling options for medium and high settings, improving how scaled images render. Emoji font selection was refined so mono emoji fonts are only forced when the substitute is a color emoji font — a fix that improves text rendering consistency across platforms. The team also added chrome://flags variations for ThreadedScrollPreventRenderingStarvation, giving developers more control over how scroll performance trades off against rendering updates. Grid layout scored a win too, with fragmentation tests between rows now passing.

A significant portion of the CSS commits were part of the broader spanification effort — converting raw pointer usage to safer base::span types across the CSS parser, crossfade images, and font size functions. This is less exciting to read about but critical for long-term memory safety.

286 total changes. Browse CSS commits →


DOM & HTML

The DOM & HTML category saw 242 changes with several developer-facing improvements. The <object> element received a critical fix to properly detach its content frame when rendered as fallback content — preventing potential resource leaks and rendering glitches. Meanwhile, BlobEvent now calculates its timecode as a difference from the first chunk, aligning with real-world media recording expectations.

WebNN (Web Neural Network API) gained support for int4 and uint4 data types in quantizeLinear and dequantizeLinear operations — a meaningful addition for on-device machine learning, where 4-bit quantized models are increasingly popular for reducing memory footprint. The Geolocation API improved its error handling with platform-specific error codes, giving developers better diagnostics when location requests fail.

Text editing got attention too: caret navigation with arrow keys now correctly uses the selection focus for positioning, and the early-stage customizable <select> element (selectlist) saw continued test gardening as the team pushes toward a shippable implementation.

242 total changes. Browse DOM & HTML commits →


JavaScript / Web APIs

JavaScript internals received 143 changes with a strong focus on exception handling modernization. The team introduced v8::ExceptionPropagationCallback for setting exception context information — a cleaner approach that replaces ad-hoc plumbing of ExceptionContext through engine internals. Related cleanup removed unnecessary exception context from ByteStreamTeeEngine and ReadableByteStreamController.

Promise handling got a significant overhaul: ScriptPromiseUntyped::CastUndefined was replaced with the clearer ToResolvedUndefinedPromise, and the team added guardrails to prevent premature type-checking when converting V8 values into typed ScriptPromise objects. A new V8ThrowDOMException::Throw() combines the previously separate create-and-throw steps into a single call, reducing boilerplate across the codebase.

Under the hood, a circular dependency between native_value_traits_impl.h and script_promise.h was resolved — the kind of structural debt that, left unchecked, slows down every future change to the bindings layer.

143 total changes. Browse JavaScript commits →


Web Platform APIs

Web APIs saw 183 changes — the third-largest category this cycle. WebGPU continued its march toward maturity with an experimental GPUCanvasContext.getConfiguration() method and preparation for Dawn’s breaking WGPUStringView change. The team also added an experimental canvas configuration getter, giving developers programmatic access to how their WebGPU canvases are set up.

WebAudio received fine-tuning with new parameters to adjust WebAudioBypassOutputBuffering based on the latency hint — allowing low-latency audio worklets to skip output buffering when appropriate. Prerendering got a new failure status (kPrerenderFailedDuringPrefetch) for better diagnostics when speculation rules fail, and the Isolated Web Apps (IWA) platform fixed screen capture permissions with getAllScreensMedia.

The Canvas 2D layer bridge saw multiple test ports to the modern CRenderingContext2D infrastructure, including hibernation, visibility change, and tear-down scenarios — part of an ongoing effort to modernize Chrome’s 2D canvas implementation.

183 total changes. Browse Web Platform API commits →


Performance

24 changes targeted performance, focused on GPU pipeline cleanup and preloading. The biggest change was removing legacy EstablishGpuChannel code after the SharedBitmap-to-SharedImage conversion completed — eliminating dead code paths that had been accumulating since the migration. Parameters for kThreadedPreloadScanner and kPrecompileInlineScripts were updated, tuning how aggressively Chrome preloads resources during HTML parsing.

The bindings layer gained support for sequence<sequence<T>> where T is garbage-collected — a seemingly niche improvement that unblocks APIs returning nested arrays of DOM objects. The garbage collector’s handling of weak backings during conservative GC also received new test coverage.

24 total changes. Browse Performance commits →


Security & Privacy

28 changes hardened security. The most impactful change moved OOM crash handling from after ArrayBufferContents creation to inside PartitionAlloc itself — catching allocation failures earlier and producing cleaner crash reports. Speculation Rules received a significant security relaxation: rules loaded via the Speculation-Rules HTTP header are now exempt from CSP checks by default, since the server already controls the header content.

Fenced Frames continued maturing with the removal of the FencedFramesReportingAttestationsChanges flag, indicating the feature has stabilized. Port restrictions were added for TCPServerSocket and bound UDPSocket in Direct Sockets, closing a potential attack surface. The Prompt API (part of Chrome’s on-device AI effort) also gained a base feature check for its origin trial.

28 total changes. Browse Security commits →


Accessibility

A focused set of 25 changes improved accessibility. The standout is an experiment exposing <summary> as an expandable heading — a potential improvement for screen reader users navigating disclosure widgets. The team removed nonstandard data-mathml support that hadn’t been used since 2020, and Event Timing now eagerly sets presentation time or fallback time, improving how assistive technology perceives interaction responsiveness. The InspectorAccessibilityAgent was also refactored to encapsulate its own methods better.

25 total changes. Browse Accessibility commits →


Other Changes

An additional 351 commits cover code health, tooling, and emerging features. The dominant theme is exception handling modernization: bindings now throw exceptions directly instead of routing through ExceptionState, and the ContinueEventTimingRecordingWhenBufferIsFull runtime flag was promoted to stable — meaning Event Timing data will now keep recording even when the performance buffer fills up.

Speculation Rules got flag cleanup around pointer heuristics, and the team added WebDX feature use counters for AbortController and AbortSignal, tracking real-world adoption of these APIs. DevTools received a subtle but nice touch: experimental menu items now show a science icon, making it clearer which features are still in development. The spanification effort continued across messaging codecs, image decoders, and Bluetooth modules.

351 total changes. Browse all commits →


Bottom Line

Who should care? Developers using WebGPU will appreciate the maturing API surface. If you’re building with the WebNN API for on-device ML, int4/uint4 quantization support opens new model optimization possibilities. Anyone relying on speculation rules for prerendering gets a cleaner CSP story.

Biggest impact: The sheer volume of spanification and exception-handling modernization (351 “other” commits) signals that Chromium 131 is fundamentally a code health release — the kind of invisible work that makes future features ship faster and with fewer bugs.


Browse the Full Diff

Explore all 1,282 commits on Chromium’s Gitiles:

🔗 chromium.googlesource.com/chromium/src/+log/130.0.6723.0..131.0.6778.0/third_party/blink


Subscribe to BrowserDigest


Sources