Os service workers de extensão oferecem suporte a eventos do service worker padrão e a muitos eventos nas APIs de extensão. Esta seção descreve o que está disponível e dá dicas para usá-los.
Declarar eventos de extensão
Os manipuladores de eventos em service workers precisam ser declarados no escopo global, o que significa que devem estar no nível superior do script e não estar aninhados dentro de funções. Isso garante que eles sejam registrados de forma síncrona na execução inicial do script, o que permite que o Chrome envie eventos ao service worker assim que ele for iniciado. Exemplo:
chrome.storage.local.get(["badgeText"], ({ badgeText }) => { chrome.action.setBadgeText({ text: badgeText }); chrome.action.onClicked.addListener(handleActionClick); });
chrome.action.onClicked.addListener(handleActionClick); chrome.storage.local.get(["badgeText"], ({ badgeText }) => { chrome.action.setBadgeText({ text: badgeText }); });
Eventos comuns
Os service workers de extensão oferecem suporte a eventos em APIs específicas. Alguns exemplos comuns são descritos a seguir. Observe que algumas dessas APIs exigem permissões para serem usadas e outras podem ter eventos, métodos ou propriedades que não estão disponíveis em todas as versões do Chrome. Para mais detalhes, consulte a documentação da API vinculada, principalmente os eventos, métodos ou propriedades que você quer usar.
chrome.action
- Acionada em resposta a uma interação do usuário com o ícone da barra de ferramentas da extensão, seja para uma página específica (guia) ou toda a extensão.
chrome.management
- Oferece eventos relacionados à instalação, desinstalação, ativação e desativação de extensões.
chrome.notifications
- Fornece eventos relacionados à interação do usuário com notificações do sistema geradas pela extensão.
chrome.permissions
- Indica quando as permissões das extensões são concedidas ou revogadas pelo usuário.
chrome.runtime
- Mostra eventos relacionados ao ciclo de vida da extensão, mensagens enviadas de outras partes da extensão e notificação de uma extensão ou atualização do Chrome disponível.
chrome.storage.onChanged
- Acionado sempre que algum objeto
StorageArea
é limpo ou quando o valor de uma chave é alterado ou definido. Cada instância deStorageArea
tem o próprio eventoonChanged
. chrome.webNavigation
- Fornece informações sobre o status das solicitações de navegação em trânsito.
Filtros
Para restringir eventos a casos de uso específicos ou eliminar chamadas de eventos desnecessárias, use APIs compatíveis com filtros de eventos. Por exemplo, considere uma extensão que detecta o evento tabs.onUpdated
para detectar quando um usuário navega até um site específico. Esse evento vai ser chamado em todas as navegações em todas as guias. Em vez disso, use webNavigation.onCompleted
com um filtro. Exemplo:
const filter = {
url: [
{
urlMatches: 'https://www.google.com/',
},
],
};
chrome.webNavigation.onCompleted.addListener(() => {
console.info("The user has loaded my favorite website!");
}, filter);
Eventos de service worker da Web
Os service workers de extensão oferecem suporte a mais eventos de ciclo de vida do que os descritos em outro lugar.
ServiceWorkerGlobal.fetch
Disparado quando algo é recuperado do pacote de extensão ou quando fetch()
e XMLHttpRequest()
são chamados de um script de extensão ou pop-up. Chamadas de scripts de conteúdo não são interceptadas pelo gerenciador fetch
do service worker. Nos últimos casos, será necessário adicionar os URLs das páginas que você quer buscar à chave "host_permissions"
no manifest.json
.
ServiceWorkerGlobal.message
A transmissão de mensagens do service worker está disponível além da transmissão de mensagens de extensão, mas os dois sistemas não são interoperáveis. Isso significa que as mensagens enviadas usando sendMessage()
(disponível em várias APIs de extensão) não são interceptadas por gerenciadores de mensagens do service worker. Da mesma forma, as mensagens enviadas usando postMessage()
não são interceptadas por gerenciadores de mensagens de extensão. Os dois tipos de gerenciadores de mensagens, ou seja, ServiceWorkerGlobal.message
e chrome.runtime.onMessage
, são compatíveis com os service workers de extensão.
É melhor usar as mensagens de extensão, a menos que você tenha um motivo específico para usar as mensagens do service worker.