Auto-hospedagem para Linux

O Linux é a única plataforma em que os usuários do Chrome podem instalar extensões hospedadas fora da Chrome Web Store. Neste artigo, descrevemos como empacotar, hospedar e atualizar arquivos crx de um servidor da Web de uso geral. Se você estiver distribuindo uma extensão ou um tema apenas pela Chrome Web Store, consulte Hospedagem e atualização da Web Store.

Pacote

As extensões e os temas são veiculados como arquivos .crx. Ao fazer upload pelo painel do desenvolvedor do Chrome, o painel cria o arquivo crx automaticamente. Se publicado em um servidor pessoal, o arquivo crx precisará ser criado localmente ou baixado da Chrome Web Store.

Baixar .crx da Chrome Web Store

Se uma extensão estiver hospedada na Chrome Web Store, o arquivo .crx poderá ser baixado do Painel de controle do desenvolvedor. Localize a extensão em "Suas fichas" e clique em "Mais informações". Na janela pop-up, clique no link azul main.crx para fazer o download.

Baixar o .crx no Painel de controle do desenvolvedor

O arquivo baixado pode ser hospedado em um servidor pessoal. Essa é a maneira mais segura de hospedar uma extensão localmente, já que o conteúdo dela é assinado pela Chrome Web Store. Isso ajuda a detectar possíveis ataques e adulterações.

Criar .crx localmente

Os diretórios de extensão são convertidos em arquivos .crx na página de gerenciamento de extensões. Navegue até chrome://extensions/ na omnibox ou clique no menu do Google Chrome, mantenha o ponteiro sobre "Mais ferramentas" e selecione "Extensões".

Na página de gerenciamento de extensões, ative o modo de desenvolvedor clicando no botão ao lado de Modo de desenvolvedor. Em seguida, selecione o botão EXTENSÃO DE PACOTE.

O modo de desenvolvedor está marcado. Clique em "Compactar extensão".

Especifique o caminho para a pasta da extensão no campo "Diretório raiz da extensão" e clique no botão EMPACOTAR EXTENSÃO. Ignore o campo Chave privada para um pacote inédito.

Especifique o caminho da extensão e clique em "Compactar extensão".

O Chrome vai criar dois arquivos, um .crx e um .pem, que contém a chave privada da extensão.

Arquivos de extensão empacotados

Não perca a chave privada. Mantenha o arquivo .pem em um local secreto e seguro. Ele será necessário para atualizar a extensão.

Atualizar um pacote .crx

Atualize o arquivo .crx de uma extensão aumentando o número da versão em manifest.json.

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

Volte para a página de gerenciamento de extensões e clique no botão EMPACOTAR EXTENSÃO. Especifique o caminho para o diretório de extensões e o local da chave privada.

Atualizar arquivos de extensão

A página vai mostrar o caminho da extensão empacotada atualizada.

Atualizar arquivos de extensão

Empacotar pela linha de comando

Empacote as extensões na linha de comando invocando chrome.exe. Use a flag --pack-extension para especificar o local da pasta da extensão e a flag --pack-extension-key para especificar o local do arquivo de chave privada da extensão.

chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

Host

Um servidor que hospeda arquivos .crx precisa usar cabeçalhos HTTP adequados para permitir que os usuários instalem a extensão clicando em um link.

Para que o Google Chrome considere que um arquivo pode ser instalado, uma destas condições precisa ser verdadeira:

  • O arquivo tem o tipo de conteúdo application/x-chrome-extension
  • O sufixo do arquivo é .crx e ambas as condições a seguir são verdadeiras:
    • O arquivo não é veiculado com o cabeçalho HTTP X-Content-Type-Options: nosniff.
    • O arquivo é exibido com um destes tipos de conteúdo:
    • String vazia
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

O motivo mais comum para não reconhecer que um arquivo pode ser instalado é o servidor enviar o cabeçalho X-Content-Type-Options: nosniff. O segundo motivo mais comum é o servidor enviar um tipo de conteúdo desconhecido, que não está na lista anterior. Para corrigir um problema com o cabeçalho HTTP, mude a configuração do servidor ou tente hospedar o arquivo .crx em outro servidor.

Atualizar

A cada poucas horas, o navegador verifica se há um URL de atualização nas extensões instaladas. Para cada um deles, ele faz uma solicitação ao URL em busca de um arquivo XML de manifesto de atualização.

  • O conteúdo retornado por uma verificação de atualização é um documento XML de manifesto de atualização que lista a versão mais recente de uma extensão.

Se o manifesto de atualização mencionar uma versão mais recente do que a instalada, o navegador vai baixar e instalar a nova versão. Assim como nas atualizações manuais, o novo arquivo .crx precisa ser assinado com a mesma chave privada da versão instalada.

Observação:para manter a privacidade do usuário, o Google Chrome não envia cabeçalhos de cookie com solicitações de manifesto de atualização automática e ignora os cabeçalhos "Set-Cookie" nas respostas a essas solicitações.

Atualizar URL

As extensões hospedadas em servidores fora da Chrome Web Store precisam incluir o campo update_url no arquivo manifest.json.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

Atualizar o manifesto

O manifesto de atualização retornado pelo servidor precisa ser um documento XML.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

Esse formato XML é emprestado do usado pelo Omaha, a infraestrutura de atualização do Google. O sistema de extensões usa os seguintes atributos para os elementos <app> e <updatecheck> do manifesto de atualização:

appid
O ID da extensão é gerado com base em um hash da chave pública, conforme descrito em pacotes. O ID de uma extensão é exibido na página de gerenciamento de extensões.
codebase
Um URL HTTPS para o arquivo .crx.
version
Usado pelo cliente para determinar se ele deve fazer o download do arquivo .crx especificado por codebase. Ele precisa corresponder ao valor de "version" no arquivo manifest.json do arquivo .crx.

O arquivo XML de manifesto de atualização pode conter informações sobre várias extensões ao incluir vários elementos <app>.

Teste

A frequência padrão de verificação de atualizações é de várias horas, mas é possível forçar uma atualização usando o botão Atualizar extensões agora na página de gerenciamento de extensões.

Atualizar extensões agora

Isso vai iniciar as verificações de todas as extensões instaladas.

Uso avançado: parâmetros de solicitação

O mecanismo básico de atualização automática foi projetado para facilitar o trabalho do lado do servidor. Basta soltar um arquivo XML estático em qualquer servidor da Web simples, como o Apache, e atualizar esse arquivo à medida que novas versões de extensão são lançadas.

Os desenvolvedores que hospedam várias extensões podem verificar os parâmetros de solicitação, que indicam o ID e a versão da extensão na solicitação de atualização. Incluir esses parâmetros permite que as extensões sejam atualizadas do mesmo URL executando código dinâmico do lado do servidor em vez de um arquivo XML estático.

O formato dos parâmetros de solicitação é:

?x=EXTENSION_DATA

Em que EXTENSION_DATA é uma string codificada por URL no formato:

id=EXTENSION_ID&v=EXTENSION_VERSION

Por exemplo, duas extensões apontam para o mesmo URL de atualização (https://test.com/extension_updates.php):

  • Extensão 1
    • ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    • Version: "1.1"
  • Extensão 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • Versão: "0.4"

A solicitação para atualizar cada extensão individual seria:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1

e

https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

Várias extensões podem ser listadas em uma única solicitação para cada URL de atualização exclusivo. No exemplo anterior, se um usuário tiver as duas extensões instaladas, as duas solicitações serão mescladas em uma única solicitação:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

Se o número de extensões instaladas usando o mesmo URL de atualização for grande o suficiente para que um URL de solicitação GET seja muito longo (mais de 2.000 caracteres, aproximadamente), a verificação de atualização vai emitir outras solicitações GET conforme necessário.

Uso avançado: versão mínima do navegador

À medida que mais APIs são adicionadas ao sistema de extensões, uma versão atualizada de uma extensão que funciona apenas com versões mais recentes do navegador pode ser lançada. Embora o Google Chrome seja atualizado automaticamente, pode levar alguns dias até que a maioria da base de usuários faça a atualização para qualquer novo lançamento. Para garantir que uma determinada atualização seja aplicada apenas a versões do Google Chrome iguais ou superiores a uma versão específica, adicione o atributo "prodversionmin" ao elemento <app> na resposta de atualização.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
  </app>
</gupdate>

Isso garante que os usuários só vão atualizar automaticamente para a versão 2 se estiverem usando o Google Chrome 3.0.193.0 ou mais recente.