Eventos en service workers

Los trabajadores del servicio de extensión admiten eventos estándares del trabajador del servicio y muchos eventos en las APIs de extensión. 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 trabajadores del servicio deben declararse en el alcance global, lo que significa que deben estar en el nivel superior de la secuencia de comandos y no deben 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 servicio trabajador 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 trabajadores del servicio de extensión 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 su uso y otras pueden tener eventos, métodos o propiedades que no están disponibles en todas las versiones de Chrome. Para obtener más información, 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 esa acción sea para una página específica (pestaña) o para toda la extensión.
chrome.management
Proporciona eventos relacionados con la instalación, desinstalación, habilitación y desactivació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 la extensión.
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 la notificación 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 establece 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 durante el vuelo.

Filtros

Para restringir los eventos a un caso de uso específico o eliminar llamadas de eventos innecesarias, usa 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 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/',
    },
  ],
};

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

Eventos de trabajador de servicio web

Los trabajadores de servicios de extensión admiten más eventos del ciclo de vida que los descritos en otro lugar.

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 trabajador de servicio no intercepta las llamadas de las secuencias de comandos de contenido). En el último caso, deberás agregar las URLs de las páginas que deseas recuperar a la clave "host_permissions" en manifest.json.

ServiceWorkerGlobal.message

El envío de mensajes de los trabajadores del servicio está disponible además del envío de mensajes de la extensión, pero los dos sistemas no son interoperables. Eso significa que los controladores de mensajes del trabajador de servicio 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 chrome.runtime.onMessage, son compatibles con los servicios de trabajo de extensión.

Debes preferir los mensajes de la extensión, a menos que tengas un motivo específico para usar los mensajes del trabajador de servicio.