Zdarzenia w instancjach service worker

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:

Nie zalecamy
browser.storage.local.get(["badgeText"], ({ badgeText }) => {
  browser.action.setBadgeText({ text: badgeText });
  browser.action.onClicked.addListener(handleActionClick);
});
Lepsze
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 StorageArea jest czyszczony lub gdy wartość klucza jest zmieniana lub ustawiana. Pamiętaj, że każde wystąpienie StorageArea ma własne zdarzenie onChanged.
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()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.messagebrowser.runtime.onMessage.

Jeśli nie masz konkretnego powodu, aby używać wiadomości ze skryptów service worker, wybierz wiadomości z rozszerzeń.