El uso compartido de un módulo de WebAssembly entre entornos del mismo sitio se restringirá solo al mismo origen.
Se dará de baja el uso compartido de un módulo de WebAssembly (Wasm) entre entornos del mismo sitio, pero de origen cruzado para permitir que los clústeres de agentes se limiten a los orígenes a largo plazo. Los desarrolladores que usen módulos de Wasm de esa manera deben asegurarse de crear una instancia de esos módulos en el mismo origen para seguir usándolos después de Chrome 95.
Qué son los módulos de Wasm y cómo funcionan
Los programas de WebAssembly se organizan en módulos, que son la unidad de implementación, carga y compilación.
En el siguiente código de ejemplo, un módulo de Wasm importado de https://iframe.site.example se comparte con https://main.site.example a través de postMessage(). Ten en cuenta que estos dominios son del mismo sitio, pero de origen cruzado.
Módulo de Wasm en https://iframe.site.example:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
A partir de Chrome 95, el remitente y el receptor deben ser del mismo origen. En
el caso anterior, https://iframe.site.example debe ser
https://main.site.example o viceversa.
Por qué es necesario
Chrome controla de forma interna diferentes documentos, pestañas y marcos en clústeres de agentes con clave de sitio. Esto significa que los documentos del mismo sitio se controlan dentro del mismo proceso (la forma exacta en que esto funciona varía según el navegador). Recientemente, Chrome comenzó a administrarlos en unidades más detalladas: los orígenes. Los llamamos clústeres de agentes con clave de origen. Sin embargo, debido a que esto consume muchos recursos, los agrupamientos en clústeres de agentes con clave de origen se aplicaron solo a sitios web limitados de forma heurística.
El plan es hacer que todos los clústeres de agentes tengan clave de origen de forma predeterminada. Para lograrlo, debemos restringir las capacidades que requieren clústeres de origen con clave de sitio:
- (Solo para Chrome) Ya no puedes enviar objetos
SharedArrayBufferniWebAssembly.Memorya otras páginas de origen cruzado del mismo sitio. Esto ya está vigente desde Chrome 92. - Ya no puedes enviar objetos
WebAssembly.Modulea otras páginas de origen cruzado del mismo sitio a través depostMessage(). Este cambio se explica con más detalle a continuación. - Ya no puedes establecer
document.domain. Esta es una función heredada que, normalmente, permite que las páginas de origen cruzado en el mismo sitio accedan de forma síncrona al DOM de las demás, pero en los clústeres de agentes con clave de origen, está inhabilitada.
Si se abordan todos los cambios anteriores, Chrome pasará a usar clústeres de agentes con clave de origen de forma predeterminada.
Para obtener más información sobre el agrupamiento en clústeres de agentes con clave de origen, consulta Solicita aislamiento de rendimiento con el encabezado Origin-Agent-Cluster.
Pasos siguientes y recursos
Para que Chrome funcione con clústeres de agentes con clave de origen de forma predeterminada, haremos que document.domain sea de solo lectura. El equipo de Chrome tiene como objetivo implementar este cambio en algún momento de 2022.
- Explicación de los clústeres de agentes con clave de origen
- Aislamiento de forma predeterminada
- Baja de
document.domain
Foto de Markus Winkler en Unsplash