1 điểm bởi GN⁺ 3 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Servo 0.3.0 là bản phát hành gộp 391 commit được hợp nhất trong tháng 5, đồng thời đưa vào các sửa đổi cho nền tảng web, API nhúng, hiệu năng, độ ổn định và bảo mật
  • Nền tảng web được mở rộng khả năng tương thích với các trang thực tế nhờ bổ sung font-variant-*, hỗ trợ phát mp4 không có fast start, mã hóa form và thêm các DOM API
  • Về bảo mật, JS runtime được nâng lên SpiderMonkey 140.10.1 để sửa các lỗi an toàn bộ nhớ, liên quan đến CVE-2026-7322, CVE-2026-7323 và MFSA 2026-36
  • Người dùng và nhà phát triển có thể dùng các tùy chọn --host-file=, --userscripts= của servoshell và tính năng blackboxing “Ignore source” trong Firefox DevTools Debugger
  • Các embeder cần phản ánh yêu cầu Rust 1.88.0 trở lên cùng breaking change ở SiteDataManager, Preferences và DiagnosticsLogging; các cải tiến hiệu năng tập trung vào giảm số lần duyệt layout và hợp nhất thread pool

Các thay đổi trong tháng 5 có trong Servo 0.3.0

  • Servo 0.3.0 bao gồm các thay đổi đã được hợp nhất trong tháng 5, với tổng cộng 391 commit
  • Các tính năng nền tảng web mới được bổ sung trên nhiều mảng như phông chữ, media, form và tương thích layout
    • Tính năng font CSS: font-kerning: none, font-variant-east-asian, font-variant-ligatures, font-variant-numeric, font-variant-position
    • Media và form: hỗ trợ cho tệp mp4 không có fast start,, ``
    • Layout: layout ``
  • DOM API cũng được mở rộng ở nhiều phần của chuẩn
    • Thuộc tính onslotchange được thêm vào ShadowRoot
    • screenLeft, screenTop được thêm vào Window
    • new Blob() hỗ trợ {endings: "native"}
    • new PerformanceMark() được thêm vào
    • parseHTML() được thêm vào Document
    • readAsBinaryString() được thêm vào FileReader
    • performance.measure() hỗ trợ các giá trị mark redirectStart, redirectEnd, secureConnectionStart, responseEnd
  • Các vấn đề build trên Windows, FreeBSD, NixOS hoặc môi trường dựa trên Nix cũng đã được sửa

Bảo mật: sửa lỗi an toàn bộ nhớ trong SpiderMonkey

  • SpiderMonkey 140.10.0, JS runtime của Servo, có nhiều lỗi an toàn bộ nhớ
  • Servo 0.3.0 khắc phục các vấn đề này bằng cách cập nhật lên SpiderMonkey 140.10.1
  • Có thể xem chi tiết tại CVE-2026-7322, CVE-2026-7323, MFSA 2026-36

Các tính năng web đang được phát triển

  • Việc triển khai document.execCommand() vẫn đang tiếp tục để hỗ trợ chỉnh sửa rich text, và hoạt động dưới --pref dom_exec_command_enabled
    • Bản phát hành này hỗ trợ các lệnh backColor, foreColor, createLink, unlink, superscript, subscript, removeFormat
    • Lệnh insertParagraph được hỗ trợ một phần
  • Công việc với Sanitizer API tiếp tục dưới --pref dom_sanitizer_enabled
    • Được bật trong chế độ thử nghiệm của servoshell
    • Đã thêm Sanitizer với setComments(), setDataAttributes(), allowProcessingInstruction(), removeProcessingInstruction(), removeUnsafe()
  • IndexedDB đang tiếp tục được cải thiện dưới --pref dom_indexeddb_enabled, với mức độ tuân thủ chuẩn cao hơn cho IDBTransaction.abort()
  • Các tính năng trên được bật trong chế độ thử nghiệm của servoshell
  • Hỗ trợ accessibility bao gồm thay đổi cho thuật toán name from contents và việc xây dựng cây accessibility theo kiểu tăng dần
    • Việc xây dựng cây accessibility tăng dần rất quan trọng với hiệu năng trên nội dung web thực tế
  • Việc triển khai liên quan đến worker cũng đã bắt đầu
    • SharedWorker hỗ trợ new SharedWorker() dưới --pref dom_sharedworker_enabled
    • ServiceWorker được bổ sung một phần API dưới --pref dom_serviceworker_enabled

Thay đổi API nhúng và các điểm cần migrate

  • Phiên bản Rust tối thiểu được hỗ trợ của Servo, MSRV, đã tăng từ 1.86.0 lên 1.88.0 trở lên
    • Việc kiểm thử compile được thực hiện với MSRV, nhưng phần lớn test chạy trên Rust 1.95.0
  • Các phương thức cookie của SiteDataManager có breaking change
    • clear_cookies, clear_session_cookies, set_cookie_for_url nay nhận thêm đối số callback, cho phép gọi bất đồng bộ
    • Nếu muốn giữ cách gọi đồng bộ, hãy truyền None cho callback
    • set_cookie_for_url_async đã bị loại bỏ và cần được thay bằng dạng set_cookie_for_url(Some(Box::new(callback)))
  • API Preferences được dọn lại tên cấu hình thread pool
  • API DiagnosticsLogging cũng được làm lại
    • Thiết lập tùy chọn bằng toggle_option và kiểm tra trạng thái kích hoạt bằng is_enabled
    • Mỗi tùy chọn là một variant của kiểu mới DiagnosticsLoggingOption
    • Các trường pub theo từng tùy chọn của DiagnosticsLogging đã bị loại bỏ; việc ghi và đọc trường cần đổi lần lượt sang toggle_option, is_enabled
    • extend_from_string không còn nhận tùy chọn help, và phần triển khai tương ứng đã được chuyển sang servoshell

Tính năng cho người dùng và nhà phát triển

  • servoshell được thêm 2 tùy chọn mới
    • --host-file= dùng để chỉ định đường dẫn hosts file, là lựa chọn thay thế cho biến môi trường HOST_FILE
    • --userscripts= dùng để chỉ định thư mục user scripts sẽ chạy trên mọi tài liệu
  • Nay đã có thể blackbox script trong tab Firefox DevTools Debugger
    • Khi nhấp “Ignore source”, breakpoint sẽ không dừng bên trong script đó
    • Khi step qua trong debugger, việc thực thi cũng không nên dừng bên trong script đó
    • Độ chính xác của bảng Scopes cũng được cải thiện
  • Theo chính sách dự án, các nhà phát triển Servo không được dùng đầu ra từ mô hình ngôn ngữ lớn hoặc công cụ AI tạo sinh để đóng góp mã
    • Để cưỡng chế điều này, đã thêm kiểm tra CI từ chối các đóng góp có AI agent được ghi làm coauthor
  • Vấn đề build với --features vello cũng đã được sửa

Cải tiến chi tiết của nền tảng web

  • Cách hiển thị mặc định của nhiều phần tử HTML đã được cải thiện
    • Các đối tượng gồm , , , , , , , , , , , , ``
  • CryptoKey nay có thể serialize, cho phép dùng với structuredClone()postMessage()
  • Thông báo lỗi JS ở nhiều phần của DOM đã được cải thiện
  • Các cải tiến về tuân thủ chuẩn bao gồm những mảng sau
    • gửi form, điều hướng tab, điều hướng URL javascript:
    • header Refresh và ``
    • line-break: anywhere, Location.assign()
    • crypto.subtle.deriveBits(), getComputedStyle(), performance.measure()
    • FileReader.readAsDataURL(), Blob.stream()
    • ML-KEM của SubtleCrypto
  • Ở phía WebGPU, các thành phần như GPUSupportedLimits, GPUTexture, GPUDevice.createBindGroup() và các tính năng WebGPU khác đã được cải thiện
  • Các sửa lỗi bao gồm `` và Content-Security-Policy, :active, :hover, align-items, border-image-outset, overflow: scroll của padding, sự kiện pointerup, sự kiện slotchange, import() động, CanvasRenderingContext2D.clip() và hơn thế nữa

Cải thiện hiệu năng: giảm số lần duyệt layout và xử lý trì hoãn

  • Một công cụ đã được tạo ra để tìm các allocation không được theo dõi, nhằm cải thiện about:memory
  • Thread pool của image cache, web storage và IndexedDB được hợp nhất, giúp giảm số lượng OS thread cần thiết trên mỗi CPU
  • Tối ưu layout tập trung vào việc giảm chi phí duyệt fragment tree và caching
    • fragment tree giờ phần lớn là bất biến, loại bỏ chi phí runtime của việc borrow AtomicRefCell trong nhiều trường hợp truy cập
    • việc tính containing block và xây dựng stacking context tree được hợp nhất thành một lần duyệt fragment tree duy nhất trong hầu hết trường hợp
    • việc tính scrollable overflow được chuyển sang kiểu lazy và incremental, gần như loại bỏ hoàn toàn việc phải duyệt toàn bộ fragment tree
    • caching giữa các lần reflow cho fragment, kết quả shaping và các kết quả layout khác đã được cải thiện
    • độ chính xác của incremental fragment layout được nâng cao
    • mức dùng bộ nhớ của text shaping được giảm xuống
  • Xử lý DOM attributes cũng hiệu quả hơn
    • Khi script ghi giá trị thuộc tính, hệ thống tránh serialize lại cho đến khi có lần đọc tiếp theo, giúp các lần ghi inline style thường xuyên nhanh hơn tối đa 25%
    • Khi parse HTML hoặc đọc thuộc tính nội bộ, hệ thống tránh tạo node Attr cho đến khi script thực sự cần, giúp giảm dùng bộ nhớ và khả năng phát sinh garbage collection
  • Hành vi từng duyệt toàn bộ DOM tree mỗi khi được gắn vào tree đã bị loại bỏ, nên sẽ thấy rõ khi parse tài liệu có nhiều thẻ
  • Khóa stylesheet dùng AtomicRefCell hiệu quả hơn parking_lot::RwLock
  • Trên OpenHarmony, refresh driver thực thụ đã được thêm vào, giúp giảm CPU idle, đồng thời danh sách font được cache xuống đĩa để tăng tốc khởi động
  • Để cải thiện thời gian build, nhiều mã hơn đã được tách khỏi script crate khổng lồ và kích thước dependency tree cũng được thu gọn

Sửa lỗi ổn định và tận dụng hệ thống kiểu

  • Nhiều crash và hang đã được sửa
    • content, MediaStream, Element.attributes.item(), CSSKeyframesRule.appendRule(), FocusEvent.initEvent(), Window.stop()
    • document.execCommand("delete")
    • build --debug-mozjs
    • đánh giá script khi đang tạm dừng trong DevTools
    • xem trước một số giá trị JS trong DevTools
    • shaping zero-width space trong layout
    • trường hợp bật/tắt chế độ thử nghiệm của servoshell lúc runtime
  • Công việc dài hạn nhằm dùng hệ thống kiểu của Rust để khiến một số lỗi dynamic borrow nhất định trở nên bất khả thi vẫn đang tiếp tục

Tình hình cộng tác viên và tài trợ

  • Có 9 người đã merge bản vá đầu tiên vào Servo
    • AbdAlRahman Gad, Onyeka Obi, Steve Sharon Sam, avis137, Xabier Rodríguez, June, Matt Van Horn, nicole, panxt8
  • Danh sách issue phù hợp cho người đóng góp mới được cung cấp tại curated list
  • Tài trợ định kỳ đạt 7.659 USD mỗi tháng, tăng 4,2% so với tháng 4
    • Khoản tài trợ này được dùng cho máy chủ CI và benchmarking, thực tập sinh Outreachy, và hỗ trợ công việc của maintainer
  • Trên thanks.dev, hiện có 35 người dùng GitHub phụ thuộc vào Servo đang tài trợ, tăng 2 người so với tháng 4
  • Việc sử dụng nguồn tài trợ được quyết định thông qua funding request process công khai của Technical Steering Committee, và các đề xuất đang hoạt động được theo dõi tại servo/project#187

1 bình luận

 
Ý kiến trên Lobste.rs
  • Thật vui vì lobste.rs hoạt động gần như hoàn hảo trên Servo
    Những điểm đáng chú ý chỉ là các liên kết in đậm không hiển thị đậm, phông chữ hơi lạ (cảm giác giống Fira Sans), các ô nhập trên trang đăng nhập quá mảnh, và khi nhấp vào ô văn bản này thì con trỏ được đặt ở vị trí khác với chỗ đã nhấp
    Trong phần bình luận có nói JavaScript engine giống Firefox, nên nhìn chung có vẻ hoạt động đúng như kỳ vọng
    Sửa: bật thiết lập thử nghiệm thì vấn đề chữ đậm đã được giải quyết
  • Servo đã được phát triển nhiều năm rồi, rốt cuộc ban đầu nó có ý nghĩa gì?
    • Servo là một dự án thử nghiệm do Mozilla khởi xướng nhằm tạo ra một trình duyệt mới bằng Rust
      Một trong những mục tiêu chính là Microsoft HoloLens, nhưng cuối cùng dự án lớn này đã bị dừng, và một số thành phần đã được đưa vào Firefox
      Ví dụ, CSS engine là một trong số đó, vì đặc tính đa luồng khiến việc viết bằng C++ trở nên khó khăn
      Sau đó Igalia tiếp quản, trở thành đơn vị quản lý mới, và đang cố hồi sinh dự án để biến nó thành một đối thủ cạnh tranh mới
      JavaScript engine giống với Firefox
    • Dự án bắt đầu từ năm 2012, nhưng theo tôi biết thì việc phát triển đã đình trệ trong vài năm và chỉ mới được nối lại với tốc độ nhanh gần đây
      Mục đích là có một lựa chọn thay thế cho các engine trình duyệt lớn, đặc biệt là tạo thêm cạnh tranh cho Blink, engine của Chrome
    • Việc triển khai engine trình duyệt bằng ngôn ngữ an toàn bộ nhớ, vốn có thể tận dụng dễ dàng hơn tính song song và đồng thời mà phần cứng hiện nay hỗ trợ, vẫn là một lợi thế lớn giống như khi dự án mới bắt đầu
      Việc có một triển khai nền tảng web riêng, thoát khỏi ảnh hưởng của các tập đoàn công nghệ khổng lồ, cũng rất quan trọng
      Google hiện có quá nhiều quyền lực, còn Mozilla trong nhiều năm qua đã thể hiện gần như tệ nhất có thể
      Vì vậy ít nhất thì tôi vẫn tài trợ vài đô la mỗi tháng