{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreihjd5cg4rlilnvayoh7jtbqujex5v46kyuhbk7jodzh47yhvbtfu4",
"uri": "at://did:plc:qp37y62idugoomg4hj4hfukc/app.bsky.feed.post/3m42kaxpcgyi2"
},
"path": "/blog/2025/10/24/this-month-in-servo/",
"publishedAt": "2026-05-23T05:59:16.493Z",
"site": "https://servo.org",
"tags": [
"@TimvdLippe",
"39281",
"39263",
"@sagudev",
"39183",
"@lumiscosity",
"39148",
"@Gae24",
"39296",
"@arihant2math",
"38885",
"@mrobinson",
"@Loirooriol",
"39110",
"@tharkum",
"39466",
"@shubhamg13",
"39133",
"39207",
"Content-Encoding",
"zstd",
"@webbeef",
"36530",
"@simonwuelker",
"39215",
"39290",
"39295",
"39374",
"39406",
"@jdm",
"39033",
"39034",
"39052",
"39146",
"39167",
"39163",
"39059",
"39144",
"39475",
"39397",
"39153",
"@rodio",
"@excitablesnowball",
"39056",
"39394",
"39535",
"@yezhizhen",
"39326",
"39483",
"@mukilan",
"39325",
"39390",
"39113",
"39051",
"codegen.py",
"@jerensl",
"39070",
"38998",
"39185",
"@delan",
"39371",
"39469",
"no longer",
"DebugOptions",
"39352",
"39331",
"toggle_webrender_debugging",
"Profiler",
"39332",
"WebViewDelegate",
"notify_history_changed",
"@Narfinger",
"39134",
"@PotatoCP",
"38508",
"39265",
"39472",
"39499",
"39539",
"39543",
"39086",
"39241",
"39040",
"39087",
"WebDriver-based Web Platform Tests",
"39575",
"37194",
"39316",
"@blueguy1",
"@yjx",
"39507",
"take a screenshot",
"39500",
"@jschwe",
"39039",
"38783",
"separated by a process boundary",
"crossbeam channels",
"IPC channels",
"39073",
"39076",
"39345",
"39347",
"39348",
"39074",
"39480",
"39481",
"39504",
"ordinary Rust strings",
"a variety of representations",
"39106",
"39166",
"39202",
"39233",
"39244",
"39168",
"FNV",
"even simpler polynomial hash",
"Rust",
"Stylo",
"39274",
"39275",
"@coding-joedow",
"39201",
"@ritoban23",
"39351",
"39437",
"39567",
"speedy",
"CI",
"and",
"benchmarking",
"servers",
"Outreachy interns",
"maintainer work",
"further CI improvements",
"faster pull request checks",
"ten-minute WPT builds",
"thanks.dev",
"url",
"html5ever",
"selectors",
"cssparser",
"funding request process",
"servo/project#187",
"Sponsorship page",
"MiniApps Design and Servo",
"slides",
"@gterzian",
"WebEvolve 2025",
"独⽴的,轻量级,模块化与并⾏处理架构的Web引擎开发",
"transcript",
"@rego",
"GOSIM Hangzhou 2025",
"@obrufau",
"About page"
],
"textContent": "September was another busy month for Servo, with a bunch of new features landing in our nightly builds:\n\n * the **Trusted Types** API is now stable (@TimvdLippe, #39281, #39263)\n * **strokeText()** on CanvasRenderingContext2D (@sagudev, #39183)\n * **invertSelf()** on DOMMatrix (@lumiscosity, #39148)\n * **getType()** and **supports()** on ClipboardItem (@Gae24, #39296)\n * **getAll()** and **getAllKeys()** on IDBObjectStore (@arihant2math, #38885)\n * **scrollParent** property on HTMLElement (@mrobinson, @Loirooriol, #39110)\n * **sizes** property on HTMLImageElement (@tharkum, #39466)\n\n\n\nservoshell 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.\n\nTop to bottom: experimental mode off, experimental mode on.\n\n**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).\n\nServo 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).\n\n**‘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).\n\nThe **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).\n\nSeveral 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).\n\nOne 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).\n\n## Embedding and automation \n\nServo now requires **Rust 1.86** to build (@sagudev, #39185).\n\n**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).\n\n`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`.\n\n`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).\n\n`DebugOptions::trace_layout` (`-Z trace-layout`) has been removed (@mrobinson, #39332), since it had no effect.\n\nWe’ve improved the docs for `WebViewDelegate::notify_history_changed` (@Narfinger, @mrobinson, @yezhizhen, #39134).\n\nWhen 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.\n\n**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).\n\nThese 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.\n\n## servoshell \n\n**Favicons** now update correctly when you **navigate back and forward** (@webbeef, #39575), not just when you load a new page.\n\nservoshell’s **command line argument parsing** has been reworked (@Narfinger, #37194, #39316), which should fix the confusing behaviour of some options.\n\nOn mobile devices, servoshell now resizes the webview correctly when the available space changes (@blueguy1, @yjx, @yezhizhen, #39507).\n\nOn 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.\n\n## Performance \n\nServo 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).\n\nMany 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.\n\nWe’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.\n\nWe 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.\n\nWe’ve also landed a few more self-contained perf improvements:\n\n * speeding up accesses to the event loop (@Narfinger, #39274, #39275)\n * avoviding new display lists while loading CSS images (@coding-joedow, #39201)\n * reducing memory usage (@ritoban23, #39351)\n * reducing binary size (@lumiscosity, @Narfinger, #39437, #39567)\n\n\n\n## Donations \n\nThanks again for your generous support! We are now receiving **5654 USD/month** (+1.8% over August) in recurring donations.\n\nThis 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.\n\nServo 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.\n\n**5654** USD/month\n\n**10000**\n\nUse 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.\n\n## Conference talks \n\n**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\n\n**独⽴的,轻量级,模块化与并⾏处理架构的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\n\n**Servo: A new web engine written in Rust** * (slides; transcript) — Manuel Rego (@rego) spoke about the Servo project at GOSIM Hangzhou 2025\n\n**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\n\n**The Joy and Value of Embedded Servo Systems** * (slides) — Gregory Terzian (@gterzian) spoke about embedding Servo at GOSIM Hangzhou 2025\n\n**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\n\n* video coming soon; go to our About page for updates",
"title": "This month in Servo: experimental mode, Trusted Types, strokeText(), and more!",
"updatedAt": "2025-10-24T00:00:00.000Z"
}