Servo 0.4.0 发布说明

Servo 0.4.0 发布说明

Servo 0.4.0 引入了重要的 Web 平台功能更新,包括媒体查询、SharedWorker,以及改进的真实网站兼容性,同时伴随关键的安全修复和性能优化。

Servo 0.4.0 发布说明

Servo 0.4.0 是一次重大更新,包含 558 次提交,重点在于扩展 Web 平台兼容性、增强安全性以及优化引擎的性能和内存占用。

Web 平台和 DOM API 增强

Servo 0.4.0 大幅扩展了对 CSS 和 DOM API 的支持,以提升网页的渲染和交互性。

CSS 与媒体查询支持

新特性包括实现 attr() 函数(实验模式)、image(<color>),以及在 calc() 中可在解析后求值的更新数学表达式。本次发布为以下媒体查询提供了全面支持:

  • device-widthdevice-height(包括 min- 和 max- 变体)
  • heightaspect-ratio(包括 min- 和 max- 变体)
  • orientation
  • pointerany-pointer
  • hoverany-hover

此外,@font-face 中现在支持 font-feature-settings

新的 DOM API

已落地的多个关键 DOM API 可提升应用功能:

  • 并发性: 实现了 SharedWorker
  • 开发者工具: 新增 console.dir()
  • 自定义元素:DocumentShadowRoot 上的 customElementRegistry,包括 initialize() 以及能够实例化 new CustomElementRegistry()
  • 流式:RequestResponseBlob 上的 textStream()
  • 指针事件:Element 上的 setPointerCapture()releasePointerCapture()hasPointerCapture()
  • 触摸事件:Element 上的 ontouchstartontouchendontouchmoveontouchcancel
  • 加密: crypto.subtle.digest() 用于 KT128/KT256,crypto.subtle.getPublicKey() 用于 ML-KEM/ML-DSA。

实际兼容性与渲染

针对多个高流量站点的布局正确性已得到提升,尤其是对可变字体的更好处理。

  • Lichess.org: 布局正确性有显著提升。
  • Zulip 和 Speedtest.net: 由于可变字体的改进,可读性提升。
  • Google Photos 和 Cash Converters: 已确认在 0.4.0 版本中可正常工作。
  • Google Maps 和 OpenStreetMap: 渲染良好,但仍存在一些交互性问题。

安全更新

Servo 0.4.0 通过运行时更新和实现更改,修复了多项安全漏洞。

  • SpiderMonkey 更新: JavaScript 运行时已更新至 SpiderMonkey 140.11.0 和 140.12.0,修复了包括 CVE-2026-8388、CVE-2026-8391、CVE-2026-8974、CVE-2026-8975 在内的多个安全漏洞(MFSA 2026-48 与 MFSA 2026-58)。
  • 加密强化: SubtleCrypto 中的 RSA 操作现使用常数时间模指数运算。ML-DSA 操作的 Decompose 步骤也改为常数时间,修复了 RUSTSEC-2025-0144。
  • XSS 修复: 已解决 file:/// 目录列表中,文件名包含 </script> 时的 HTML 注入漏洞。

性能与稳定性优化

内存与功耗效率

  • 内存占用: BoxFragment 体积已缩小 17%(在 amd64 上从 288 字节降至 240 字节),ShapeCacheEntry 的大小也有所减少。
  • 功耗: 2D 画布的功耗最高降低 23%。
  • 资源管理: 图像解码和图像缓存填充现已异步执行,降低了脚本线程的负载。

引擎稳定性

  • 模糊测试: 通过 6 月的模糊测试,修复了 16 起崩溃错误,涉及 <iframe><slot>clip-path 以及 DOM 树等领域。
  • 内存泄漏: 已解决与页面重新加载和 2D 画布相关的内存泄漏问题。

技术架构与未来工作

垃圾回收(GC)安全性

Servo 正在通过利用 Rust 类型系统防止 GC 期间的动态借用失败,向更安全的 SpiderMonkey 集成迁移。引入 NoGC 标记值和 safe_borrow_mut() 方法,使引擎能够证明在特定操作期间不会发生 GC,这也通过避免不必要的 JavaScript 对象根化实现了性能优化。此举使布局过程和 HTMLCollection 的开销降低了超过 1%。

嵌入与 API 进展

  • C API 包装器: 为解决缺乏稳定的 Rust ABI,Servo 已开始设计包装 C API。这将使 Servo 能够通过稳定的 C ABI 作为预构建的共享库使用,并可在其上构建 Rust 包装器以提升易用性。
  • WebGPU: 改进包括实现 copyExternalImageToTexture()createQuerySet()resolveQuerySet(),以及更好的安全上下文强制。
  • 文本选择: 已开始实现可见且交互式的文本选择功能。

用户与开发者体验

Servoshell 更新

  • Android: 现在要求 Android 13+,并已现代化为使用 Compose UI 和 Kotlin。
  • 桌面: 新增拖拽打开文件、水平标签栏滚动以及在多显示器下改进的全屏行为。
  • 通用: localhost:<port> 现在在地址栏和命令行中会自动视为 http://

开发者工具改进

使用 Firefox 开发者工具时,Servo 现在能够在 Console 选项卡中正确报告未捕获的异常,并允许在 Console 和 Debugger 选项卡中检查嵌套数组和 Map 对象。Scopes 面板现在会显示全局作用域、this 的值以及 (uninitialized) 变量。

Sources