1 คะแนน โดย GN⁺ 3 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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
  • 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_enabled
    • ServiceWorker มีการเพิ่มบางส่วนของ 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 ใหม่
  • 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
  • ฝั่ง 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 ลดลง
  • การประมวลผล 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 ความคิดเห็น

 
GN⁺ 3 시간 전
ความคิดเห็นจาก Lobste.rs
  • ดีใจที่ lobste.rs ใช้งานบน Servo ได้เกือบสมบูรณ์แบบ
    สิ่งที่สังเกตได้คือ ลิงก์ตัวหนาดูไม่เป็นตัวหนา ฟอนต์ดูแปลก ๆ เล็กน้อย (ให้ความรู้สึกเหมือน Fira Sans) ช่องกรอกข้อมูลในหน้าล็อกอินบางเกินไป และเมื่อคลิกฟิลด์ข้อความนี้ เคอร์เซอร์จะไปอยู่ไม่ตรงกับตำแหน่งที่คลิก
    ในคอมเมนต์มีการบอกว่าเอนจิน JavaScript ใช้ตัวเดียวกับ Firefox ดังนั้นโดยรวมแล้วก็ดูเหมือนจะทำงานได้ตามที่คาดหวัง
    แก้ไข: พอเปิดการตั้งค่าแบบทดลองแล้ว ปัญหา ตัวหนา ก็หายไป
  • Servo พัฒนามาหลายปีแล้ว แล้วจริง ๆ มันมีความหมายอะไรตั้งแต่แรก?
    • Servo เป็นโปรเจกต์ทดลองที่ Mozilla เริ่มขึ้นเพื่อสร้าง เบราว์เซอร์ตัวใหม่ด้วย Rust
      หนึ่งในเป้าหมายหลักคือ Microsoft HoloLens แต่สุดท้ายโปรเจกต์ขนาดใหญ่ก็ถูกยุติลง และมีบางส่วนถูกนำเข้าไปใน Firefox
      ตัวอย่างเช่น เอนจิน CSS ซึ่งเป็นหนึ่งในส่วนที่เขียนด้วย C++ ได้ยากเพราะลักษณะการทำงานแบบมัลติเธรด
      หลังจากนั้น Igalia เข้ามารับช่วงต่อและกลายเป็นผู้ดูแลรายใหม่ โดยพยายามชุบชีวิตโปรเจกต์นี้ให้กลับมาเป็นคู่แข่งรายใหม่
      เอนจิน JavaScript ใช้ตัวเดียวกับ Firefox
    • โปรเจกต์เริ่มต้นในปี 2012 แต่เท่าที่ทราบ การพัฒนาหยุดชะงักไปหลายปี ก่อนจะกลับมาเดินหน้าอย่างรวดเร็วอีกครั้งเมื่อไม่นานนี้
      เป้าหมายคือการมีทางเลือกแทนเอนจินเบราว์เซอร์หลัก ๆ โดยเฉพาะเพื่อเพิ่มการแข่งขันให้กับ Blink ซึ่งเป็นเอนจินของ Chrome
    • การสร้างเอนจินเบราว์เซอร์ด้วย ภาษาแบบ memory-safe ที่ทำให้ใช้ประโยชน์จากความขนานและการทำงานพร้อมกันที่ฮาร์ดแวร์ปัจจุบันรองรับได้ง่ายขึ้นนั้น ยังเป็นข้อได้เปรียบสำคัญเหมือนตอนเริ่มต้นโปรเจกต์
      การมีอิมพลีเมนเทชันของเว็บแพลตฟอร์มที่แยกออกจากอิทธิพลของบริษัทยักษ์ใหญ่ทางเทคโนโลยีก็สำคัญเช่นกัน
      ตอนนี้ Google มีอำนาจมากเกินไป และ Mozilla ก็แสดงผลงานได้ย่ำแย่มาเป็นเวลาหลายปี
      เพราะแบบนั้น อย่างน้อยฉันก็เลยสนับสนุนด้วยการบริจาคเดือนละไม่กี่ดอลลาร์