Cập nhật Servo tháng 5: user scripts, tương thích mp4, blackboxing trong DevTools và hơn thế nữa
(servo.org)- 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 ``
- Tính năng font CSS:
- 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 Windownew Blob()hỗ trợ{endings: "native"}new PerformanceMark()được thêm vàoparseHTML()được thêm vào DocumentreadAsBinaryString()được thêm vào FileReaderperformance.measure()hỗ trợ các giá trị markredirectStart,redirectEnd,secureConnectionStart,responseEnd
- Thuộc tính
- 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
- Bản phát hành này hỗ trợ các lệnh
- 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
SanitizervớisetComments(),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 choIDBTransaction.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
SharedWorkerhỗ trợnew SharedWorker()dưới--pref dom_sharedworker_enabledServiceWorkerđượ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_urlnay 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
Nonechocallback set_cookie_for_url_asyncđã bị loại bỏ và cần được thay bằng dạngset_cookie_for_url(Some(Box::new(callback)))
- API Preferences được dọn lại tên cấu hình thread pool
threadpools_image_cache_workers_max,threadpools_indexeddb_workers_max,threadpools_webstorage_workers_maxđược thay bằngthread_pool_workers_maxhợp nhấtthreadpools_fallback_worker_numđược đổi tên thànhthread_pool_fallback_workersthreadpools_async_runtime_workers_maxđược đổi tên thànhthread_pool_async_runtime_workers_maxthreadpools_webrender_workers_maxđược đổi tên thànhthread_pool_webrender_workers_max
- API DiagnosticsLogging cũng được làm lại
- Thiết lập tùy chọn bằng
toggle_optionvà kiểm tra trạng thái kích hoạt bằngis_enabled - Mỗi tùy chọn là một variant của kiểu mới
DiagnosticsLoggingOption - Các trường
pubtheo từng tùy chọn củaDiagnosticsLoggingđã bị loại bỏ; việc ghi và đọc trường cần đổi lần lượt sangtoggle_option,is_enabled extend_from_stringkhông còn nhận tùy chọnhelp, và phần triển khai tương ứng đã được chuyển sang servoshell
- Thiết lập tùy chọn bằng
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ườngHOST_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 vellocũ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
,,,,,,,,,,,, ``
- Các đối tượng gồm
- CryptoKey nay có thể serialize, cho phép dùng với
structuredClone()và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
Refreshvà `` line-break: anywhere,Location.assign()crypto.subtle.deriveBits(),getComputedStyle(),performance.measure()FileReader.readAsDataURL(),Blob.stream()- ML-KEM của
SubtleCrypto
- gửi form, điều hướng tab, điều hướng URL
- Ở 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: scrollcủapadding, sự kiệnpointerup, sự kiệnslotchange,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
AtomicRefCelltrong 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
- fragment tree giờ phần lớn là bất biến, loại bỏ chi phí runtime của việc borrow
- 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
Attrcho đế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
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
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
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 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