Wasm modülü paylaşımını aynı kaynakla kısıtlama

Aynı site ortamları arasında bir WebAssembly modülü paylaşımı, yalnızca aynı kaynakla sınırlandırılacaktır.

Aynı site ve kaynaklar arası ortamlar arasında WebAssembly (Wasm) modülünün paylaşımı, aracı kümelerinin uzun vadede kaynaklara dahil edilebilmesi için kullanımdan kaldırılacaktır. Wasm modüllerini bu şekilde kullanan geliştiricilerin Chrome 95'ten sonra da kullanmaya devam edebilmek için bu modülleri aynı kaynakta somutlaştırmaları gerekir.

Wasm modülleri nedir ve nasıl çalışır?

WebAssembly programları; dağıtım, yükleme ve derleme birimi olan modüller halinde düzenlenir.

Aşağıdaki örnek kodda, https://iframe.site.example kaynağından içe aktarılan Wasm modülü postMessage() üzerinden https://main.site.example ile paylaşılır. Bu alan adlarının aynı site ama çapraz kaynak olduklarına dikkat edin.

https://iframe.site.example tarihinde Wasm modülü:

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

Chrome 95 sürümünden itibaren, gönderen ve alıcı aynı kaynak olmalıdır. Yukarıdaki durumda https://iframe.site.example, https://main.site.example veya tersi olmalıdır.

Bu neden gerekli?

Chrome, site içeren veya sitelerle ilişkili aracı kümelerinde farklı dokümanları, sekmeleri ve çerçeveleri dahili olarak işliyor. Bu, aynı site dokümanlarının aynı işlem içinde işlendiği anlamına gelir (tam olarak bu işlemin nasıl çalıştığı tarayıcıya göre değişir). Kısa süre önce, Chrome bunları daha ayrıntılı birimlerle ele almaya başladı: kaynaklar. Buna kaynak içeren veya kaynaklarla ilişkili aracı kümeleri diyoruz. Ancak bu yöntem kaynak açısından pahalı olduğundan, kaynak içeren veya kaynaklarla ilişkili aracı kümeleri yalnızca sınırlı web sitelerine sezgisel olarak uygulandı.

Plan, varsayılan olarak tüm aracı kümelerini kaynak içeren veya kaynaklarla ilişkili hale getirmektir. Bunu başarmak için site içeren veya sitelerle ilişkili kaynak kümeleri gerektiren özellikleri kısıtlamamız gerekir:

  • (Yalnızca Chrome) Artık aynı sitelerin çapraz kaynak sayfalarına SharedArrayBuffer veya WebAssembly.Memory nesneleri gönderemezsiniz. Bu yöntem Chrome 92 sürümünden beri zaten kullanılmaktadır.
  • Artık postMessage() aracılığıyla aynı sitenin çapraz kaynak sayfalarına WebAssembly.Module nesneleri gönderemezsiniz. Bu değişiklik aşağıda daha ayrıntılı olarak açıklanmıştır.
  • Artık document.domain özelliğini ayarlayamazsınız. Bu, normalde aynı sitedeki çapraz kaynak sayfalarının birbirlerinin DOM'una eşzamanlı olarak erişmesine izin veren eski bir özelliktir, ancak kaynak içeren veya kaynaklarla ilişkili aracı kümelerinde bu özellik devre dışıdır.

Yukarıdaki tüm değişiklikler düzeltildiğinde Chrome varsayılan olarak kaynak içeren veya kaynaklarla ilişkili aracı kümelerini kullanacak.

Kaynak içeren veya kaynaklarla ilişkili aracı kümeleri hakkında daha fazla bilgi edinmek için Kaynak Aracısı Kümesi başlığı ile performans yalıtımı isteme başlıklı makaleye bakın.

Sonraki adımlar ve kaynaklar

Chrome'un varsayılan olarak kaynak içeren veya kaynaklarla ilişkili aracı kümeleriyle çalışması için document.domain öğesini salt okunur hale getireceğiz. Chrome ekibi bu değişikliği 2022'de gerçekleştirmeyi amaçlıyor.

Fotoğraf: Markus Winkler Unsplash'ta