Eventos en service workers

Los service workers de extensión admiten eventos de service worker estándar y muchos eventos en las APIs de extensiones. En esta sección, se describen las opciones disponibles y se proporcionan sugerencias para utilizarlas.

Cómo declarar eventos de extensión

Los controladores de eventos de los service workers deben declararse en el alcance global, lo que significa que deben estar en el nivel superior de la secuencia de comandos y no deben estar anidados dentro de funciones. Esto garantiza que se registren de forma síncrona en la ejecución inicial de la secuencia de comandos, lo que permite a Chrome enviar eventos al service worker en cuanto se inicia. Por ejemplo:

No se aconseja
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
  chrome.action.onClicked.addListener(handleActionClick);
});

Mejor
chrome.action.onClicked.addListener(handleActionClick);

chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
});

Eventos comunes

Los service workers de la extensión admiten eventos en APIs específicas. A continuación, se describen algunas de las más comunes. Ten en cuenta que algunas de estas APIs requieren permisos para usarse y otras pueden tener eventos, métodos o propiedades que no están disponibles en todas las versiones de Chrome. Para obtener más detalles, consulta la documentación de la API vinculada, en particular los eventos, métodos o propiedades que deseas usar.

chrome.action
Se activa en respuesta a una interacción del usuario con el ícono de la barra de herramientas de tu extensión, ya sea que la acción sea en una página específica (pestaña) o en toda la extensión.
chrome.management
Proporciona eventos relacionados con la instalación, desinstalación, habilitación e inhabilitación de extensiones.
chrome.notifications
Proporciona eventos relacionados con la interacción del usuario con las notificaciones del sistema que genera la extensión.
chrome.permissions
Indica cuándo el usuario otorga o revoca los permisos de las extensiones.
chrome.runtime
Proporciona eventos relacionados con el ciclo de vida de la extensión, los mensajes enviados desde otras partes de la extensión y las notificaciones de una extensión disponible o una actualización de Chrome.
chrome.storage.onChanged
Se activa cada vez que se borra un objeto StorageArea o cuando se cambia o se configura el valor de una clave. Ten en cuenta que cada instancia de StorageArea tiene su propio evento onChanged.
chrome.webNavigation
Proporciona información sobre el estado de las solicitudes de navegación en vuelo.

Filtros

Para restringir los eventos a casos de uso específicos o eliminar las llamadas a eventos innecesarias, usa las APIs que admitan filtros de eventos. Por ejemplo, considera una extensión que escucha el evento tabs.onUpdated para detectar cuándo un usuario navega a un sitio web específico. Se llamará a este evento en todas las navegaciones de cada pestaña. En su lugar, usa webNavigation.onCompleted con un filtro. Por ejemplo:

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 web

Los service workers de extensión admiten más eventos de ciclo de vida que se describen en otra parte.

ServiceWorkerGlobal.fetch

Se activa cuando se recupera algo del paquete de extensión o cuando se llama a fetch() y XMLHttpRequest() desde una extensión o una secuencia de comandos emergente. (El controlador fetch del service worker no intercepta las llamadas provenientes de las secuencias de comandos de contenido). En los últimos casos, deberás agregar las URLs de las páginas que quieras recuperar a la clave "host_permissions" en manifest.json.

ServiceWorkerGlobal.message

El paso de mensajes de service worker está disponible junto con el pasado de mensajes de la extensión, pero los dos sistemas no son interoperables. Eso significa que los mensajes que se envían con sendMessage() (que está disponible en varias APIs de extensión) no son interceptados por los controladores de mensajes del service worker. Del mismo modo, los controladores de mensajes de extensiones no interceptan los mensajes enviados con postMessage(). Ambos tipos de controladores de mensajes, es decir, ServiceWorkerGlobal.message y chrome.runtime.onMessage, son compatibles con los service workers de extensión.

Es preferible que prefieras los mensajes con extensiones, a menos que tengas un motivo específico para usarlo.