การแชร์โมดูล WebAssembly ระหว่างสภาพแวดล้อมของเว็บไซต์เดียวกันจะถูกจำกัดให้อยู่ในต้นทางเดียวกันเท่านั้น
ระบบจะเลิกใช้งานการแชร์โมดูล WebAssembly (Wasm) ระหว่างสภาพแวดล้อมแบบเว็บไซต์เดียวกันแต่ข้ามต้นทางเพื่ออนุญาตให้กำหนดขอบเขตคลัสเตอร์ Agent ไปยังต้นทางในระยะยาว นักพัฒนาซอฟต์แวร์ที่ใช้โมดูล Wasm ในลักษณะนี้ต้องตรวจสอบว่าได้สร้างอินสแตนซ์ของโมดูลเหล่านั้นที่ต้นทางเดียวกันเพื่อให้ใช้โมดูลเหล่านั้นต่อไปได้หลังจาก Chrome 95
โมดูล Wasm คืออะไรและทำงานอย่างไร
โปรแกรม WebAssembly จะแบ่งออกเป็นโมดูลต่างๆ ซึ่งเป็นหน่วยของการติดตั้งใช้งาน การโหลด และการคอมไพล์
ในโค้ดตัวอย่างต่อไปนี้ โมดูล Wasm ที่นำเข้าจาก
https://iframe.site.example
จะแชร์กับ https://main.site.example
ผ่าน
postMessage()
โปรดทราบว่าโดเมนเหล่านี้เป็นแบบเว็บไซต์เดียวกันแต่ข้ามต้นทาง
โมดูล Wasm เมื่อ https://iframe.site.example
:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
โดยตั้งแต่ Chrome 95 เป็นต้นไป ผู้ส่งและผู้รับต้องมาจากต้นทางเดียวกัน ในกรณีข้างต้น https://iframe.site.example
ต้องเป็น https://main.site.example
หรือในทางกลับกัน
เหตุใดจึงต้องอนุญาต
Chrome ได้จัดการเอกสาร แท็บ และเฟรมต่างๆ ภายในคลัสเตอร์ Agent ที่ผูกกับเว็บไซต์ ซึ่งหมายความว่าเอกสารในเว็บไซต์เดียวกันจะได้รับการจัดการภายในกระบวนการเดียวกัน (ลักษณะการทำงานนี้จะแตกต่างกันไปในแต่ละเบราว์เซอร์) เมื่อเร็วๆ นี้ Chrome เริ่มจัดการโดยใช้ หน่วยย่อยที่ละเอียดยิ่งขึ้น ซึ่งก็คือต้นทาง เราเรียกว่าคลัสเตอร์ Agent ที่ผูกกับต้นทาง อย่างไรก็ตาม เนื่องจากการดำเนินการนี้ทำให้ทรัพยากรมีราคาแพง ระบบจึงนำคลัสเตอร์ Agent ที่ผูกกับต้นทางไปใช้กับเว็บไซต์แบบจำกัดเท่านั้น
แผนคือการทำให้คลัสเตอร์ Agent ทั้งหมดผูกกับต้นทางโดยค่าเริ่มต้น เพื่อให้บรรลุเป้าหมายนี้ เราต้องจำกัดความสามารถที่ต้องใช้คลัสเตอร์ต้นทางที่ผูกกับเว็บไซต์ ดังนี้
- (สำหรับ Chrome เท่านั้น) คุณจะส่งออบเจ็กต์
SharedArrayBuffer
หรือWebAssembly.Memory
ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันไม่ได้อีกต่อไป แต่มีให้ใช้งานแล้วตั้งแต่ Chrome 92 - คุณจะส่งออบเจ็กต์
WebAssembly.Module
ไปยังหน้าข้ามต้นทางในเว็บไซต์เดียวกันผ่านpostMessage()
ไม่ได้อีกต่อไป การเปลี่ยนแปลงนี้ จะอธิบายรายละเอียดเพิ่มเติมด้านล่าง.. - คุณจะตั้งค่า
document.domain
ไม่ได้อีกต่อไป นี่เป็นฟีเจอร์เดิมที่ปกติแล้วจะอนุญาตให้หน้าแบบข้ามต้นทางในเว็บไซต์เดียวกันเข้าถึง DOM ของกันและกันได้พร้อมกัน แต่ในคลัสเตอร์ Agent ที่ผูกกับต้นทาง จะมีการปิดใช้
เมื่อแก้ไขการเปลี่ยนแปลงข้างต้นทั้งหมดแล้ว Chrome จะเปลี่ยนไปใช้คลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้น
ดูข้อมูลเพิ่มเติมเกี่ยวกับคลัสเตอร์ Agent ที่ผูกกับต้นทางได้ในการส่งคำขอการแยกประสิทธิภาพด้วยส่วนหัว Origin-Agent-Cluster
ขั้นตอนถัดไปและทรัพยากร
เรากำหนดให้ document.domain
เป็นแบบอ่านอย่างเดียวเพื่อให้ Chrome ทำงานกับคลัสเตอร์ Agent ที่ผูกกับต้นทางโดยค่าเริ่มต้นได้ ทีม Chrome ตั้งเป้าที่จะทำการเปลี่ยนแปลงนี้ในปี 2022
รูปภาพโดย Markus Winkler ใน Unsplash