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-width和device-height(包括 min- 和 max- 变体)height和aspect-ratio(包括 min- 和 max- 变体)orientationpointer和any-pointerhover和any-hover
此外,@font-face 中现在支持 font-feature-settings。
新的 DOM API
已落地的多个关键 DOM API 可提升应用功能:
- 并发性: 实现了
SharedWorker。 - 开发者工具: 新增
console.dir()。 - 自定义元素: 在
Document和ShadowRoot上的customElementRegistry,包括initialize()以及能够实例化new CustomElementRegistry()。 - 流式: 在
Request、Response和Blob上的textStream()。 - 指针事件: 在
Element上的setPointerCapture()、releasePointerCapture()和hasPointerCapture()。 - 触摸事件: 在
Element上的ontouchstart、ontouchend、ontouchmove和ontouchcancel。 - 加密:
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) 变量。