Para os senhores que não estão familiarizados com o mundo do desenvolvimento de extensões da Web, uma tempestade está se formando no Chrome. O Google interromperá o suporte à versão 2 do manifesto, que é o que a grande maioria das extensões da Web usa. A versão 3 do manifesto apresenta muitas alterações, mas a maior delas é a mudança de scripts persistentes em segundo plano para service workers. Essa… é… uma… grande… mudança.

As alterações da versão 2 para a versão 3 do manifesto incluem:

  • Passagem de um script persistente em segundo plano para um service worker que pode morrer após 5 minutos
  • Não há uso de <iframe> ou outras APIs DOM do trabalhador do serviço
  • Todas as APIs se tornaram baseadas em promessas
  • Restrições de conteúdo da perspectiva do CSP

Uma função que as extensões da Web geralmente empregam é a execução de scripts a cada novo carregamento de página. Para uma extensão da Web como a MetaMask, precisamos fornecer um window.ethereum global para os dApps usarem. Então, como fazemos isso com a versão 3 do manifesto?

A partir do Chrome v102, os desenvolvedores podem definir um world com um valor de isolated ou main (na página) para scripts de conteúdo. Embora os desenvolvedores devam definir content_scripts na seção manifest.json da extensão, o main realmente só funciona (devido a um bug do Chrome) quando o senhor o define programaticamente no service worker:

await chrome.scripting.registerContentScripts([
  {
    id: 'inpage',
    matches: ['http://*/*', 'https://*/*'],
    js: ['in-page.js'],
    runAt: 'document_start',
    world: 'MAIN',
  },
]);

No exemplo acima, in-page.js é injetado e executado na guia de conteúdo principal sempre que uma nova página é carregada. Esse in-page.js arquivo define window.ethereum para todos os dApps usarem. Se o world for undefined ou isolated, o script ainda seria executado, mas em um ambiente isolado.

O trabalho da versão 3 do manifesto é bastante árduo, portanto, abrace o desenvolvedor de extensões mais próximo. Há muitas mudanças estruturais enormes e navegar por essas mudanças é um esforço brutal!