Skip to content

Commit b5fce8a

Browse files
authored
blog: December in Servo (2025) (#288)
* blog: December in Servo (2025) * Fix commit list * Triage 90 commits * Triage 32 commits * Triage 31 commits * Triage 30 commits * Triage 25 commits * Triage 26 commits * Boilerplate post * Write about multiple windows * Write about servoshell and API changes * Write about more API changes (and triage 2 commits) * Write about devtools * Add devtools figure * Issue correction for previous monthly update * Write about SubtleCrypto * Reword lede * Write about rendering bugs * Write about web platform * Triage 28 commits * Triage 27 commits * Write about DOM changes * Write about crashes (and a bit about layout) * Write about garbage collection bugs * Write about perf changes * Add multiple windows figure * Trim figure a bit * Write about donations * Write about conference talks and blogs * Add mention to multiple windows patches * Add note about servoshell bug on macOS
1 parent 88a219e commit b5fce8a

File tree

8 files changed

+5091
-16
lines changed

8 files changed

+5091
-16
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,3 +436,4 @@ When we make mistakes, we issue corrections on the blog and on social media.
436436

437437
- [**November 2023**](https://servo.org/blog/2023/11/30/embedding-floats-color-mix/)[An earlier version](https://github.com/servo/servo.org/pull/126) of this post said that Servo now supports the :has() selector, but this was incorrect. While some of the code implementing the feature has landed, it is [not yet enabled](https://github.com/servo/servo/blob/7bcb25c85c98c367c6423ebc0fed964dd08cad56/components/selectors/parser.rs#L276-L279).
438438
- [**March 2024**](https://servo.org/blog/2024/03/12/sponsoring-servo/)[An earlier version](https://github.com/servo/servo.org/pull/139) of this post said that over 94% of amounts donated to Servo go directly to the project, with only 6% in fees, but this was incorrect. The actual fees depend on the payment method and the amount you donate, but in most cases they are between 10% and 20%. We are still working on clarifying the exact rules about fees with our crowdfunding platforms, so check our [Sponsorship](https://servo.org/sponsorship/) page for the latest information.
439+
- [**November 2025**](https://servo.org/blog/2025/12/15/november-in-servo/)[An earlier version](https://github.com/servo/servo.org/pull/282) of this post said that Servo now has full support for ChaCha20-Poly1305, but this was incorrect. We had only landed the ‘importKey’ and ‘exportKey’ operations. The ‘encrypt’, ‘decrypt’, and ‘generateKey’ options landed in the following month.

_posts/2025-12-15-november-in-servo.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ summary: All of these updates are in Servo 0.0.3.
77
categories:
88
---
99

10+
<aside class="_correction">
11+
12+
**Correction (2026-01-19)**
13+
14+
[An earlier version](https://github.com/servo/servo.org/pull/282) of this post said that Servo now has full support for ChaCha20-Poly1305, but this was incorrect. We had only landed the ‘importKey’ and ‘exportKey’ operations. The ‘encrypt’, ‘decrypt’, and ‘generateKey’ options landed in the following month.
15+
</aside>
16+
1017
Landing in [**Servo 0.0.3**](https://github.com/servo/servo/releases/tag/v0.0.3) and our November nightly builds, we now have **context menus** for links, images, and other web content ([@atbrakhi](https://github.com/atbrakhi), [@mrobinson](https://github.com/mrobinson), [#40434](https://github.com/servo/servo/pull/40434), [#40501](https://github.com/servo/servo/pull/40501)), **vsync on Android** ([@mrobinson](https://github.com/mrobinson), [#40306](https://github.com/servo/servo/pull/40306)), **light mode** for the **new tab page** ([@arihant2math](https://github.com/arihant2math), [#40272](https://github.com/servo/servo/pull/40272)), plus several web platform features:
1118

1219
- **&lt;video controls>** ([@rayguo17](https://github.com/rayguo17), [#40578](https://github.com/servo/servo/pull/40578))
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
---
2+
layout: post
3+
tags: blog
4+
title: "December in Servo: and more!"
5+
date: 2026-01-19
6+
summary: ao!! wrrrrao!!
7+
categories:
8+
---
9+
10+
<!--
11+
- 2991.40/month opencollective
12+
- 3830.00/month github
13+
- 288.75/month 30 donors thanks.dev
14+
-->
15+
16+
**Servo 0.0.4** and our December nightly builds now support **multiple windows** (@mrobinson, @mukilan, #40927, #41235, #41144)!
17+
This builds on features that landed in Servo’s embedding API [last month]({{ '/blog/2025/12/15/november-in-servo/' | url }}).
18+
We’ve also landed support for several web platform features, both old and new:
19+
20+
- **‘contrast-color()’** in CSS color values (@webbeef, #41542)
21+
- partial support for **&lt;meta charset>** (@simonwuelker, #41376)
22+
- partial support for [**encoding sniffing**](https://html.spec.whatwg.org/multipage/#encoding-sniffing-algorithm) (@simonwuelker, #41435)
23+
- **‘background’** and **‘bgcolor’** attributes on &lt;table>, &lt;thead>, &lt;tbody>, &lt;tfoot>, &lt;tr>, &lt;td>, &lt;th> (@simonwuelker, #41272)
24+
- **tee()** on **readable byte streams** (@Taym95, #35991)
25+
26+
<aside class="_note">
27+
28+
**Note:** due to [a known issue](https://github.com/servo/servo/issues/42069), servoshell on macOS may not be able to directly open new windows, depending on your system settings.
29+
</aside>
30+
31+
<figure>
32+
<img src="{{ '/img/blog/2026-01-diffie.png' | url }}" alt="Servo 0.0.4 showing new support for multiple windows">
33+
</figure>
34+
35+
For better compatibility with older web content, we now support **vendor-prefixed** CSS properties like ‘-moz-transform’ (@mrobinson, #41350), as well as window.**clientInformation** (@Taym95, #41111).
36+
37+
We’ve continued shipping the **[SubtleCrypto](https://w3c.github.io/webcrypto/) [API](https://wicg.github.io/webcrypto-modern-algos/)**, with full support for **ChaCha20-Poly1305**, **RSA-OAEP**, **RSA-PSS**, and **RSASSA-PKCS1-v1_5** (see below), plus **importKey() for ML-KEM** (@kkoyung, #41585) and several other improvements (@kkoyung, @PaulTreitel, @danilopedraza, #41180, #41395, #41428, #41442, #41472, #41544, #41563, #41587, #41039, #41292):
38+
39+
<figure style="overflow-x: scroll;">
40+
41+
| Algorithm | |
42+
|---|---|
43+
| <span style=white-space:nowrap>ChaCha20-Poly1305</span> | (@kkoyung, #40978, #41003, #41030) |
44+
| <span style=white-space:nowrap>RSA-OAEP</span> | (@kkoyung, @TimvdLippe, @jdm, #41225, #41217, #41240, #41316) |
45+
| <span style=white-space:nowrap>RSA-PSS</span> | (@kkoyung, @jdm, #41157, #41225, #41240, #41287) |
46+
| <span style=white-space:nowrap>RSASSA-PKCS1-v1_5</span> | (@kkoyung, @jdm, #41172, #41225, #41240, #41267) |
47+
</figure>
48+
49+
When using **servoshell** on Windows, you can now see `--help` and log output, as long as servoshell was started in a console.
50+
51+
Servo diagnostics options are now accessible in servoshell via the `SERVO_DIAGNOSTICS` environment variable (@atbrakhi, #41013), in addition to the usual `-Z` / `--debug=` arguments.
52+
53+
[**Servo’s devtools**](https://book.servo.org/contributing/devtools.html) now partially support the **Network** > **Security** tab (@jiang1997, #40567), allowing you to inspect some of the TLS details of your requests.
54+
We’ve also made it **compatible with Firefox 145** (@eerii, #41087), and use fewer IPC resources (@mrobinson, #41161).
55+
56+
<figure>
57+
<img src="{{ '/img/blog/2026-01-devtools-security.png' | url }}" alt="this website in Servo’s devtools, showing that the main request used TLS 1.3, TLS13_AES_256_GCM_SHA384 cipher suite, and X25519MLKEM768 key exchange, with HSTS enabled and HPKP disabled">
58+
</figure>
59+
60+
We’ve fixed rendering bugs related to **‘float’**, **‘order’**, **‘max-width’**, **‘max-height’**, **:link’ selectors**, **&lt;audio> layout**, and **getClientRects()**, affecting intrinsic sizing (@Loirooriol, #41513), anonymous blocks (@Loirooriol, #41510), incremental layout (@Loirooriol, #40994), flex item sizing (@Loirooriol, #41291), selector matching (@andreubotella, #41478), replaced element layout (@Loirooriol, #41262), and empty fragments (@Loirooriol, #41477).
61+
62+
Servo now fires **‘toggle’** events on **&lt;dialog>** (@lukewarlow, #40412).
63+
We’ve also improved the conformance of ‘wheel’ events (@mrobinson, #41182), ‘hashchange’ events (@Taym95, #41325), ‘dblclick’ events on &lt;input> (@Taym95, #41319), ‘resize’ events on &lt;video> (@tharkum, #40940), ‘seeked’ events on &lt;video> and &lt;audio> (@tharkum, #40981), and the ‘transform’ property in getComputedStyle() (@mrobinson, #41187).
64+
65+
## Embedding API
66+
67+
Servo now has basic support for **HTTP proxies** (@Narfinger, #40941).
68+
You can set the proxy URL in the `http_proxy` (@Narfinger, #41209) or `HTTP_PROXY` (@treeshateorcs, @yezhizhen, #41268) environment variables, or via `--pref network_http_proxy_uri`.
69+
70+
We now use the **system root certificates** by default (@Narfinger, @mrobinson, #40935, #41179), on most platforms.
71+
If you don’t want to trust the system root certificates, you can instead continue to use Mozilla’s root certificates with `--pref network_use_webpki_roots`.
72+
As always, you can also add your own root certificates via [`Opts`](https://doc.servo.org/servo/opts/struct.Opts.html)::[`certificate_path`](https://doc.servo.org/servo/opts/struct.Opts.html#structfield.certificate_path) (`--certificate-path=`).
73+
74+
We have a new [`SiteDataManager`](???) API for managing **localStorage**, **sessionStorage**, and **cookies** (@janvarga, #41236, #41255, #41378, #41523, #41528), and a new [`NetworkManager`](???) API for managing the **cache** (@janvarga, @mrobinson, #41255, #41474, #41386).
75+
To clear the cache, call [`NetworkManager`](???)::[`clear_cache`](???), and to list cache entries, call [`NetworkManager`](???)::[`cache_entries`](???).
76+
77+
[**Simple dialogs**](https://html.spec.whatwg.org/multipage/#simple-dialogs) – that is alert(), confirm(), and prompt() – are now exposed to embedders via a new [`SimpleDialog`](https://doc.servo.org/servo/enum.SimpleDialog.html) type in [`EmbedderControl`](https://doc.servo.org/servo/webview_delegate/enum.EmbedderControl.html) (@mrobinson, @mukilan, #40982).
78+
This new interface is harder to misuse, and no longer requires boilerplate for embedders that wish to [ignore simple dialogs](https://html.spec.whatwg.org/multipage/#cannot-show-simple-dialogs).
79+
80+
**Web console messages**, including messages from the [Console API](https://developer.mozilla.org/en-US/docs/Web/API/Console_API), are now accessible via [`ServoDelegate`](https://doc.servo.org/servo/trait.ServoDelegate.html)::[`show_console_message`](https://doc.servo.org/servo/trait.ServoDelegate.html#method.show_console_message) and [`WebViewDelegate`](https://doc.servo.org/servo/trait.WebViewDelegate.html)::[`show_console_message`](https://doc.servo.org/servo/trait.WebViewDelegate.html#method.show_console_message) (@atbrakhi, #41351).
81+
82+
[`Servo`](https://doc.servo.org/servo/struct.Servo.html), the main handle for controlling Servo, is now cloneable for sharing within the same thread (@mukilan, @mrobinson, #41010).
83+
To shut down Servo, simply [drop](https://doc.rust-lang.org/std/mem/fn.drop.html) the last `Servo` handle or let it go out of scope.
84+
`Servo`::`start_shutting_down` and `Servo`::`deinit` have been removed (@mukilan, @mrobinson, #41012).
85+
86+
Several interfaces have also been renamed:
87+
88+
- [`Servo`](https://doc.servo.org/servo/struct.Servo.html)::`clear_cookies` is now [`SiteDataManager`](???)::[`clear_cookies`](???) (@janvarga, #41236, #41255)
89+
- `DebugOpts`::`disable_share_style_cache` is now [`Preferences`](https://doc.servo.org/servo/prefs/struct.Preferences.html)::[`layout_style_sharing_cache_enabled`](https://doc.servo.org/servo/prefs/struct.Preferences.html#structfield.layout_style_sharing_cache_enabled) (@atbrakhi, #40959)
90+
- The rest of `DebugOpts` has been moved to [`DiagnosticsLogging`](https://doc.servo.org/servo/opts/struct.DiagnosticsLogging.html), and the options have been renamed (@atbrakhi, #40960)
91+
92+
## Perf and stability
93+
94+
We can now **evict entries** from our **HTTP cache** (@Narfinger, @gterzian, @Taym95, #40613), rather than having it grow forever (or get cleared by an embedder).
95+
**about:memory** now tracks **SVG-related memory usage** (@d-kraus, #41481), and we’ve fixed memory leaks in &lt;video> and &lt;audio> (@tharkum, #41131).
96+
97+
Servo now does less work when **matching selectors** (@webbeef, #41368), when **focus changes** (@mrobinson, @Loirooriol, #40984), and when **reflowing boxes** whose size did not change (@Loirooriol, @mrobinson, #41160).
98+
99+
To allow for smaller binaries, **gamepad support** is now **optional at build time** (@WaterWhisperer, #41451).
100+
101+
We’ve fixed some **undefined behaviour** around garbage collection (@sagudev, @jdm, @gmorenz, #41546, mozjs#688, mozjs#689, mozjs#692).
102+
To better avoid other garbage-collection-related bugs (@sagudev, <!-- ISSUE --> mozjs#647, mozjs#638), we’ve continued our work on defining (and migrating to) safer interfaces between Servo and the SpiderMonkey GC (@sagudev, #41519, #41536, #41537, #41520, #41564).
103+
104+
We’ve fixed a crash that occurs when **&lt;link rel="shortcut icon">** has an **empty ‘href’ attribute**, which affected chiptune<!---->.com (@webbeef, #41056), and we’ve also fixed crashes in:
105+
106+
- ‘background-repeat’ (@mrobinson, #41158)
107+
- &lt;audio> layout (@Loirooriol, #41262)
108+
- custom elements (@mrobinson, #40743)
109+
- AudioBuffer (@WaterWhisperer, #41253)
110+
- AudioNode (@Taym95, #40954)
111+
- ReportingObserver (@Taym95, #41261)
112+
- Uint8Array (@jdm, #41228)
113+
- the fonts system, on FreeType platforms (@simonwuelker, #40945)
114+
- IME usage, on OpenHarmony (@jschwe, #41570)
115+
116+
## Donations
117+
118+
Thanks again for your generous support!
119+
We are now receiving **7110 USD/month** (+10.5% over November) in recurring donations.
120+
This helps us cover the cost of our **[speedy](https://ci0.servo.org) [CI](https://ci1.servo.org) [and](https://ci2.servo.org) [benchmarking](https://ci3.servo.org) [servers](https://ci4.servo.org)**, one of our latest **[Outreachy interns](https://www.outreachy.org/alums/2025-06/#:~:text=Servo)**, and funding **[maintainer work]({{ '/blog/2025/09/17/your-donations-at-work-funding-jdm/' | url }})** that helps more people contribute to Servo.
121+
122+
Servo is also on [thanks.dev](https://thanks.dev), and already **30 GitHub users** (+2 over November) that depend on Servo are sponsoring us there.
123+
If you use Servo libraries like [url](https://crates.io/crates/url/reverse_dependencies), [html5ever](https://crates.io/crates/html5ever/reverse_dependencies), [selectors](https://crates.io/crates/selectors/reverse_dependencies), or [cssparser](https://crates.io/crates/cssparser/reverse_dependencies), signing up for [thanks.dev](https://thanks.dev) could be a good way for you (or your employer) to give back to the community.
124+
125+
We now have [**sponsorship tiers**]({{ '/blog/2025/11/21/sponsorship-tiers/' | url }}) that allow you or your organisation to donate to the Servo project with public acknowlegement of your support.
126+
A big thanks from Servo to our newest Bronze Sponsors: **Anthropy**, **Niclas Overby**, and **RxDB**!
127+
If you’re interested in this kind of sponsorship, please contact us at [[email protected]](mailto:[email protected]).
128+
129+
<figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex" style="height: calc(1lh + 3em); flex-flow: column nowrap; text-align: left;">
130+
<div style="position: relative; text-align: right;">
131+
<div style="position: absolute; right: calc(100% - 100% * 7110 / 10000); padding-right: 0.5em;"><strong>7110</strong> USD/month</div>
132+
<div style="position: absolute; margin-left: calc(100% * 7110 / 10000); height: calc(1lh + 1.5em); border-left: 1px solid;"></div>
133+
<div style="position: absolute; margin-left: calc(100% - 0.5em); height: calc(1lh + 1.5em); border-left: 1px solid;"></div>
134+
<div style="padding-right: 1em;"><strong>10000</strong><!-- USD/month --></div>
135+
</div>
136+
<progress value="7110" max="10000" style="transform: scale(3); transform-origin: top left; width: calc(100% / 3);"></progress>
137+
</div></figure>
138+
139+
Use of donations is decided transparently via the Technical Steering Committee’s public **[funding request process](https://github.com/servo/project/blob/main/FUNDING_REQUEST.md)**, and active proposals are tracked in [servo/project#187](https://github.com/servo/project/issues/187).
140+
For more details, head to our [Sponsorship page]({{ '/sponsorship/' | url }}).
141+
142+
## Conference talks and blogs
143+
144+
[**Web engine CI on a shoestring budget**](https://www.youtube.com/watch?v=-W1mSXdlRqA) ([slides](https://www.azabani.com/talks/2025-12-18-shoestring-web-engine-ci/); [transcript](https://blogs.igalia.com/mrego/servo-a-new-web-engine-written-in-rust/)) — Delan Azabani (@delan) spoke about the CI system that keeps our builds and tryjobs moving fast.
145+
146+
[**Servo 2025 Stats**](https://blogs.igalia.com/mrego/servo-2025-stats/) — Manuel Rego (@mrego) wrote about the growth of the Servo project, and how our many new contributors have enabled that.
147+
148+
We have two **upcoming** talks at [**FOSDEM 2026**](https://fosdem.org/2026/) in **Brussels** later this month:
149+
150+
[**The Servo project and its impact on the web platform ecosystem**](https://fosdem.org/2026/schedule/event/LXFKS9-servo-project-impact/) — Manuel Rego (@mrego) is speaking on **Saturday 31 January** at [**14:00 local time**](https://everytimezone.com/?t=697d4600,8ac) (13:00 UTC), about Servo’s impact on spec issues, interop bugs, test cases, and the broader web platform ecosystem.
151+
152+
[**Implementing Streams Spec in Servo web engine**](https://fosdem.org/2026/schedule/event/3J8GUD-servo-streams-reimplementation/) — Taym Haddadi (@Taym95) is speaking on **Saturday 31 January** at [**17:45 local time**](https://everytimezone.com/?t=697d4600,98d) (16:45 UTC), about our experiences writing a new implementation of the [Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Streams_API) that is independent of the one in SpiderMonkey.
153+
154+
<style>
155+
._correction {
156+
max-width: 33em;
157+
margin: 1em auto;
158+
border-bottom: 1px solid;
159+
padding-bottom: 1em;
160+
}
161+
._note {
162+
margin: 1em 1em;
163+
border-left: 1px solid;
164+
padding-left: 1em;
165+
opacity: 0.75;
166+
}
167+
</style>
168+
169+
<script>
170+
(function makeVideoPlayersClickable() {
171+
addEventListener("toggle", event => {
172+
const details = event.target.closest("details");
173+
if (!details?.open) {
174+
return;
175+
}
176+
const video = details.querySelector("video");
177+
if (!video) {
178+
return;
179+
}
180+
if (video.fastSeek) {
181+
video.fastSeek(0);
182+
} else {
183+
video.currentTime = 0;
184+
}
185+
video.play();
186+
}, true);
187+
})();
188+
</script>
122 KB
Loading

assets/img/blog/2026-01-diffie.png

443 KB
Loading

0 commit comments

Comments
 (0)