O compartilhamento de um módulo do WebAssembly entre ambientes do mesmo site será restrito apenas a origens iguais.
O compartilhamento de um módulo do WebAssembly (Wasm) entre ambientes no mesmo site, mas com origem cruzada será descontinuado para permitir que os clusters de agentes sejam delimitados a origens a longo prazo. Os desenvolvedores que usam módulos Wasm dessa forma precisam garantir que esses módulos sejam instanciados 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 abaixo, um módulo Wasm importado de
https://iframe.site.example
é compartilhado com https://main.site.example
por
postMessage()
. Observe que esses domínios são do mesmo site, mas de origem cruzada.
Módulo Wasm no 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 receptor precisam ter a 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 estava processando internamente documentos, guias e frames diferentes em clusters de agentes com chave de site. Isso significa que os documentos do mesmo site são processados no mesmo processo (como exatamente isso funciona varia de acordo com o navegador). Recentemente, o Chrome começou a processá-los em unidades mais detalhadas: origens. Chamamos isso de clusters de agente com origin-key. No entanto, como isso consome muitos recursos, os clusters de agentes com chave de origem foram aplicados apenas a sites limitados de forma heurística.
O plano é fazer com que todos os clusters de agentes tenham uma origin-key por padrão. Para fazer isso, precisamos restringir os recursos que exigem clusters de origem com chave de site:
- (Somente no Chrome) Não é mais possível enviar objetos
SharedArrayBuffer
ouWebAssembly.Memory
para outras páginas de origem cruzada no mesmo site. Isso já está em vigor desde o Chrome 92. - Não é mais possível enviar objetos
WebAssembly.Module
para outras páginas entre origens do mesmo site usandopostMessage()
. Essa mudança é explicada com 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 o DOM umas das outras de forma síncrona, mas em clusters de agentes com chave de origem, ele é desativado.
Ao abordar todas as mudanças acima, o Chrome vai passar a usar clusters de agentes com chave de origem por padrão.
Para saber mais sobre clusters de agentes com chave de origem, consulte Solicitar isolamento de desempenho com o cabeçalho Origin-Agent-Cluster.
Próximas etapas e recursos
Para que o Chrome funcione com clusters de agentes com chave de origem por padrão, vamos
tornar document.domain
somente leitura. A equipe do Chrome pretende lançar essa mudança
em algum momento de 2022.
- Explicação sobre clusters de agentes com chave de origem
- Isolamento por padrão
- Descontinuação do
document.domain
Foto de Markus Winkler no Unsplash (em inglês)