This month in Servo: dark mode, keyword sizes, XPath, and more!
Servo now supports **dark mode** (@arthmis, @lazypassion, #34532), respecting the platform dark mode in servoshell and **‘prefers-color-scheme’** (@nicoburns, #34423, stylo#93) on Windows and macOS.
MDN article for ‘prefers-color-scheme’ in dark mode (left) and light mode (right), with `--pref dom.resize_observer.enabled`.
**CSS transitions** can now be triggered properly by script (@mrobinson, #34486), and we now support **‘min-height’** and **‘max-height’** on column flex containers (@Loirooriol, @mrobinson, #34450), **‘min-content’** , **‘max-content’** , **‘fit-content’** , and **‘stretch’** in block layout (@Loirooriol, #34641, #34568, #34695), **‘stretch’** on replaced positioned elements (@Loirooriol, #34430), as well as **‘align-self: self-start’** , **‘self-end’** , **‘left’** , and **‘right’** on positioned elements (@taniishkaaa, @Loirooriol, #34365).
Servo can now run **Discord** well enough to **log in** and **read messages** , though you can’t send messages yet. To get this working, we landed some bare-bones AbortController support (@jdm, @syvb, #34519) and a WebSocket fix (@jdm, #34634). Try it yourself with `--pref dom.svg.enabled --pref dom.intersection_observer.enabled --pref dom.abort_controller.enabled`!
We now support **console.trace()** (@simonwuelker, #34629), **PointerEvent** (@wusyong, #34437), and the **clonable** property on **ShadowRoot** (@simonwuelker, #34514). Shadow DOM support continues to improve (@jdm, #34503), including very basic **Shadow DOM layout** (@mrobinson, #34701) when enabled via `--pref dom.shadowdom.enabled`.
`script` underwent (and continues to undergo) major rework towards being **more reliable** and **faster to build**. We’ve landed better **synchronisation for DOM tree mutations** (@jdm, #34505) and continued work on **splitting up the`script` crate** (@jdm, #34366). We’ve moved our **ReadableStream** support into Servo, eliminating the maintenance burden of a downstream SpiderMonkey patch (@gterzian, @wusyong, @Taym95, #34064, #34675).
The web platform guarantees that same-origin frames and their parents can **synchronously observe resizes** and their effects. Many tests rely on this, and not doing this correctly made Servo’s test results much flakier than they could otherwise be. We’ve made very good progress towards fixing this (@mrobinson, #34643, #34656, #34702, #34609), with correct resizing in all cases except when a same-origin frame is in another script thread, which is rare.
We now support enough of **XPath** to get htmx working (@vlindhol, #34463), when enabled via `--pref dom.xpath.enabled`.
Servo’s performance continues to improve, with **layout caching for flex columns** delivering up to 12x speedup (@Loirooriol, @mrobinson, #34461), many **unnecessary reflows now eliminated** (@mrobinson, #34558, #34599, #34576, #34645), **reduced memory usage** (@mrobinson, @Loirooriol, #34563, #34666), faster rendering for pages with animations (@mrobinson, #34489), and timers now operating without IPC (@mrobinson, #34581).
**servoshell nightlies are up to 20% smaller** (@atbrakhi, #34340), **WebGPU is now optional** at build time (@atbrakhi, #34444), and `--features tracing` no longer enables `--features layout-2013` (@jschwe, #34515) for further binary size savings. You can also **limit the size of** several of Servo’s **thread pools** with `--pref threadpools.fallback_worker_num` and others (@jschwe, #34478), which is especially useful on machines with many CPU cores.
We’ve started laying the groundwork for full **incremental layout** in our new layout engine, starting with a general layout caching mechanism (@mrobinson, @Loirooriol, #34507, #34513, #34530, #34586). This was lost in the switch to our new layout engine, and without it, every time a page changes, we have to rerun layout from scratch. As you can imagine, this is very, very expensive, and incremental layout is critical for performance on today’s highly dynamic web.
We’ve mentioned layout caching a few times, including in past monthly updates, but most of the caching we’ve landed so far has been to save time _within_ a single reflow. Incremental layout requires layout caching that _persists_ across reflows, and algorithms to determine when to invalidate those cached results.
## Donations __
Thanks again for your generous support! We are now receiving **4329 USD/month** (+0.8% over November) in recurring donations. With this money, we’ve been able to cover our web hosting and self-hosted CI runners for Windows, Linux, and now macOS builds (@delan, #34868), **halving`mach try` build times** from over an hour to under 30 minutes! Next month, we’ll be expanding our CI capacity further, all made possible thanks to your help.
Servo is also on thanks.dev, and already **sixteen GitHub users** 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.
**4329** USD/month
**10000**
As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.