Como restringir o compartilhamento do módulo Wasm para a mesma origem

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 SharedArrayBuffer ou WebAssembly.Memory para 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.Module para outras páginas entre origens do mesmo site usando postMessage(). 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.

Foto de Markus Winkler no Unsplash