Ereignisse in Service Workern

Service Worker für Erweiterungen unterstützen sowohl Standard-Service Worker-Ereignisse als auch viele Ereignisse in den Erweiterungs-APIs. In diesem Abschnitt wird beschrieben, was verfügbar ist, und es werden Tipps zur Verwendung gegeben.

Erweiterungsereignisse deklarieren

Event-Handler in Service Workern müssen im globalen Bereich deklariert werden. Das bedeutet, dass sie sich auf der obersten Ebene des Skripts befinden und nicht in Funktionen verschachtelt sein dürfen. So werden sie bei der ersten Ausführung des Skripts synchron registriert. Dadurch kann Chrome Ereignisse an den Service Worker senden, sobald er gestartet wird. Beispiel:

Keine Empfehlung
browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
  browser.action.onClicked.addListener(handleActionClick);
});
Bessere
browser.action.onClicked.addListener(handleActionClick);

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

Häufige Ereignisse

Erweiterungs-Service-Worker unterstützen Ereignisse in bestimmten APIs. Im Folgenden werden einige häufige Fälle beschrieben. Für einige dieser APIs sind Berechtigungen erforderlich. Bei anderen sind möglicherweise Ereignisse, Methoden oder Eigenschaften vorhanden, die nicht in allen Chrome-Versionen verfügbar sind. Weitere Informationen finden Sie in der verlinkten API-Dokumentation, insbesondere zu den Ereignissen, Methoden oder Eigenschaften, die Sie verwenden möchten.

browser.action
Wird als Reaktion auf eine Nutzerinteraktion mit dem Symbol der Symbolleiste Ihrer Erweiterung ausgelöst, unabhängig davon, ob sich die Aktion auf eine bestimmte Seite (Tab) oder auf die gesamte Erweiterung bezieht.
browser.management
Stellt Ereignisse im Zusammenhang mit der Installation, Deinstallation, Aktivierung und Deaktivierung von Erweiterungen bereit.
browser.notifications
Stellt Ereignisse im Zusammenhang mit der Interaktion des Nutzers mit Systembenachrichtigungen bereit, die von der Erweiterung generiert werden.
browser.permissions
Gibt an, wann Erweiterungsberechtigungen vom Nutzer erteilt oder widerrufen werden.
browser.runtime
Stellt Ereignisse im Zusammenhang mit dem Lebenszyklus der Erweiterung, Nachrichten, die von anderen Teilen der Erweiterung gesendet werden, und Benachrichtigungen über verfügbare Erweiterungs- oder Chrome-Updates bereit.
browser.storage.onChanged
Wird ausgelöst, wenn ein StorageArea-Objekt gelöscht wird oder wenn der Wert eines Schlüssels geändert oder festgelegt wird. Beachten Sie, dass jede StorageArea-Instanz ein eigenes onChanged-Ereignis hat.
browser.webNavigation
Stellt Informationen zum Status von Navigationsanfragen während der Fahrt bereit.

Filter

Wenn Sie Ereignisse auf einen bestimmten Anwendungsfall beschränken oder unnötige Ereignisaufrufe vermeiden möchten, verwenden Sie APIs, die Ereignisfilter unterstützen. Angenommen, eine Erweiterung wartet auf das Ereignis tabs.onUpdated, um zu erkennen, wann ein Nutzer zu einer bestimmten Website navigiert. Dieses Ereignis wird bei jeder Navigation auf jedem Tab aufgerufen. Verwenden Sie stattdessen webNavigation.onCompleted mit einem Filter. Beispiel:

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

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

Web-Service-Worker-Ereignisse

Extension Service Worker unterstützen mehr als die Lebenszyklusereignisse, die an anderer Stelle beschrieben werden.

ServiceWorkerGlobal.fetch

Wird ausgelöst, wenn etwas aus dem Erweiterungspaket abgerufen wird oder wenn fetch() und XMLHttpRequest() über ein Erweiterungs- oder Pop-up-Script aufgerufen werden. Anrufe von Inhaltsskripts werden nicht vom fetch-Handler des Service Workers abgefangen. In diesen Fällen müssen Sie die URLs der Seiten, die Sie abrufen möchten, dem Schlüssel "host_permissions" im manifest.json hinzufügen.

ServiceWorkerGlobal.message

Die Nachrichtenübermittlung über Service Worker ist zusätzlich zur Nachrichtenübermittlung über Erweiterungen verfügbar, die beiden Systeme sind jedoch nicht interoperabel. Das bedeutet, dass Nachrichten, die mit sendMessage() gesendet werden (verfügbar über mehrere Erweiterungs-APIs), nicht von Service Worker-Nachrichtenhandlern abgefangen werden. Ebenso werden Nachrichten, die mit postMessage() gesendet werden, nicht von Erweiterungsnachrichten-Handlern abgefangen. Beide Arten von Nachrichtenhandlern, also sowohl ServiceWorkerGlobal.message als auch browser.runtime.onMessage, werden in Service Workern für Erweiterungen unterstützt.

Sie sollten Erweiterungsnachrichten verwenden, sofern Sie keinen bestimmten Grund für die Verwendung von Service Worker-Nachrichten haben.