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:
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 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 deStorageArea
tiene su propio eventoonChanged
. 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.