El uso compartido de un módulo de WebAssembly entre entornos del mismo sitio se restringirá solo al mismo origen.
El uso compartido de un módulo de WebAssembly (Wasm) entre entornos de mismo sitio, pero de origen cruzado dejará de estar disponible para permitir que los clústeres de agentes se asignen a orígenes a largo plazo. Los desarrolladores que usan módulos de Wasm de esa manera deben asegurarse de crear una instancia de esos módulos en el mismo origen para continuar 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, se comparte un módulo Wasm importado desde https://iframe.site.example
con https://main.site.example
a través de postMessage()
. Observa que estos dominios son del mismo sitio, pero de origen diferente.
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 destinatario deben tener el mismo origen. En el caso anterior, https://iframe.site.example
debe ser https://main.site.example
o viceversa.
Por qué es necesario
Chrome controlaba de forma interna diferentes documentos, pestañas y marcos en clústeres de agentes con claves de sitios. Esto significa que los documentos del mismo sitio se controlan dentro del mismo proceso (el funcionamiento exacto varía según el navegador). Recientemente, Chrome comenzó a manejarlos en unidades más detalladas: orígenes. Lo llamamos agrupamientos de agentes con clave de origen. Sin embargo, como hacerlo es costoso en términos de recursos, los clústeres de agentes con clave de origen solo se aplicaron de forma heurística a sitios web limitados.
El plan es hacer que todos los clústeres de agentes tengan clave de origen de forma predeterminada. Para lograr esto, debemos restringir las capacidades que requieren clústeres de origen con claves de sitios:
- (Solo para Chrome) Ya no puedes enviar objetos
SharedArrayBuffer
niWebAssembly.Memory
a otras páginas de origen cruzado en el mismo sitio. Esta opción ya está implementada desde Chrome 92. - Ya no puedes enviar objetos
WebAssembly.Module
a otras páginas de origen cruzado en el mismo sitio a través depostMessage()
. Este cambio se explica con más detalle a continuación. - Ya no puedes configurar
document.domain
. Esta es una función heredada que, por lo general, permite que las páginas de origen cruzado en el mismo sitio accedan de forma síncrona al DOM de cada una, pero en los clústeres de agentes con clave de origen, está inhabilitada.
Si abordas todos los cambios anteriores, Chrome comenzará a usar clústeres de agentes con clave de origen de forma predeterminada.
Para obtener más información sobre los clústeres de agentes con clave de origen, consulta Cómo solicitar 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 busca 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
document.domain
dejará de estar disponible
Foto de Markus Winkler en Unsplash