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

O compartilhamento de um módulo do WebAssembly entre ambientes do mesmo site será restrito apenas à mesma origem.

O compartilhamento de um módulo WebAssembly (Wasm) entre ambientes com o mesmo site, mas com origem cruzada, será descontinuado para permitir que os clusters de agente tenham escopo para origens de longo prazo. Os desenvolvedores que usam módulos Wasm dessa forma precisam instanciar esses módulos na mesma origem para continuar usando 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 código de exemplo abaixo, um módulo Wasm importado de https://iframe.site.example é compartilhado com https://main.site.example via 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 vem lidando internamente com diferentes documentos, guias e frames em clusters de agente com site-key. 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 ou WebAssembly.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 de origem cruzada no mesmo site via postMessage(). 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 agente com origin-key por padrão, vamos tornar document.domain somente leitura. A equipe do Chrome pretende lançar essa mudança em algum momento de 2022.

Foto de Markus Winkler no Unsplash (em inglês)