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:
browser.storage.local.get(["badgeText"], ({ badgeText }) => { browser.action.setBadgeText({ text: badgeText }); browser.action.onClicked.addListener(handleActionClick); });
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 jedeStorageArea-Instanz ein eigenesonChanged-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.