อัปเดต Servo ประจำเดือนพฤษภาคม: user scripts, ความเข้ากันได้กับ mp4, DevTools blackboxing และอื่น ๆ
(servo.org)- Servo 0.3.0 เป็นรีลีสที่รวม 391 คอมมิตที่ถูกรวมในเดือนพฤษภาคม และสะท้อนการแก้ไขด้านเว็บแพลตฟอร์ม, embedding API, ประสิทธิภาพ, เสถียรภาพ และความปลอดภัยไว้พร้อมกัน
- ฝั่งเว็บแพลตฟอร์มได้ขยายความเข้ากันได้กับเว็บไซต์จริงผ่าน
font-variant-*, การเล่น mp4 ที่ไม่มี fast start, การเข้ารหัสฟอร์ม และการเพิ่ม DOM API - ด้านความปลอดภัย มีการอัปเกรด JS runtime เป็น SpiderMonkey 140.10.1 เพื่อแก้บั๊กด้าน memory safety และเชื่อมโยงกับ CVE-2026-7322, CVE-2026-7323 และ MFSA 2026-36
- ผู้ใช้และนักพัฒนาสามารถใช้ตัวเลือก
--host-file=และ--userscripts=ของ servoshell รวมถึงฟีเจอร์ blackboxing แบบ “Ignore source” ใน Firefox DevTools Debugger ได้ - ฝั่งผู้ฝังใช้งานต้องรองรับข้อกำหนด Rust 1.88.0 ขึ้นไป และ breaking change ของ SiteDataManager, Preferences และ DiagnosticsLogging ขณะที่การปรับปรุงประสิทธิภาพเน้นที่การลดการเดินเลย์เอาต์และการรวม thread pool
การเปลี่ยนแปลงเดือนพฤษภาคมที่รวมอยู่ใน Servo 0.3.0
- Servo 0.3.0 รวมการเปลี่ยนแปลงที่ถูกรวมในเดือนพฤษภาคม และมีทั้งหมด 391 คอมมิต
- มีการเพิ่มฟีเจอร์เว็บแพลตฟอร์มใหม่ครอบคลุมความเข้ากันได้ด้านฟอนต์, สื่อ, ฟอร์ม และเลย์เอาต์
- ฟีเจอร์ฟอนต์ของ CSS:
font-kerning: none,font-variant-east-asian,font-variant-ligatures,font-variant-numeric,font-variant-position - สื่อและฟอร์ม: รองรับ
ของไฟล์ mp4 ที่ไม่มี fast start,, `` - เลย์เอาต์: `` layout
- ฟีเจอร์ฟอนต์ของ CSS:
- DOM API ก็เพิ่มขึ้นในหลายส่วนของมาตรฐาน
- เพิ่มพร็อพเพอร์ตี
onslotchangeให้กับ ShadowRoot - เพิ่ม
screenLeft,screenTopให้กับ Window - รองรับ
{endings: "native"}ในnew Blob() - เพิ่ม
new PerformanceMark() - เพิ่ม
parseHTML()ให้กับ Document - เพิ่ม
readAsBinaryString()ให้กับ FileReader performance.measure()รองรับค่า mark ของredirectStart,redirectEnd,secureConnectionStart,responseEnd
- เพิ่มพร็อพเพอร์ตี
- มีการแก้ปัญหาการบิลด์บน Windows, FreeBSD, NixOS หรือสภาพแวดล้อมที่ใช้ Nix ด้วย
ความปลอดภัย: การแก้ไข memory safety ของ SpiderMonkey
- SpiderMonkey 140.10.0 ซึ่งเป็น JS runtime ของ Servo มีบั๊กด้าน memory safety หลายรายการ
- Servo 0.3.0 แก้ปัญหาเหล่านี้ผ่านการอัปเดตเป็น SpiderMonkey 140.10.1
- ดูรายละเอียดได้ที่ CVE-2026-7322, CVE-2026-7323, MFSA 2026-36
ฟีเจอร์เว็บที่กำลังพัฒนา
- การติดตั้งใช้งาน
document.execCommand()ยังคงเดินหน้าต่อเพื่อรองรับ การแก้ไข rich text และทำงานภายใต้--pref dom_exec_command_enabled- รีลีสนี้รองรับคำสั่ง
backColor,foreColor,createLink,unlink,superscript,subscript,removeFormat - คำสั่ง
insertParagraphรองรับบางส่วน
- รีลีสนี้รองรับคำสั่ง
- งานของ Sanitizer API ยังคงดำเนินต่อภายใต้
--pref dom_sanitizer_enabled- เปิดใช้งานในโหมดทดลองของ servoshell
- เพิ่ม
SanitizerของsetComments(),setDataAttributes(),allowProcessingInstruction(),removeProcessingInstruction(),removeUnsafe()
- IndexedDB กำลังได้รับการปรับปรุงภายใต้
--pref dom_indexeddb_enabledและมีความสอดคล้องตามมาตรฐานของIDBTransaction.abort()มากขึ้น - ฟีเจอร์ข้างต้นจะถูกเปิดใช้งานใน โหมดทดลอง ของ servoshell
- การรองรับ accessibility รวมถึงการเปลี่ยนแปลงของอัลกอริทึม name from contents และการ สร้าง accessibility tree แบบค่อยเป็นค่อยไป
- การสร้าง accessibility tree แบบค่อยเป็นค่อยไปมีความสำคัญต่อประสิทธิภาพของเว็บคอนเทนต์จริง
- การติดตั้งใช้งานที่เกี่ยวข้องกับ worker ก็เริ่มต้นขึ้นเช่นกัน
SharedWorkerรองรับnew SharedWorker()ภายใต้--pref dom_sharedworker_enabledServiceWorkerมีการเพิ่มบางส่วนของ API ภายใต้--pref dom_serviceworker_enabled
การเปลี่ยนแปลงของ embedding API และจุดที่ต้องย้ายตาม
- เวอร์ชัน Rust ต่ำสุดที่ Servo รองรับหรือ MSRV ถูกยกจาก 1.86.0 เป็น 1.88.0 ขึ้นไป
- มีการทดสอบการคอมไพล์ด้วย MSRV แต่การทดสอบส่วนใหญ่รันบน Rust 1.95.0
- เมธอดคุกกี้ของ SiteDataManager มี breaking change
clear_cookies,clear_session_cookies,set_cookie_for_urlจะรับอาร์กิวเมนต์callbackเพิ่มเติม ทำให้เรียกแบบ asynchronous ได้- หากต้องการคงการเรียกแบบ synchronous ให้ส่ง
Noneไปยังcallback set_cookie_for_url_asyncถูกลบออก และควรถูกแทนด้วยรูปแบบset_cookie_for_url(Some(Box::new(callback)))
- API ของ Preferences มีการจัดระเบียบชื่อการตั้งค่า thread pool ใหม่
threadpools_image_cache_workers_max,threadpools_indexeddb_workers_max,threadpools_webstorage_workers_maxถูกแทนด้วยthread_pool_workers_maxแบบรวมศูนย์threadpools_fallback_worker_numถูกเปลี่ยนชื่อเป็นthread_pool_fallback_workersthreadpools_async_runtime_workers_maxถูกเปลี่ยนชื่อเป็นthread_pool_async_runtime_workers_maxthreadpools_webrender_workers_maxถูกเปลี่ยนชื่อเป็นthread_pool_webrender_workers_max
- API ของ DiagnosticsLogging ก็ถูกปรับโครงใหม่เช่นกัน
- ใช้
toggle_optionเพื่อตั้งค่าออปชัน และใช้is_enabledเพื่อตรวจสอบว่าเปิดใช้งานหรือไม่ - แต่ละออปชันคือ variant ของชนิดใหม่
DiagnosticsLoggingOption - ฟิลด์
pubแยกตามออปชันของDiagnosticsLoggingถูกลบออกแล้ว และการเขียน/อ่านฟิลด์ต้องเปลี่ยนไปใช้toggle_option,is_enabledตามลำดับ extend_from_stringจะไม่รับออปชันhelpอีกต่อไป และการติดตั้งใช้งานส่วนนี้ถูกย้ายไปยัง servoshell
- ใช้
ฟีเจอร์สำหรับผู้ใช้และนักพัฒนา
- มีการเพิ่มตัวเลือกใหม่ 2 รายการใน servoshell
--host-file=ใช้กำหนดพาธของ hosts file และเป็นทางเลือกแทนตัวแปรสภาพแวดล้อมHOST_FILE--userscripts=ใช้ระบุไดเรกทอรีของ user scripts ที่จะรันในทุกเอกสาร
- ตอนนี้สามารถทำ script blackboxing ได้ในแท็บ Firefox DevTools Debugger
- เมื่อคลิก “Ignore source” จะไม่มี breakpoint ภายในสคริปต์นั้น
- เมื่อไล่รันทีละขั้นในดีบักเกอร์ ก็ควรไม่หยุดภายในสคริปต์นั้นเช่นกัน
- ความแม่นยำของแผง Scopes ก็ได้รับการปรับปรุง
- นักพัฒนา Servo เองไม่สามารถใช้ผลลัพธ์จาก large language model หรือเครื่องมือ generative AI เพื่อส่ง contribution ได้ ตามนโยบายของโครงการ
- เพื่อบังคับใช้นโยบายนี้ มีการเพิ่มการตรวจสอบใน CI ที่ปฏิเสธ contribution ที่ใส่ AI agent เป็น coauthor
- มีการแก้ปัญหาการบิลด์ของ
--features velloด้วย
การปรับปรุงรายละเอียดของเว็บแพลตฟอร์ม
- มีการปรับปรุงการแสดงผลเริ่มต้นขององค์ประกอบ HTML หลายรายการ
- เป้าหมายคือ
,,,,,,,,,,,, ``
- เป้าหมายคือ
- ตอนนี้ CryptoKey สามารถ serialize ได้ ทำให้ใช้งานได้ใน
structuredClone()และpostMessage() - มีการปรับปรุง ข้อความ error ของ JS ในหลายส่วนของ DOM
- การปรับปรุงความสอดคล้องตามมาตรฐานครอบคลุมพื้นที่ดังต่อไปนี้
- การ submit ฟอร์ม, tab navigation, การนำทางด้วย URL
javascript: - เฮดเดอร์
Refreshและ `` line-break: anywhere,Location.assign()crypto.subtle.deriveBits(),getComputedStyle(),performance.measure()FileReader.readAsDataURL(),Blob.stream()- ML-KEM ของ
SubtleCrypto
- การ submit ฟอร์ม, tab navigation, การนำทางด้วย URL
- ฝั่ง WebGPU มีการปรับปรุง
GPUSupportedLimits,GPUTexture,GPUDevice.createBindGroup()และฟีเจอร์ WebGPU อื่น ๆ - การแก้บั๊กรวมถึง ``,
Content-Security-Policy,:active,:hover,align-items,border-image-outset,paddingของoverflow: scroll, อีเวนต์pointerup, อีเวนต์slotchange,import()แบบ dynamic,CanvasRenderingContext2D.clip()และอื่น ๆ
การปรับปรุงประสิทธิภาพ: ลดการเดินเลย์เอาต์และการประมวลผลแบบหน่วง
- มีการสร้างเครื่องมือสำหรับค้นหา allocation ที่ไม่ถูกติดตาม เพื่อปรับปรุง
about:memory - มีการรวม thread pool ของ image cache, web storage และ IndexedDB ทำให้จำนวน OS thread ที่ต้องใช้ต่อ CPU ลดลง
- การเพิ่มประสิทธิภาพด้านเลย์เอาต์เน้นที่การลดค่าใช้จ่ายของการเดิน fragment tree และการแคช
- fragment tree กลายเป็น immutable เป็นส่วนใหญ่ ทำให้ในการเข้าถึงหลายกรณีไม่มีต้นทุนรันไทม์จากการ borrow ของ
AtomicRefCell - การคำนวณ containing block และการสร้าง stacking context tree ถูกรวมเป็น การเดิน fragment tree ครั้งเดียว ในกรณีส่วนใหญ่
- การคำนวณ scrollable overflow เปลี่ยนเป็นแบบ lazy และ incremental ทำให้แทบไม่ต้องเดิน fragment tree ทั้งหมดอีกต่อไป
- มีการปรับปรุงการแคช fragment, ผลลัพธ์ shaping และผลลัพธ์เลย์เอาต์อื่น ๆ ระหว่าง reflow
- ความแม่นยำของ incremental fragment layout สูงขึ้น
- การใช้หน่วยความจำของ text shaping ลดลง
- fragment tree กลายเป็น immutable เป็นส่วนใหญ่ ทำให้ในการเข้าถึงหลายกรณีไม่มีต้นทุนรันไทม์จากการ borrow ของ
- การประมวลผล DOM attributes ก็มีประสิทธิภาพขึ้นเช่นกัน
- เมื่อสคริปต์เขียนค่าแอตทริบิวต์ จะหลีกเลี่ยงการ serialize จนกว่าจะมีการอ่านกลับอีกครั้ง ทำให้การเขียน inline style บ่อย ๆ เร็วขึ้นได้สูงสุด 25%
- ระหว่างการ parse HTML หรือการอ่านแอตทริบิวต์ภายใน จะหลีกเลี่ยงการสร้างโหนด
Attrจนกว่าสคริปต์จะต้องการใช้งานจริง ลดการใช้หน่วยความจำและโอกาสเกิด garbage collection
- มีการลบพฤติกรรมที่เคยเดิน DOM tree ทั้งหมดทุกครั้งที่
ถูกแนบเข้ากับ tree ทำให้เห็นผลชัดในเอกสารที่มีแท็กจำนวนมาก - stylesheet lock เปลี่ยนไปใช้ AtomicRefCell ซึ่งมีประสิทธิภาพกว่า
parking_lot::RwLock - บน OpenHarmony มีการเพิ่ม refresh driver จริง ทำให้การใช้ CPU ขณะ idle ลดลง และมีการแคชรายชื่อฟอนต์ลงดิสก์เพื่อให้เริ่มทำงานได้เร็วขึ้น
- เพื่อปรับปรุงเวลา build มีการแยกโค้ดออกจาก script crate ขนาดใหญ่มากเพิ่มเติม และลดขนาดของ dependency tree ด้วย
การแก้ไขเสถียรภาพและการใช้ type system
- มีการแก้ไข crash และ hang หลายรายการ
content,MediaStream,Element.attributes.item(),CSSKeyframesRule.appendRule(),FocusEvent.initEvent(),Window.stop()document.execCommand("delete")- บิลด์
--debug-mozjs - การประเมินสคริปต์ระหว่าง pause ใน DevTools
- การพรีวิวค่า JS บางประเภทใน DevTools
- zero-width space shaping ใน layout
- การสลับโหมดทดลองของ servoshell ระหว่างรันไทม์
- งานระยะยาวเพื่อใช้ Rust type system ทำให้ความล้มเหลวของ dynamic borrow บางประเภทเกิดขึ้นไม่ได้ ยังคงดำเนินต่อไป
สถานะผู้ร่วมพัฒนาและการสนับสนุน
- มี 9 คนที่แพตช์แรกของตนถูก merge เข้า Servo
- AbdAlRahman Gad, Onyeka Obi, Steve Sharon Sam, avis137, Xabier Rodríguez, June, Matt Van Horn, nicole, panxt8
- รายการ issue ที่เหมาะกับผู้ร่วมพัฒนาใหม่มีให้ที่ curated list
- เงินสนับสนุนแบบรายเดือนอยู่ที่ 7,659 ดอลลาร์ต่อเดือน เพิ่มขึ้น 4.2% จากเดือนเมษายน
- เงินสนับสนุนถูกใช้กับเซิร์ฟเวอร์ CI และ benchmarking, นักศึกษาฝึกงาน Outreachy และการสนับสนุนงานของ maintainer
- บน thanks.dev มี ผู้ใช้ GitHub 35 ราย ที่พึ่งพา Servo และกำลังสนับสนุนอยู่ เพิ่มขึ้น 2 รายจากเดือนเมษายน
- การตัดสินใจใช้เงินสนับสนุนทำผ่าน funding request process แบบสาธารณะของ Technical Steering Committee และติดตามข้อเสนอที่ยัง active ได้ที่ servo/project#187
1 ความคิดเห็น
ความคิดเห็นจาก Lobste.rs
lobste.rsใช้งานบน Servo ได้เกือบสมบูรณ์แบบสิ่งที่สังเกตได้คือ ลิงก์ตัวหนาดูไม่เป็นตัวหนา ฟอนต์ดูแปลก ๆ เล็กน้อย (ให้ความรู้สึกเหมือน Fira Sans) ช่องกรอกข้อมูลในหน้าล็อกอินบางเกินไป และเมื่อคลิกฟิลด์ข้อความนี้ เคอร์เซอร์จะไปอยู่ไม่ตรงกับตำแหน่งที่คลิก
ในคอมเมนต์มีการบอกว่าเอนจิน JavaScript ใช้ตัวเดียวกับ Firefox ดังนั้นโดยรวมแล้วก็ดูเหมือนจะทำงานได้ตามที่คาดหวัง
แก้ไข: พอเปิดการตั้งค่าแบบทดลองแล้ว ปัญหา ตัวหนา ก็หายไป
หนึ่งในเป้าหมายหลักคือ Microsoft HoloLens แต่สุดท้ายโปรเจกต์ขนาดใหญ่ก็ถูกยุติลง และมีบางส่วนถูกนำเข้าไปใน Firefox
ตัวอย่างเช่น เอนจิน CSS ซึ่งเป็นหนึ่งในส่วนที่เขียนด้วย C++ ได้ยากเพราะลักษณะการทำงานแบบมัลติเธรด
หลังจากนั้น Igalia เข้ามารับช่วงต่อและกลายเป็นผู้ดูแลรายใหม่ โดยพยายามชุบชีวิตโปรเจกต์นี้ให้กลับมาเป็นคู่แข่งรายใหม่
เอนจิน JavaScript ใช้ตัวเดียวกับ Firefox
เป้าหมายคือการมีทางเลือกแทนเอนจินเบราว์เซอร์หลัก ๆ โดยเฉพาะเพื่อเพิ่มการแข่งขันให้กับ Blink ซึ่งเป็นเอนจินของ Chrome
การมีอิมพลีเมนเทชันของเว็บแพลตฟอร์มที่แยกออกจากอิทธิพลของบริษัทยักษ์ใหญ่ทางเทคโนโลยีก็สำคัญเช่นกัน
ตอนนี้ Google มีอำนาจมากเกินไป และ Mozilla ก็แสดงผลงานได้ย่ำแย่มาเป็นเวลาหลายปี
เพราะแบบนั้น อย่างน้อยฉันก็เลยสนับสนุนด้วยการบริจาคเดือนละไม่กี่ดอลลาร์