Controles do usuário para permissões do host: guia de transição

Resumo

O que está mudando?

A partir do Chrome 70, os usuários podem restringir o acesso de hosts de extensão a uma lista personalizada de sites ou configurar extensões para exigir um clique para acessar a página atual.

Quais APIs foram afetadas?

Essa mudança afeta todas as APIs afetadas pelas permissões de host especificadas no manifesto da extensão, bem como os scripts de conteúdo. As APIs que exigem permissões de host incluem webRequest, cookies, tabs.executeScript() e tabs.insertCSS() e execução de solicitações de origem cruzada, como uma XMLHTTPRequest ou a API fetch().

Como restringir o acesso

Como o usuário pode restringir o acesso?

Os usuários podem optar por permitir que sua extensão seja executada com um clique, em um conjunto específico de sites ou em todos os sites solicitados. Essas opções são apresentadas aos usuários na página chrome://extensions e no menu de contexto da extensão.

Uma captura de tela dos controles do menu de contexto para permissões de host de tempo de execução, incluindo opções para executar a extensão ao clicar, em um site específico ou em todos os sites.

O que acontecerá se um usuário optar por executar minha extensão "no clique"?

A extensão se comporta como se tivesse usado a permissão activeTab. A extensão receberá acesso temporário a qualquer host em que o usuário clicar na extensão, se esse host tiver sido solicitado pela extensão (e não for um site restrito, como chrome://settings). Quando configurada para execução com um clique, o Chrome coloca sua extensão em um círculo e uma sombra projetada (veja abaixo) para indicar que está solicitando acesso em um site específico.

Captura de tela do selo que o Chrome adiciona ao ícone da extensão na barra de ferramentas

O que acontecerá se um usuário optar por executar minha extensão em sites específicos?

Sua extensão pode ser executada automaticamente em qualquer site escolhido pelo usuário e pode acessá-lo sem nenhuma outra ação do usuário. Em outros sites para os quais sua extensão solicitou, mas o usuário não concedeu permissão, o comportamento será o mesmo que se o usuário tivesse definido a extensão para ser executada com um clique.

O que acontece se um usuário optar por executar minha extensão em todos os sites?

A extensão pode acessar automaticamente qualquer site solicitado no manifesto.

Comportamentos da API

API Web Request

A extensão ainda poderá interceptar, modificar e bloquear solicitações de sites a que tem acesso. Para sites a que a extensão não tem acesso, o Chrome exibe o ícone da extensão para indicar que a extensão solicita acesso à página. O usuário pode conceder acesso à extensão. O Chrome solicita que o usuário atualize a página para permitir que sua extensão intercepte as solicitações de rede.

Scripts de conteúdo, guias.executeScript(), tabs.insertCSS()

A extensão ainda pode injetar scripts e folhas de estilo automaticamente nos sites a que ela tem acesso. No caso de sites a que a extensão não tem acesso, o Chrome coloca a extensão em destaque para indicar que ela solicita acesso à página. Então, o usuário pode conceder acesso à extensão. Se o script de conteúdo estiver configurado para injetar em document_idle, o script fará a injeção imediatamente. Caso contrário, o Chrome vai solicitar que o usuário atualize a página para permitir que a extensão injete scripts no início do carregamento de página (em document_start ou document_end). Os callbacks para os métodos tabs.executeScript() e tabs.insertCSS() são invocados apenas se o usuário conceder acesso ao site.

XHR Cookies e página de plano de fundo

A extensão ainda pode ler e modificar todos os cookies e realizar um XHR de origem cruzada nos sites a que ela tem acesso. Como não há guia associada a uma página de extensão que acessa cookies ou XHRing de outra origem para outro host, o Chrome não coloca a extensão em um selo para indicar ao usuário que a extensão está solicitando acesso a um site. Se você tentar acessar um cookie para outro site ou fazer um XHR de origem cruzada, ocorrerá um erro, como se o manifesto da extensão não incluísse a permissão de host. Nesses casos, recomendamos o uso de permissões opcionais para que o usuário conceda acesso de execução a diferentes sites.

O exemplo abaixo ilustra como isso pode funcionar para a API de cookies.

Antes:

{
  ...
  "permissions": ["cookies", "https://example.com"]
}
chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                    function(cookie) {
                      // Use the cookie.
                    });

Depois:

{
  ...
  "permissions": ["cookies"],
  "optional_permissions": ["https://example.com"]
}
// Note: permissions.request() requires a user gesture, so this
// may only be done in response to a user action.
chrome.permissions.request(
    {origins: ['https://example.com']},
    function(granted) {
      if (granted) {
        chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                            function(cookie) {
                              // Use the cookie.
                            });
      } else {
        // Handle grant failure
      }
    });

Migração

Quais são as práticas recomendadas para evitar um impacto negativo?

As extensões podem usar as APIs de permissões opcionais, activeTab e declarativeContent para seguir as práticas recomendadas. As permissões opcionais são concedidas no momento da execução e permitem que a extensão solicite acesso específico a um site. A permissão activeTab não foi afetada, e as extensões que a usam continuam funcionando normalmente. A API declarativeContent é uma substituta para muitas necessidades para injetar scripts em todas as páginas.

O que acontecerá com as configurações dos meus usuários atuais?

Essa alteração não afetará imediatamente as permissões atuais concedidas à sua extensão. Ou seja, ele continuará funcionando como antes, a menos que o usuário tome medidas para restringir os sites que tem permissão para acessar. Em versões futuras, o Chrome fornecerá mais controles para que os usuários ajustem as configurações.

Como posso verificar se minha extensão tem permissão para ser executada em um site?

Você pode usar a API permissions.contains() para verificar se a extensão recebeu acesso a uma determinada origem.