Eventos en service workers

Los service workers de extensiones admiten eventos de service workers estándar y muchos eventos en las APIs de extensiones. En esta sección, se describe lo que está disponible y se proporcionan sugerencias para usarlo.

Cómo declarar eventos de extensión

Los controladores de eventos en 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 anidarse dentro de las funciones. Esto garantiza que se registren de forma síncrona en la ejecución inicial de la secuencia de comandos, lo que permite que Chrome envíe eventos al service worker en cuanto se inicie. Por ejemplo:

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

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

Eventos comunes

Los Service Workers de extensiones admiten eventos en APIs específicas. A continuación, se describen algunos de los 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, los métodos o las propiedades que deseas usar.

browser.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 para una página (pestaña) específica o para toda la extensión.
browser.management
Proporciona eventos relacionados con la instalación, desinstalación, habilitación y deshabilitación de extensiones.
browser.notifications
Proporciona eventos relacionados con la interacción del usuario con las notificaciones del sistema que genera la extensión.
browser.permissions
Indica cuándo el usuario otorga o revoca los permisos de la extensión.
browser.runtime
Proporciona eventos relacionados con el ciclo de vida de la extensión, mensajes enviados desde otras partes de la extensión y notificaciones de una extensión disponible o una actualización de Chrome.
browser.storage.onChanged
Se activa cada vez que se borra un objeto StorageArea o cuando se cambia o se establece el valor de una clave. Ten en cuenta que cada instancia de StorageArea tiene su propio evento onChanged.
browser.webNavigation
Proporciona información sobre el estado de las solicitudes de navegación en vuelo.

Filtros

Para restringir los eventos a un caso de uso específico o eliminar las llamadas de eventos innecesarias, usa las APIs que admiten 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 cada navegación de cada pestaña. En su lugar, usa webNavigation.onCompleted con un filtro. Por ejemplo:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

browser.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

Eventos de Service Worker web

Los service workers de extensiones admiten más eventos de ciclo de vida que los descritos en otro lugar.

ServiceWorkerGlobal.fetch

Se activa cuando se recupera algo del paquete de la 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 de las secuencias de comandos de contenido). En los últimos casos, deberás agregar las URLs de las páginas que deseas recuperar a la clave "host_permissions" en el objeto manifest.json.

ServiceWorkerGlobal.message

El paso de mensajes del service worker está disponible además del paso de mensajes de la extensión, pero los dos sistemas no son interoperables. Esto significa que los controladores de mensajes del service worker no interceptan los mensajes enviados con sendMessage() (que está disponible en varias APIs de extensión). Del mismo modo, los controladores de mensajes de extensión no interceptan los mensajes enviados con postMessage(). Ambos tipos de controladores de mensajes, es decir, ServiceWorkerGlobal.message y browser.runtime.onMessage, se admiten en los service workers de extensión.

Debes preferir la mensajería de extensiones, a menos que tengas un motivo específico para usar la mensajería de Service Worker.