Substituir listeners de solicitações da Web bloqueados

Modificar solicitações de rede no Manifesto V3

O Manifest V3 muda a forma como as extensões lidam com a modificação de solicitações de rede. Em vez de interceptar solicitações de rede e alterá-las durante a execução com chrome.webRequest, a extensão especifica regras que descrevem as ações a serem realizadas quando um determinado conjunto de condições for atendido. Para isso, use a API Declarative Net Request.

As APIs Web Request e Declarative Net Request são significativamente diferentes. Em vez de substituir uma chamada de função por outra, é necessário reescrever seu código em termos de casos de uso. Esta seção mostra esse processo.

No Manifesto V2, bloquear solicitações da Web pode prejudicar significativamente o desempenho das extensões e das páginas em que elas funcionam. O namespace webRequest dá suporte a nove eventos potencialmente de bloqueio, cada um usando um número ilimitado de manipuladores de eventos. Para piorar, cada página da Web pode ser bloqueada por várias extensões, e as permissões necessárias para isso são invasivas. O Manifest V3 protege contra esse problema substituindo os retornos de chamada por regras declarativas.

Esta é a segunda de três seções que descrevem as mudanças necessárias para o código que não faz parte do service worker de extensão. Ele descreve a conversão de solicitações da Web de bloqueio, usadas pelo Manifest V2, em solicitações de rede declarativas, usadas pelo Manifesto V3. As outras duas seções abordam a atualização do código necessário para migrar para o Manifest V3 e o aumento da segurança.

Atualizar permissões

Faça as seguintes mudanças no campo "permissions" do manifest.json.

  • Remova a permissão "webRequest" se você não precisar mais observar solicitações de rede.
  • Mover padrões de correspondência de "permissions" para "host_permissions".

Você precisará adicionar outras permissões, dependendo do caso de uso. Essas permissões são descritas com o caso de uso compatível.

Criar regras de solicitação de rede declarativas

Para criar regras de solicitação net declarativas, é preciso adicionar um objeto "declarative_net_request" ao manifest.json. O bloco "declarative_net_request" contém uma matriz de objetos "rule_resource" que apontam para um arquivo de regra. O arquivo da regra contém uma matriz de objetos que especificam uma ação e as condições em que essas ações são invocadas.

Casos de uso comuns

As seções a seguir descrevem casos de uso comuns para solicitações de rede declarativas. As instruções abaixo são apenas um breve resumo. Mais informações sobre todas as informações são descritas na referência da API em chrome.declarativeNetRequest.

Bloquear um único URL

Um caso de uso comum no Manifesto V2 era bloquear solicitações da Web usando o evento onBeforeRequest no script em segundo plano.

Script em segundo plano do Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

Para o Manifesto V3, crie uma nova regra declarativeNetRequest usando o tipo de ação "block". Observe o objeto "condition" na regra de exemplo. O "urlFilter" substitui a opção urls transmitida ao listener webRequest. Uma matriz "resourceTypes" especifica a categoria dos recursos a serem bloqueados. Este exemplo bloqueia apenas a página HTML principal, mas é possível, por exemplo, bloquear apenas fontes.

Arquivo de regras do Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

Para que isso funcione, atualize as permissões da extensão. No manifest.json, substitua a permissão "webRequestBlocking" pela "declarativeNetRequest". O URL é removido do campo "permissions" porque o bloqueio de conteúdo não exige permissões de host. Conforme mostrado acima, o arquivo de regras especifica os hosts aos quais uma solicitação de rede declarativa se aplica.

Se você quiser testar isso, o código abaixo está disponível no nosso repositório de exemplos.

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
Manifesto V3
  "permissions": [
    "declarativeNetRequest",
  ]

Redirecionar vários URLs

Outro caso de uso comum no Manifesto V2 foi usar o evento BeforeRequest para redirecionar solicitações da Web.

Script em segundo plano do Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    console.log(e);
    return { redirectUrl: "https://developer.chrome.com/docs/extensions/mv3/intro/" };
  }, { 
    urls: [
      "https://developer.chrome.com/docs/extensions/mv2/"
    ]
  }, 
  ["blocking"]
);

Para o Manifest V3, use o tipo de ação "redirect". Como antes, "urlFilter" substitui a opção url transmitida ao listener webRequest. Observe que, nesse exemplo, o objeto "action" do arquivo de regra contém um campo "redirect" com o URL a ser retornado em vez do URL que está sendo filtrado.

Arquivo de regras do Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": { "url": "https://developer.chrome.com/docs/extensions/mv3/intro/" }
    },
    "condition": {
      "urlFilter": "https://developer.chrome.com/docs/extensions/mv2/",
      "resourceTypes": ["main_frame"]
    }
  }

Este cenário também requer mudanças nas permissões da extensão. Como antes, substitua a permissão "webRequestBlocking" pela permissão "declarativeNetRequest". Os URLs são novamente movidos de manifest.json para um arquivo de regras. O redirecionamento também exige a permissão "declarativeNetRequestWithHostAccess", além da permissão do host.

Se você quiser testar isso, o código abaixo está disponível no nosso repositório de exemplos.

Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
Manifesto V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

Bloquear cookies

No Manifesto V2, o bloqueio de cookies exige a interceptação dos cabeçalhos de solicitação da Web antes que eles sejam enviados e a remoção de um cabeçalho específico.

Script em segundo plano do Manifest V2
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

O Manifesto V3 também faz isso com uma regra em um arquivo de regras. Desta vez, o tipo de ação é "modifyHeaders". O arquivo usa uma matriz de objetos "requestHeaders" especificando os cabeçalhos a serem modificados e como fazer isso. O objeto "condition" contém apenas uma matriz "resourceTypes". Ele é compatível com os mesmos valores dos exemplos anteriores.

Se você quiser testar isso, o código abaixo está disponível no nosso repositório de exemplos.

Manifesto V3 manifest.json
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

Este cenário também requer mudanças nas permissões da extensão. Como antes, substitua a permissão "webRequestBlocking" pela permissão "declarativeNetRequest".

Manifest V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
Manifesto V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]