Hạn chế chia sẻ mô-đun wasm theo cùng nguồn gốc

Việc chia sẻ mô-đun WebAssembly giữa các môi trường cùng trang web sẽ bị hạn chế chỉ ở cùng nguồn gốc.

Việc chia sẻ một mô-đun WebAssembly (wasm) giữa các môi trường cùng trang web nhưng nhiều nguồn gốc sẽ là không dùng nữa để cho phép các cụm tác nhân để sử dụng trong phạm vi nguồn gốc về lâu dài. Nhà phát triển đang sử dụng các mô-đun Wasm ở những khu vực như thì phải đảm bảo tạo thực thể cho các mô-đun đó tại cùng nguồn gốc để tiếp tục bằng cách sử dụng chúng sau Chrome 95.

Mô-đun Wasm là gì và cách thức hoạt động

Các chương trình WebAssembly được sắp xếp thành các mô-đun, là đơn vị triển khai, tải và biên dịch.

Trong mã ví dụ sau, một mô-đun Wasm được nhập từ https://iframe.site.example được chia sẻ với https://main.site.example qua postMessage(). Xin lưu ý rằng các miền này cùng trang web nhưng có nhiều nguồn gốc.

Mô-đun Wasm trên https://iframe.site.example:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

Kể từ Chrome 95, người gửi và người nhận phải có cùng nguồn gốc. Trong trong trường hợp trên, https://iframe.site.example cần được https://main.site.example hoặc ngược lại.

Tại sao điều này cần thiết

Chrome đã và đang xử lý nội bộ nhiều tài liệu, thẻ và khung trên cụm tác nhân được khoá theo trang web. Điều này có nghĩa là các tài liệu trên cùng một trang web được xử lý trong cùng một quy trình (cách chính xác hoạt động của quy trình này sẽ khác nhau tuỳ theo trình duyệt). Gần đây, Chrome đã bắt đầu xử lý chúng ở các đơn vị chi tiết hơn: nguồn gốc. Chúng tôi gọi đó là cụm tác nhân theo khoá nguồn gốc. Tuy nhiên, vì làm như vậy sẽ tốn kém tài nguyên, Các cụm tác nhân theo khoá nguồn gốc chỉ được áp dụng theo suy nghiệm cho một số trang web.

Theo mặc định, tất cả các cụm tác nhân đều dùng khoá gốc. Để để đạt được điều này, chúng tôi cần hạn chế những khả năng yêu cầu mã khoá trang web cụm gốc:

  • (Chỉ dành cho Chrome) Bạn không thể gửi nữa SharedArrayBuffer hoặc WebAssembly.Memory sang các trang khác có cùng nguồn gốc và có cùng trang web. Thay đổi này đã được triển khai kể từ Chrome 92.
  • Bạn không thể gửi nữa WebAssembly.Module sang các trang khác có cùng nguồn gốc và có cùng trang web thông qua postMessage(). Sự thay đổi này được giải thích chi tiết hơn bên dưới.
  • Bạn không thể đặt nữa document.domain. Đây là một tính năng cũ thường cho phép các trang có nguồn gốc khác của cùng một trang web truy cập đồng bộ vào DOM của nhau, nhưng trong các cụm tác nhân theo khoá nguồn gốc, đã bị tắt.

Bằng việc giải quyết tất cả thay đổi nêu trên, Chrome sẽ chuyển sang sử dụng tác nhân theo khoá nguồn gốc cụm theo mặc định.

Để tìm hiểu thêm về cụm tác nhân theo khoá nguồn gốc, hãy xem nội dung Yêu cầu tách biệt hiệu suất bằng tiêu đề Origin-Agent-Cluster.

Các bước tiếp theo và tài nguyên

Để Chrome hoạt động với các cụm tác nhân theo khoá nguồn gốc theo mặc định, chúng tôi sẽ đặt document.domain ở chế độ chỉ có thể đọc. Nhóm Chrome đang nỗ lực để tạo ra thay đổi này vào một thời điểm nào đó trong năm 2022.

Nhiếp ảnh gia: Markus Winkler về Không hiển thị màn hình