Gerenciar eventos com scripts de segundo plano

Extensões são programas baseados em eventos usados para modificar ou aprimorar a experiência de navegação do Chrome. Eventos são acionadores do navegador, como navegar para uma nova página, remover um favorito ou fechar uma guia. As extensões monitoram esses eventos no script em segundo plano e reagem com as instruções especificadas.

Uma página em segundo plano é carregada quando é necessária e descarregada quando fica inativa. Alguns exemplos de eventos incluem:

  • A extensão é instalada primeiro ou atualizada para uma nova versão.
  • A página em segundo plano estava detectando um evento, e o evento é enviado.
  • Um script de conteúdo ou outra extensão envia uma mensagem.
  • Outra visualização na extensão, como um pop-up, chama runtime.getBackgroundPage.

Depois de ser carregada, uma página em segundo plano permanecerá em execução enquanto estiver executando uma ação, como chamar uma API do Chrome ou emitir uma solicitação de rede. Além disso, a página em segundo plano não será descarregada até que todas as visualizações visíveis e todas as portas de mensagens estejam fechadas. A abertura de uma visualização não faz com que a página do evento seja carregada, mas apenas impede que ela seja fechada após o carregamento.

Os scripts eficazes em segundo plano permanecem inativos até que um evento seja detectado, reagem com as instruções especificadas e são descarregados.

Registrar scripts de segundo plano

Os scripts de plano de fundo são registrados no manifesto no campo "background". Elas são listadas em uma matriz após a chave "scripts", e "persistent" precisa ser especificado como falso.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

Vários scripts de segundo plano podem ser registrados para código modularizado.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

Se uma extensão atualmente usa uma página em segundo plano persistente, consulte o Guia de migração em segundo plano para instruções sobre como alternar para um modelo não persistente.

Inicializar a extensão

Ouça o evento runtime.onInstalled para inicializar uma extensão na instalação. Use esse evento para definir um estado ou para uma inicialização única, como um menu de contexto.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

Configurar listeners

Estruturar scripts de segundo plano em torno de eventos de que a extensão depende. A definição de eventos funcionalmente relevantes permite que os scripts em segundo plano fiquem inativos até que esses eventos sejam disparados e impede que a extensão perca acionadores importantes.

Os listeners precisam ser registrados de forma síncrona desde o início da página.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

Não registre listeners de forma assíncrona, porque eles não serão acionados corretamente.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

As extensões podem remover listeners dos scripts em segundo plano chamando removeListener. Se todos os listeners de um evento forem removidos, o Chrome não carregará mais o script em segundo plano da extensão para esse evento.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

Filtrar eventos

Use APIs compatíveis com filtros de eventos para restringir listeners aos casos relevantes para a extensão. Se uma extensão estiver detectando o evento tabs.onUpdated, tente usar o evento webNavigation.onCompleted com filtros, já que a API de guias não oferece suporte a filtros.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

Reagir a listeners

As escutas existem para acionar as funcionalidades assim que um evento é disparado. Para reagir a um evento, estruture a reação desejada dentro do evento do listener.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

Descarregar scripts de segundo plano

Os dados precisam ser mantidos periodicamente para que informações importantes não sejam perdidas se uma extensão falhar sem receber onSuspend. Use a API storage para receber ajuda.

chrome.storage.local.set({variable: variableInformation});

Se uma extensão usar a transmissão de mensagens, verifique se todas as portas estão fechadas. O script de segundo plano não será descarregado até que todas as portas de mensagem estejam desligadas. Detectar o evento runtime.Port.onDisconnect fornecerá insights sobre quando as portas abertas estão sendo fechadas. Feche-as manualmente com runtime.Port.disconnect.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

O ciclo de vida de um script em segundo plano é observável monitorando quando uma entrada para a extensão aparece e desaparece do gerenciador de tarefas do Chrome.

ALT_TEXT_HERE

Para abrir o gerenciador de tarefas, clique no menu do Google Chrome, passe o cursor sobre mais ferramentas e selecione "Gerenciador de tarefas".

Os scripts em segundo plano são descarregados por conta própria após alguns segundos de inatividade. Se alguma limpeza de última hora for necessária, detecte o evento runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

No entanto, é preferível armazenar dados persistentes em vez de confiar em runtime.onSuspend. Ele não permite a quantidade de limpeza necessária e não ajuda em caso de falha.