Extension service workers obsługują zarówno zdarzenia standardowego skryptu service worker, jak i wiele zdarzeń w interfejsach API rozszerzeń. W tej sekcji znajdziesz opis dostępnych funkcji i wskazówki dotyczące ich używania.
Deklarowanie zdarzeń rozszerzenia
Obsługa zdarzeń w usługach Service Worker musi być zadeklarowana w zakresie globalnym, co oznacza, że powinna znajdować się na najwyższym poziomie skryptu i nie powinna być zagnieżdżona w funkcjach. Dzięki temu są one rejestrowane synchronicznie podczas początkowego wykonywania skryptu, co umożliwia Chrome wysyłanie zdarzeń do skryptu service worker natychmiast po jego uruchomieniu. Na przykład:
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 }); });
Typowe zdarzenia
Usługi rozszerzeń obsługują zdarzenia w określonych interfejsach API. Poniżej opisujemy kilka typowych przykładów. Pamiętaj, że niektóre z tych interfejsów API wymagają uprawnień do używania, a inne mogą mieć zdarzenia, metody lub właściwości, które nie są dostępne we wszystkich wersjach Chrome. Szczegółowe informacje znajdziesz w dokumentacji API, zwłaszcza w sekcjach dotyczących zdarzeń, metod lub właściwości, których chcesz używać.
browser.action- Uruchamiane w odpowiedzi na interakcję użytkownika z ikoną paska narzędzi rozszerzenia, niezależnie od tego, czy dotyczy ona konkretnej strony (karty), czy całego rozszerzenia.
browser.management- Zawiera zdarzenia związane z instalowaniem, odinstalowywaniem, włączaniem i wyłączaniem rozszerzeń.
browser.notifications- Zawiera zdarzenia związane z interakcją użytkownika z powiadomieniami systemowymi generowanymi przez rozszerzenie.
browser.permissions- Wskazuje, kiedy użytkownik przyznaje lub cofa uprawnienia rozszerzenia.
browser.runtime- Zawiera zdarzenia związane z cyklem życia rozszerzenia, wiadomości wysyłane z innych części rozszerzenia oraz powiadomienia o dostępności rozszerzenia lub aktualizacji Chrome.
browser.storage.onChanged- Wysyłane za każdym razem, gdy obiekt
StorageAreajest czyszczony lub gdy wartość klucza jest zmieniana lub ustawiana. Pamiętaj, że każde wystąpienieStorageAreama własne zdarzenieonChanged. browser.webNavigation- Zawiera informacje o stanie żądań nawigacji podczas lotu.
Filtry
Aby ograniczyć zdarzenia do konkretnego przypadku użycia lub wyeliminować niepotrzebne wywołania zdarzeń, używaj interfejsów API, które obsługują filtry zdarzeń. Rozważmy na przykład rozszerzenie, które nasłuchuje zdarzenia tabs.onUpdated, aby wykrywać, kiedy użytkownik przechodzi do określonej witryny. To zdarzenie będzie wywoływane przy każdej nawigacji na każdej karcie. Zamiast tego użyj webNavigation.onCompleted z filtrem. Na przykład:
const filter = {
url: [
{
urlMatches: 'https://www.google.com/',
},
],
};
browser.webNavigation.onCompleted.addListener(() => {
console.info("The user has loaded my favorite website!");
}, filter);
Zdarzenia skryptów service worker
Usługi Service Worker rozszerzeń obsługują więcej zdarzeń cyklu życia niż opisane w innych miejscach.
ServiceWorkerGlobal.fetch
Wywoływane, gdy z pakietu rozszerzenia pobierane są jakiekolwiek dane lub gdy z rozszerzenia lub skryptu wyskakującego okienka wywoływane są funkcje fetch() i XMLHttpRequest(). (Połączenia ze skryptów treści nie są przechwytywane przez moduł obsługi skryptu Service Worker fetch). W tych przypadkach musisz dodać adresy URL stron, które chcesz pobrać, do klucza "host_permissions" w obiekcie manifest.json.
ServiceWorkerGlobal.message
Oprócz przesyłania wiadomości w rozszerzeniach dostępne jest też przesyłanie wiadomości w skryptach Service Worker, ale te 2 systemy nie są ze sobą zgodne. Oznacza to, że wiadomości wysyłane za pomocą sendMessage() (dostępnego w kilku interfejsach API rozszerzeń) nie są przechwytywane przez moduły obsługi wiadomości w skrypcie service worker. Podobnie wiadomości wysyłane za pomocą postMessage() nie są przechwytywane przez moduły obsługi wiadomości rozszerzeń. W instancjach roboczych usług rozszerzeń obsługiwane są oba typy modułów obsługi wiadomości, czyli ServiceWorkerGlobal.message i browser.runtime.onMessage.
Jeśli nie masz konkretnego powodu, aby używać wiadomości ze skryptów service worker, wybierz wiadomości z rozszerzeń.