devtake.dev

65.9% of the web platform tests now pass in Servo, but the Rust engine can't select text

Servo 0.4.0 landed a record 558 commits and fixed layout on real sites. Its own dashboard reads 65.9%, CSS Grid sits at 37.8%, and text selection isn't shipped yet.

Soren Vanek · · 4 min read · 8 sources
GitHub release card for servo/servo version 0.4.0, showing the multicolour Servo hexagon logo and a note pointing to the project's June blog post
Image: GitHub · Source

Servo shipped version 0.4.0 with 558 commits behind it, an all-time record for the project. The Rust engine now lays out lichess.org correctly and reads properly on Zulip. Text selection still doesn’t work.

Three engines render the web today: Blink, WebKit and Gecko. Servo has been the fourth candidate since Mozilla started it in 2012, and for most of that stretch it’s been a research project you’d read about rather than run. Its own dashboard now puts it at 65.9% across the Web Platform Tests, up from 26.7% in April 2023. Rendering a page and being usable on it are different bars, and 0.4.0 is the first release where the distance between the two is the interesting part.

What 0.4.0 actually fixed

Version 0.4.0 bundles everything Servo landed during June, which came to 558 commits against 534 in April and 391 in May, per the project’s monthly update. The release credits 21 first-time contributors. Most of the visible work is layout correctness on sites people use rather than benchmark wins: better handling of variable fonts made Zulip and speedtest.net legible, and lichess.org went from a broken layout to a correct one. Google Photos already worked before this release. Google Maps renders now too, which is the line worth pausing on.

  • Media queries that responsive CSS relies on. @media (hover), @media (pointer), @media (orientation) and the aspect-ratio and device-width families all landed in June, per the release notes. A stylesheet that branches on input type was previously taking the wrong branch every time.
  • SharedWorker, at last. A background script shared across same-origin tabs was one of the older DOM APIs Servo had no answer for. It works now, alongside console.dir(), pointer capture and the legacy touch event handlers.
  • WebGPU moved, still behind a flag. copyExternalImageToTexture() and real query sets arrived, gated behind --pref dom_webgpu_enabled. None of it is on by default.
  • A fuzzing campaign killed 16 crash bugs. Frédéric Wang has been fuzzing Servo for months, and June’s haul hit <iframe>, <slot>, clip-path and CSS transforms.
  • The engine got cheaper to run. BoxFragment shrank 17% (288 bytes down to 240 on amd64) and 2D canvases now draw with up to 23% less power.

Where it still falls down

Servo’s own numbers are the best skepticism available. The WPT dashboard reads 65.9% overall, but CSS Grid sits at 37.8% and CSS fragmentation, which covers multicolumn and print layout, at 26.9%. Editing scores 43.7%. IndexedDB scores 43.8%. On a modern site those aren’t rounding errors.

The project is blunt about the rest. Google Maps and OpenStreetMap “render well but have some issues with interactivity”, the June update says, and visible text selection is only now being implemented, described in the same post as “one of the most long-awaited features of any web browser”. Accessibility and Web Animations both sit behind preference flags. The SubtleCrypto RSA implementation “is currently vulnerable to the Marvin Attack”, per that post as well.

Embedding has a harder blocker. Rust has no stable ABI, so, as the update puts it, “it has generally not been possible to embed Servo in another application without building Servo from source”. A wrapper C API is being designed to close that. Until it ships, everything on the built-with-Servo list, the Verso browser shell and the Tauri webview backend included, has to compile the engine itself.

Money is the third constraint. Servo is a Linux Foundation Europe project maintained largely by Igalia, and it reports $7,681 a month in recurring donations against a $10,000 target. Dietrich Ayala, formerly of Mozilla, scored Servo at 19.8% of Baseline Widely Available features in March, and worked out that it finishes roughly 22 features a year while the platform adds about 52. On that arithmetic Servo “plateaus around 80% by ~2037 and never catches up”. He priced parity at 44 engineers, near 8.8 million euros a year.

Independent browser work has to be paid for somehow, and the going answers are thin: Brave now charges $60 for a stripped-down build, VoidZero sold itself to Cloudflare to keep Vite funded, and Intel switched off its open-source evangelism program after two decades.

What this means for you

Nothing here says you should start testing against Servo. Nobody’s users are on it, servoshell is a test browser, and the built-with list is shells and experiments rather than products. What changed is the shape of the bet. An engine that renders Google Maps and lays out lichess correctly is past the toy stage, and some surfaces are closing fast: WebCryptoAPI went from 90.1% at the end of June to 100% by August 1. Servo also isn’t the last independent engine standing, whatever the headlines imply. Ladybird is writing one from scratch with what it calls “a small full-time engineering team”, and its first alpha for Linux and macOS is “coming in 2026”.

Watch the C API. The day you can install a Servo shared library and point a Tauri app at it, a fourth engine starts mattering to developers who don’t follow browser engines for fun. Until then, 0.4.0 is a very good research release, and Ayala’s 2037 number is the thing to argue with.

Share this article

Quick reference

fuzzing
Throwing huge volumes of malformed input at a program to crash it and expose memory bugs. It's cheap to run and the main way modern parsers get audited.

Sources

Mentioned in this article