This month in Servo: experimental mode, Trusted Types, strokeText(), and more

1 day ago 1

September was another busy month for Servo, with a bunch of new features landing in our nightly builds:

servoshell nightly showing new support for the strokeText() method on CanvasRenderingContext2D

servoshell now has a new experimental mode button (☢). Turning on experimental mode has the same effect as running Servo with --enable-experimental-web-platform-features: it enables all engine features, even those that may not be stable or complete. This works much like Chromium’s option with the same name, and it can be useful when a page is not functioning correctly, since it may allow the page to make further progress.

servoshell nightly showing the new experimental mode button (☢), which enables experimental web platform features Top to bottom: experimental mode off, experimental mode on.

Viewport meta tags are now enabled on mobile devices only, fixing a bug where they were enabled on desktop (@shubhamg13, #39133). You can still enable them if needed with --pref viewport_meta_enabled (@shubhamg13, #39207).

Servo now supports Content-Encoding: zstd (@webbeef, #36530), and we’ve fixed a bug causing spurious credentials prompts when a HTTP 401 has no ‘WWW-Authenticate’ header (@simonwuelker, #39215). We’ve also made a bunch of progress on AbortController (@TimvdLippe, #39290, #39295, #39374, #39406) and <link rel=preload> (@TimvdLippe, @jdm, #39033, #39034, #39052, #39146, #39167).

‘Content-Security-Policy: sandbox’ now disables scripting unless ‘allow-scripts’ is given (@TimvdLippe, #39163), and crypto.subtle.exportKey() can now export HMAC keys in raw format (@arihant2math, #39059).

The scrollIntoView() method on Element now works with shadow DOM (@mrobinson, @Loirooriol, #39144), and recurses to parent iframes if they are same origin (@Loirooriol, @mrobinson, #39475, #39397, #39153).

Several types of DOM exceptions can now have error messages (@arihant2math, @rodio, @excitablesnowball, #39056, #39394, #39535), and we’ve also fixed a bug where links often need to be clicked twice (@yezhizhen, #39326), and fixed bugs affecting <img> attribute changes (@tharkum, #39483), the ‘:defined’ selector (@mukilan, #39325, #39390), invertSelf() on DOMMatrix (@lumiscosity, #39113), and the ‘href’ setter on Location (@arihant2math, @sagudev, #39051).

One complex part of Servo isn’t even written in Rust, it’s written in Python! codegen.py, which describes how to generate Rust code with bindings for every known DOM interface from the WebIDL, is now fully type annotated (@jerensl, @mukilan, #39070, #38998).

Embedding and automation

Servo now requires Rust 1.86 to build (@sagudev, #39185).

Keyboard scrolling is now automatically implemented by Servo (@delan, @mrobinson, #39371, #39469), so embedders no longer need to translate arrow keys, Home, End, Page Up, and Page Down to WebView API calls. This change also improves the behaviour of those keys, scrolling the element or <iframe> that was focused or most recently clicked (or a nearby ancestor).

DebugOptions::convert_mouse_to_touch (-Z convert-mouse-to-touch) has been removed (@mrobinson, #39352), with no replacement. Touch event simulation continues to be available in servoshell as --simulate-touch-events.

DebugOptions::webrender_stats (-Z wr-stats in servoshell) has been removed (@mrobinson, #39331); instead call toggle_webrender_debugging(Profiler) on a WebView (or press Ctrl+F12 in servoshell).

DebugOptions::trace_layout (-Z trace-layout) has been removed (@mrobinson, #39332), since it had no effect.

We’ve improved the docs for WebViewDelegate::notify_history_changed (@Narfinger, @mrobinson, @yezhizhen, #39134).

When automating servoshell with WebDriver, commands targeting elements now correctly scroll into view if needed (@PotatoCP, @yezhizhen, #38508, #39265), allowing Element Click, Element Send Keys, Element Clear, and Take Element Screenshot to work properly when the element is outside the viewport.

WebDriver mouse inputs now work correctly with HiDPI scaling on more platforms (@mrobinson, #39472), and we’ve improved the reliability of Take Screenshot, Take Element Screenshot (@yezhizhen, #39499, #39539, #39543), Switch To Frame (@yezhizhen, #39086), Switch To Window (@yezhizhen, #39241), and New Session (@yezhizhen, #39040).

These improvements have enabled us to run the WebDriver conformance tests in CI by default (@PotatoCP, #39087), and also mean we’re closer than ever to running WebDriver-based Web Platform Tests.

servoshell

Favicons now update correctly when you navigate back and forward (@webbeef, #39575), not just when you load a new page.

servoshell’s command line argument parsing has been reworked (@Narfinger, #37194, #39316), which should fix the confusing behaviour of some options.

On mobile devices, servoshell now resizes the webview correctly when the available space changes (@blueguy1, @yjx, @yezhizhen, #39507).

On macOS, telling servoshell to take a screenshot no longer hides the window (@mrobinson, #39500). This does not affect taking a screenshot in headless mode (--headless), where there continues to be no window at all.

Performance

Servo currently runs in single-process mode unless you opt in to --multiprocess mode, and we’ve landed a few perf improvements in that default mode. For one, in single-process mode, script can now communicate with the embedder directly for reduced latency (@jschwe, #39039). We also create one thread pool for the image cache now, rather than one pool per origin (@rodio, #38783).

Many components of Servo that would be separated by a process boundary in multiprocess mode, now use crossbeam channels in single-process mode, rather than using IPC channels in both modes (@jschwe, #39073, #39076, #39345, #39347, #39348, #39074). IPC channels are required when communicating with another process, but they’re more expensive, because they require serialising and deserialising each message, plus resources from the operating system.

We’ve started working on an optimisation for string handling in Servo’s DOM layer (@Narfinger, #39480, #39481, #39504). Strings in our DOM have historically been represented as ordinary Rust strings, but they often come from SpiderMonkey, where they use a variety of representations, none of which are entirely compatible. SpiderMonkey strings would continue to need conversion to Servo strings, but the idea we’re working towards is to make the conversion lazy, in the hope that many strings will never end up being converted at all.

We now use a faster hash algorithm for internal hashmaps that are not security-critical (@Narfinger, #39106, #39166, #39202, #39233, #39244, #39168). These changes also switch that faster algorithm from FNV to an even simpler polynomial hash, following in the footsteps of Rust and Stylo.

We’ve also landed a few more self-contained perf improvements:

Donations

Thanks again for your generous support! We are now receiving 5654 USD/month (+1.8% over August) in recurring donations.

This helps us cover the cost of our speedy CI and benchmarking servers, one of our latest Outreachy interns, and funding maintainer work that helps more people contribute to Servo. Keep an eye out for further CI improvements in the coming months, including faster pull request checks and ten-minute WPT builds.

Servo is also on thanks.dev, and already 28 GitHub users (±13 from August) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community.

5654 USD/month

10000

Use of donations is decided transparently via the Technical Steering Committee’s public funding request process, and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.

Conference talks

MiniApps Design and Servo (starting at ~2:37:00; slides) — Gregory Terzian (@gterzian) spoke about how Servo can be used as a web engine for mini-app platforms at WebEvolve 2025

独⽴的,轻量级,模块化与并⾏处理架构的Web引擎开发 [zh] / Developing an independent, light-weight, modular and parallel web-engine [en] (starting at ~5:49:00; slides) — Jonathan Schwender (@jschwe) spoke about Servo’s goals and status at WebEvolve 2025

Servo: A new web engine written in Rust* (slides; transcript) — Manuel Rego (@rego) spoke about the Servo project at GOSIM Hangzhou 2025

Driving Innovation with Servo and OpenHarmony: Unified Rendering and WebDriver* (slides) — Jingshi Shangguan & Zhizhen Ye (@yezhizhen) spoke about a new OpenHarmony rendering backend and WebDriver support in Servo at GOSIM Hangzhou 2025

The Joy and Value of Embedded Servo Systems* (slides) — Gregory Terzian (@gterzian) spoke about embedding Servo at GOSIM Hangzhou 2025

A Dive Into the Servo Layout System* (slides) — Martin Robinson (@mrobinson) & Oriol Brufau (@obrufau) spoke about the architecture of Servo’s parallel and incremental layout system at GOSIM Hangzhou 2025

* video coming soon; go to our About page for updates

Read Entire Article