Événements dans les service workers

Les service workers d'extension sont compatibles avec les événements de service worker standard et avec de nombreux événements dans les API d'extension. Cette section décrit les options disponibles et fournit des conseils pour les utiliser.

Déclarer des événements d'extension

Les gestionnaires d'événements des service workers doivent être déclarés dans le champ d'application global, ce qui signifie qu'ils doivent se trouver au niveau supérieur du script et ne pas être imbriqués dans des fonctions. Ainsi, ils sont enregistrés de manière synchrone lors de l'exécution initiale du script, ce qui permet à Chrome d'envoyer les événements au service worker dès le démarrage. Exemple :

Non conseillée
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
  chrome.action.onClicked.addListener(handleActionClick);
});

Meilleure qualité
chrome.action.onClicked.addListener(handleActionClick);

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

Événements courants

Les service workers d'extension prennent en charge les événements dans des API spécifiques. Quelques-uns des plus courants sont décrits ci-dessous. Notez que certaines de ces API nécessitent des autorisations d'utilisation, tandis que d'autres peuvent comporter des événements, des méthodes ou des propriétés qui ne sont pas disponibles dans toutes les versions de Chrome. Pour en savoir plus, consultez la documentation de l'API associée, en particulier les événements, les méthodes ou les propriétés que vous souhaitez utiliser.

chrome.action
Déclenché en réponse à une interaction de l'utilisateur avec l'icône de la barre d'outils de votre extension, que cette action concerne une page (onglet) spécifique ou l'ensemble de l'extension.
chrome.management
Fournit des événements liés à l'installation, à la désinstallation, à l'activation et à la désactivation des extensions.
chrome.notifications
Fournit des événements liés à l'interaction de l'utilisateur avec les notifications système générées par l'extension.
chrome.permissions
Indique quand les autorisations de l'extension sont accordées ou révoquées par l'utilisateur.
chrome.runtime
Fournit des événements liés au cycle de vie de l'extension, des messages envoyés depuis d'autres parties de l'extension, ainsi qu'une notification lorsqu'une extension ou une mise à jour de Chrome sont disponibles.
chrome.storage.onChanged
Déclenché chaque fois qu'un objet StorageArea est effacé, ou lorsque la valeur d'une clé est modifiée ou définie. Notez que chaque instance StorageArea possède son propre événement onChanged.
chrome.webNavigation
Fournit des informations sur l'état des requêtes de navigation en vol.

Filtres

Pour limiter les événements à des cas d'utilisation spécifiques ou éliminer les appels d'événements inutiles, utilisez des API compatibles avec les filtres d'événements. Prenons l'exemple d'une extension qui écoute l'événement tabs.onUpdated pour détecter quand un utilisateur accède à un site Web spécifique. Cet événement sera appelé à chaque navigation dans chaque onglet. Utilisez plutôt webNavigation.onCompleted avec un filtre. Exemple :

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

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

Événements Web Service worker

Les services d'extension ne prennent pas en charge les événements de cycle de vie décrits ailleurs.

ServiceWorkerGlobal.fetch

Déclenché lorsqu'un élément est récupéré à partir du package d'extension, ou lorsque fetch() et XMLHttpRequest() sont appelés à partir d'une extension ou d'un script pop-up. (Les appels à partir de scripts de contenu ne sont pas interceptés par le gestionnaire fetch du service worker.) Dans ce dernier cas, vous devez ajouter les URL des pages que vous souhaitez extraire à la clé "host_permissions" du fichier manifest.json.

ServiceWorkerGlobal.message

La transmission de messages du service worker est disponible en plus de la transmission de messages d'extension, mais les deux systèmes ne sont pas interopérables. Cela signifie que les messages envoyés à l'aide de sendMessage() (disponible à partir de plusieurs API d'extension) ne sont pas interceptés par les gestionnaires de messages du service worker. De même, les messages envoyés à l'aide de postMessage() ne sont pas interceptés par les gestionnaires de messages des extensions. Les deux types de gestionnaires de messages (ServiceWorkerGlobal.message et chrome.runtime.onMessage) sont compatibles avec les service workers d'extension.

Il est préférable d'utiliser les messages d'extension, sauf si vous avez une raison spécifique d'utiliser la messagerie du service worker.