July in Servo: more platforms, faster canvas, web fonts in SVG, and more

July in Servo: more platforms, faster canvas, web fonts in SVG, and more

July in Servo: more platforms, faster canvas, web fonts in SVG, and more! Plus real world compat improvements on the DuckDuckGo and Gumroad websites. Posted 2026-08-31

Servo 7 月动态:更多平台支持、更快的 Canvas、SVG 中的 Web 字体等等!此外,DuckDuckGo 和 Gumroad 网站的真实世界兼容性也得到了提升。发布于 2026 年 8 月 31 日。

Servo 0.5.0 contains all of the changes we landed in July, which came out to 488 commits, and we now publish binaries for Linux aarch64 (@mukilan, #46760)! DOM text selections are now visible (@mrobinson, @SimonSapin, #46698, #46864, #46742, #46889, #46126). Interactive selection is coming soon! For security fixes, see § Security.

Servo 0.5.0 包含了我们在 7 月份合并的所有更改,共计 488 次提交。我们现在开始发布 Linux aarch64 版本的二进制文件 (@mukilan, #46760)!DOM 文本选区现在可见了 (@mrobinson, @SimonSapin, #46698, #46864, #46742, #46889, #46126)。交互式选区功能即将推出!有关安全修复,请参阅“安全”章节。

We’ve shipped several new web platform features:

  • ‘Cache-Control: stale-while-revalidate’ (@arayaryoma, #46060)
  • ‘text-decoration-thickness’ (@nicoburns, #46592)
  • ‘box-decoration-break’, for the most part (@Psychpsyo, #45492)
  • ‘@font-feature-values’, for the most part (@simonwuelker, #45308)
  • ‘font-language-override’, for the most part (@simonwuelker, #46618)
  • ‘font-variant-alternates’, for the most part (@simonwuelker, #45308)

我们发布了多项新的 Web 平台特性:

  • ‘Cache-Control: stale-while-revalidate’ (@arayaryoma, #46060)
  • ‘text-decoration-thickness’ (@nicoburns, #46592)
  • ‘box-decoration-break’(大部分功能)(@Psychpsyo, #45492)
  • ‘@font-feature-values’(大部分功能)(@simonwuelker, #45308)
  • ‘font-language-override’(大部分功能)(@simonwuelker, #46618)
  • ‘font-variant-alternates’(大部分功能)(@simonwuelker, #45308)

Plus a bunch of new DOM APIs:

  • Ed448, X448, and KMAC algorithms in SubtleCrypto (@kkoyung, #46402, #46141, #46180, #46583, #46606, #46622, #46334, #46376)
  • ‘insertHorizontalRule’, ‘insertImage’, ‘insertText’, and ‘forwardDelete’ commands in document.execCommand() (@Psychpsyo, #46608, #46597, #46538, #46838)
  • AnimationEffect (@simonwuelker, #46677)
  • new Touch() (@yezhizhen, #46741)
  • duplex property on Request (@Taym95, #46858)
  • effect property on Animation (@simonwuelker, #46677)
  • getKeyframes() and setKeyframes() on KeyframeEffect (@simonwuelker, #46118)
  • id property on LargestContentfulPaint (@shubhamg13, #46828)
  • read-only CSSFontFeatureValuesRule (@simonwuelker, #46728)

此外还有一系列新的 DOM API:

  • SubtleCrypto 中的 Ed448、X448 和 KMAC 算法 (@kkoyung, #46402, #46141, #46180, #46583, #46606, #46622, #46334, #46376)
  • document.execCommand() 中的 ‘insertHorizontalRule’、‘insertImage’、‘insertText’ 和 ‘forwardDelete’ 命令 (@Psychpsyo, #46608, #46597, #46538, #46838)
  • AnimationEffect (@simonwuelker, #46677)
  • new Touch() (@yezhizhen, #46741)
  • Request 上的 duplex 属性 (@Taym95, #46858)
  • Animation 上的 effect 属性 (@simonwuelker, #46677)
  • KeyframeEffect 上的 getKeyframes() 和 setKeyframes() (@simonwuelker, #46118)
  • LargestContentfulPaint 上的 id 属性 (@shubhamg13, #46828)
  • 只读的 CSSFontFeatureValuesRule (@simonwuelker, #46728)

This is another big update, so here’s an outline: You can help! Security, Real world compat, Work in progress, Embedding API, For users and developers, More on the web platform, Performance and stability, New contributors.

这是又一次重大更新,以下是内容大纲:你可以提供帮助!安全、真实世界兼容性、开发中功能、嵌入 API、面向用户与开发者、更多 Web 平台特性、性能与稳定性、新贡献者。


You can help! (你可以提供帮助!)

If you’re working on a pull request that you think might be interesting for the next monthly update, even if you’re not 100% sure, tell us about it by following the steps below:

  • You add the monthly update label to your pull request, or comment @servo-highfive monthly update
  • Highfive posts a comment asking you some questions
  • You answer those questions in a comment containing @servo-highfive monthly update answer

如果你正在进行一个可能对下个月更新有意义的 Pull Request,即使你不确定,也可以通过以下步骤告诉我们:

  • 为你的 PR 添加 monthly update 标签,或者评论 @servo-highfive monthly update
  • Highfive 会回复评论并询问你一些问题。
  • 你在回复中回答这些问题,并包含 @servo-highfive monthly update answer

Security (安全)

Servo was potentially affected by vulnerabilities in quick-xml and crossbeam-epoch that have been fixed in Servo 0.5.0 (@atouchet, @Loirooriol, #46737, #46324). For more details, see RUSTSEC-2026-0194, RUSTSEC-2026-0195, and RUSTSEC-2026-0204.

Servo 此前可能受到 quick-xml 和 crossbeam-epoch 中漏洞的影响,这些漏洞已在 Servo 0.5.0 中修复 (@atouchet, @Loirooriol, #46737, #46324)。更多详情请参阅 RUSTSEC-2026-0194、RUSTSEC-2026-0195 和 RUSTSEC-2026-0204。

We’ve updated ANGLE from a version based on Firefox 115.x ESR (02755361e26d8) to a version based on Firefox 140.12.0 ESR (f8025617e815f), which likely includes many security fixes (@jschwe, @sagudev, #46455, mozangle#100).

我们将 ANGLE 从基于 Firefox 115.x ESR 的版本 (02755361e26d8) 更新到了基于 Firefox 140.12.0 ESR 的版本 (f8025617e815f),该版本可能包含许多安全修复 (@jschwe, @sagudev, #46455, mozangle#100)。


Real world compat (真实世界兼容性)

The duck on the DuckDuckGo (duckduckgo.com) landing page now renders in v0.5.0, after we fixed a preload bug that affected SVG images (@jdm, #46668).

在修复了一个影响 SVG 图像的预加载错误后,DuckDuckGo (duckduckgo.com) 落地页上的鸭子图标现在可以在 v0.5.0 中正常渲染了 (@jdm, #46668)。

Most of Gumroad (gumroad.com), except for the landing page, did not render at all in v0.4.0, but as of v0.5.0, pages like the Discover page or this product page render almost perfectly.

Gumroad (gumroad.com) 的大部分页面(落地页除外)在 v0.4.0 中完全无法渲染,但在 v0.5.0 中,像“发现”页面或产品页面已经可以近乎完美地渲染了。

We’re interested to hear how well your favourite websites run in Servo! Report successes in this Zulip thread, and failures in our GitHub issues.

我们很想知道你最喜欢的网站在 Servo 上的运行情况!请在 Zulip 讨论帖中报告成功案例,并在我们的 GitHub Issues 中报告失败案例。


Work in progress (开发中功能)

The upgrade to Stylo 2026-07-01 brings several changes to built-in CSS functions (@Loirooriol, #46129):

  • ‘alpha()’ is now supported, under —pref layout_css_alpha_color_function_enabled
  • ‘progress()’ is now supported, under —pref layout_css_progress_function_enabled
  • ‘ellipse()’ values ‘closest-corner’ and ‘farthest-corner’ are no longer stable due to spec uncertainty, but they are still experimental, under —pref layout_css_ellipse_corners_enabled
  • ‘attr()’ is more conformant, under —pref layout_css_attr_enabled

升级到 Stylo 2026-07-01 为内置 CSS 函数带来了多项更改 (@Loirooriol, #46129):

  • 支持 ‘alpha()’,需开启 --pref layout_css_alpha_color_function_enabled
  • 支持 ‘progress()’,需开启 --pref layout_css_progress_function_enabled
  • 由于规范的不确定性,‘ellipse()’ 的 ‘closest-corner’ 和 ‘farthest-corner’ 值不再稳定,但仍处于实验阶段,需开启 --pref layout_css_ellipse_corners_enabled
  • ‘attr()’ 更加符合规范,需开启 --pref layout_css_attr_enabled

WebGPU content can now enjoy better conformance and use GPUExternalTexture and importExternalTexture() on GPUDevice, under —pref dom_webgpu_enabled (@sagudev, #45873, #46178, #46286).

WebGPU 内容现在可以享受更好的兼容性,并可在 GPUDevice 上使用 GPUExternalTexture 和 importExternalTexture(),需开启 --pref dom_webgpu_enabled (@sagudev, #45873, #46178, #46286)。

IndexedDB content can now use the name property on IDBIndex, under —pref dom_indexeddb_enabled (@skyz1, #45512).

IndexedDB 内容现在可以在 IDBIndex 上使用 name 属性,需开启 --pref dom_indexeddb_enabled (@skyz1, #45512)。

document.fonts now includes a FontFace for each valid ‘@font-face’, under —pref dom_fontface_enabled (@simonwuelker, #46509, #46537).

document.fonts 现在包含每个有效 ‘@font-face’ 的 FontFace,需开启 --pref dom_fontface_enabled (@simonwuelker, #46509, #46537)。

All of the features above are enabled in servoshell’s experimental mode.

以上所有功能均已在 servoshell 的实验模式中启用。

We’ve started implementing WebVTT for native subtitles and captions, enabled by default (no —pref). While they don’t render just yet, we can now fetch each , parse the WebVTT, and expose cues via the track property on HTMLTrackElement (@TimvdLippe, #46289, #46383).

我们已经开始为原生字幕实现 WebVTT,默认启用(无需 —pref)。虽然目前还无法渲染,但我们现在可以获取每个 <track src>,解析 WebVTT,并通过 HTMLTrackElement 上的 track 属性公开提示信息 (@TimvdLippe, #46289, #46383)。

July was a big month for accessibility in Servo, under —pref accessibility_enabled. The focus for this month has been on performance, with the accessibility tree now supporting incremental updates (@alice, @delan, #45578, #45971, #46589, #46691, #46385), requiring fewer HashMap lookups and tree walks (@alice, @delan, #45798, #46740, #46348), and allowing for faster DOM mutations (@alice, #46348, #46530).

7 月是 Servo 无障碍功能的重要月份,需开启 --pref accessibility_enabled。本月的重点是性能,无障碍树现在支持增量更新 (@alice, @delan, #45578, #45971, #46589, #46691, #46385),减少了 HashMap 查找和树遍历 (@alice, @delan, #45798, #46740, #46348),并实现了更快的 DOM 变动 (@alice, #46348, #46530)。

We’ve also started working on the File and Directory Entries API, to allow users to select and upload entire directories via and drag-and-drop. To that end, we now have webkitGetAsEntry() on DataTransferItem, plus minimal support for FileSystemEntry, FileSystemDirectoryEntry, and FileSystemFileEntry, under —pref dom_entries_api_enabled (@yezhizhen, #46456, #46879, #46832).

我们还开始着手开发 File and Directory Entries API,以允许用户通过 <input type=file> 和拖放操作选择并上传整个目录。为此,我们现在在 DataTransferItem 上实现了 webkitGetAsEntry(),并对 FileSystemEntry、FileSystemDirectoryEntry 和 FileSystemFileEntry 提供了最小化支持,需开启 --pref dom_entries_api_enabled (@yezhizhen, #46456, #46879, #46832)。


Embedding API (嵌入 API)

We’ve improved the docs for the servo crate, and for WebViewDelegate (@mukilan, #46193).

我们改进了 servo crate 和 WebViewDelegate 的文档 (@mukilan, #46193)。

Breaking change: ServoBuilder::webxr_registry() has been removed. Instead use the new Servo::register_webxr_registry, which is a lazy design that has allowed servoshell to halve its startup time (@Narfinger, #46494).

破坏性变更:ServoBuilder::webxr_registry() 已被移除。请改用新的 Servo::register_webxr_registry,这是一种延迟加载设计,使 servoshell 的启动时间缩短了一半 (@Narfinger, #46494)。


For users and developers (面向用户与开发者)

servoshell for Android now runs on Android 10+ (91% market share), not just Android 13+ (68% market share), improving adaptability and reducing waste (@jschwe).

Android 版 servoshell 现在可以在 Android 10+(91% 市场份额)上运行,而不仅仅是 Android 13+(68% 市场份额),这提高了适应性并减少了资源浪费 (@jschwe)。