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,以提升應用功能:

  • Concurrency(並行): 實作 SharedWorker
  • Developer Tools(開發者工具): 新增 console.dir()
  • Custom Elements(自訂元素):DocumentShadowRoot 上提供 customElementRegistry,包括 initialize() 以及可實例化 new CustomElementRegistry()
  • Streaming(串流):RequestResponseBlob 上提供 textStream()
  • Pointer Events(指標事件):Element 上提供 setPointerCapture()releasePointerCapture()hasPointerCapture()
  • Touch Events(觸控事件):Element 上提供 ontouchstartontouchendontouchmoveontouchcancel
  • Cryptography(加密): 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)。
  • Cryptographic Hardening(加密強化): SubtleCrypto 中的 RSA 操作現在使用恆定時間的模指數運算。ML-DSA 操作的 Decompose 步驟亦改為恆定時間,修復 RUSTSEC-2025-0144。
  • XSS 修復: 已解決 file:/// 目錄列表中,檔名含有 </script> 時的 HTML 注入漏洞。

效能與穩定性最佳化

記憶體與能源效率

  • Memory Footprint(記憶體占用): BoxFragment 現在縮小 17%(從 288 位元組減至 240 位元組於 amd64),ShapeCacheEntry 的大小也已減少。
  • Power Consumption(能源消耗): 2D 畫布現在最高可減少 23% 的功耗。
  • Resource Management(資源管理): 圖像解碼與快取填充現在以非同步方式執行,減輕腳本執行緒的負擔。

引擎穩定性

  • Fuzzing(模糊測試): 透過 6 月的模糊測試,修復了十六個崩潰錯誤,涵蓋 <iframe><slot>clip-path 與 DOM 樹等領域。
  • Memory Leaks(記憶體洩漏): 已解決與頁面重新載入及 2D 畫布相關的記憶體洩漏問題。

技術架構與未來工作

垃圾回收(GC)安全性

Servo 正在透過使用 Rust 型別系統,以防止 GC 期間的動態借用失敗,朝向與 SpiderMonkey 更安全的整合前進。引入 NoGC 標記值與 safe_borrow_mut() 方法,使引擎能證明在特定操作期間不會發生 GC,亦可避免不必要的 JavaScript 物件根植,從而提升效能。此舉已使版面流程與 HTMLCollection 的額外負擔降低超過 1%。

嵌入與 API 進度

  • C API Wrapper(C API 包裝器): 為解決缺乏穩定的 Rust ABI,Servo 已開始設計一個包裝 C API。這將允許 Servo 以穩定的 C ABI 作為預建共享函式庫使用,未來可在其上構建 Rust 包裝器以提升易用性。
  • WebGPU: 改進包括實作 copyExternalImageToTexture()createQuerySet()resolveQuerySet(),以及更完善的安全上下文強制執行。
  • Text Selection(文字選取): 已開始實作可見且可互動的文字選取功能。

使用者與開發者體驗

Servoshell 更新

  • Android: 現已要求 Android 13 以上,並已現代化以使用 Compose UI 與 Kotlin。
  • Desktop(桌面): 新增拖放開啟檔案、水平分頁列捲動,以及在多螢幕下改進的全螢幕行為。
  • General(一般): localhost:<port> 現在會自動在位置列與命令列中視為 http://

DevTools 改進

在使用 Firefox DevTools 時,Servo 現在能正確在 Console 分頁報告未捕獲的例外,並允許在 Console 與 Debugger 分頁檢視巢狀陣列與 Map 物件。Scopes 面板現在會顯示全域範圍、this 的值,以及 (uninitialized) 變數。

Sources