O compartilhamento de um módulo WebAssembly entre ambientes do mesmo site será restrito apenas à mesma origem.
O compartilhamento de um módulo WebAssembly (Wasm) entre ambientes do mesmo site, mas de origens diferentes será descontinuado para permitir que os clusters de agentes sejam limitados a origens de longo prazo. Os desenvolvedores que usam módulos Wasm dessa maneira precisam instanciar esses módulos na mesma origem para continuar usando-os após o Chrome 95.
O que são módulos Wasm e como eles funcionam
Os programas do WebAssembly são organizados em módulos, que são a unidade de implantação, carregamento e compilação.
No exemplo de código a seguir, um módulo Wasm importado de
https://iframe.site.example é compartilhado com https://main.site.example usando
postMessage(). Observe que esses domínios são do mesmo site, mas de origens diferentes.
Módulo Wasm em https://iframe.site.example:
(async () => {
const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();
A partir do Chrome 95, o remetente e o destinatário precisam ser da mesma origem. No
caso acima, https://iframe.site.example precisa ser
https://main.site.example ou vice-versa.
Por que isso é necessário
O Chrome lida internamente com diferentes documentos, guias e frames em clusters de agentes com chave de site. Isso significa que os documentos do mesmo site são processados no mesmo processo (o funcionamento exato varia de acordo com o navegador). Recentemente, o Chrome começou a processá-los em unidades mais refinadas: origens. Chamamos isso de clusters de agente com origin-key. No entanto, como isso consome muitos recursos, os clusters de agente com origin-key foram aplicados apenas a sites limitados de forma heurística.
O plano é fazer com que todos os clusters de agente usem origin-key por padrão. Para conseguir isso, precisamos restringir os recursos que exigem clusters de origem com chave de site:
- (Somente no Chrome) Não é mais possível enviar objetos
SharedArrayBufferouWebAssembly.Memorypara outras páginas entre origens no mesmo site. Isso já está em vigor desde o Chrome 92. - Não é mais possível enviar objetos
WebAssembly.Modulepara outras páginas entre origens do mesmo site usandopostMessage(). Essa mudança é explicada em mais detalhes abaixo. - Não é mais possível definir
document.domain. Esse é um recurso legado que normalmente permite que páginas entre origens do mesmo site acessem de forma síncrona o DOM umas das outras, mas em clusters de agente com origin-key, ele está desativado.
Ao abordar todas as mudanças acima, o Chrome vai passar a usar clusters de agente com origin-key por padrão.
Para saber mais sobre clusters de agente com origin-key, consulte Como solicitar isolamento de desempenho com o cabeçalho Origin-Agent-Cluster.
Próximas etapas e recursos
Para que o Chrome funcione com clusters de agente com origin-key por padrão, vamos
tornar document.domain somente leitura. A equipe do Chrome pretende implementar essa mudança
em algum momento de 2022.
- Explicação sobre clusters de agente com origin-key
- Isolamento por padrão
- Descontinuação de
document.domain
Foto de Markus Winkler no Unsplash