Zarządzanie zdarzeniami za pomocą skryptów działających w tle

Rozszerzenia to programy działające na podstawie zdarzeń, które służą do modyfikowania lub ulepszania działania przeglądarki Chrome. Zdarzenia to reguły przeglądarki, takie jak przejście na nową stronę, usunięcie zakładki lub zamknięcie karty. Rozszerzenia monitorują te zdarzenia w skrypcie działającym w tle i reagują, używając określonych instrukcji.

Strona w tle jest wczytywana w razie potrzeby i wyładowana, gdy jest nieaktywna. Przykłady zdarzeń:

  • Rozszerzenie jest najpierw instalowane lub aktualizowane do nowej wersji.
  • Strona w tle nasłuchiwała zdarzenia i jest ono wysyłane.
  • Skrypt treści lub inne rozszerzenie wysyła wiadomość.
  • Inny widok w rozszerzeniu, np. wyskakujące okienko, wywołuje połączenie runtime.getBackgroundPage.

Po załadowaniu strona w tle pozostanie aktywna, dopóki będzie wykonywała jakieś działanie, takie jak wywołanie interfejsu API Chrome czy wysłanie żądania sieciowego. Poza tym strona w tle nie zostanie wyładowana z pamięci, dopóki wszystkie widoczne widoki i porty wiadomości nie zostaną zamknięte. Pamiętaj, że otwarcie widoku nie powoduje wczytania strony zdarzenia, a jedynie zapobiega jej zamknięciu po załadowaniu.

Skuteczne skrypty działające w tle pozostają uśpione do czasu, aż nasłuchują zdarzeń, reagują na określone instrukcje, a potem wyładują się z ładunku.

Zarejestruj skrypty działające w tle

Skrypty działające w tle są rejestrowane w pliku manifestu w polu "background". Są one wymienione w tablicy za kluczem "scripts", a pole "persistent" musi mieć wartość fałsz.

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  ...
}

W przypadku kodu modułowego można zarejestrować wiele skryptów działających w tle.

{
    "name": "Awesome Test Extension",
    ...
    "background": {
      "scripts": [
        "backgroundContextMenus.js",
        "backgroundOmniBox.js",
        "backgroundOauth.js"
      ],
      "persistent": false
    },
    ...
  }

Jeśli rozszerzenie używa obecnie stałej strony w tle, zapoznaj się z przewodnikiem po migracji w tle, aby dowiedzieć się, jak przejść na model nietrwały.

Zainicjuj rozszerzenie

Wykrywaj zdarzenie runtime.onInstalled, aby zainicjować rozszerzenie podczas instalacji. Umożliwia ono ustawienie stanu lub jednorazowe inicjowanie, np. za pomocą menu kontekstowego.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

Konfigurowanie detektorów

Ułóż strukturę skryptów w tle wokół zdarzeń, od których zależy rozszerzenie. Zdefiniowanie zdarzeń istotnych dla działania sprawia, że skrypty działające w tle mogą pozostawać nieaktywne do czasu ich uruchomienia i zapobiegają pomijaniu ważnych aktywatorów rozszerzenia.

Detektory muszą być rejestrowane synchronicznie od początku strony.

chrome.runtime.onInstalled.addListener(function() {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(function() {
  // do something
});

Nie rejestruj detektorów asynchronicznie, ponieważ nie będą one wywoływane prawidłowo.

chrome.runtime.onInstalled.addListener(function() {
  // ERROR! Events must be registered synchronously from the start of
  // the page.
  chrome.bookmarks.onCreated.addListener(function() {
    // do something
  });
});

Rozszerzenia mogą usuwać słuchaczy ze skryptów w tle, wywołując metodę removeListener. Jeśli wszyscy odbiorniki zdarzenia zostaną usunięci, Chrome przestanie wczytywać skrypt rozszerzenia działający w tle.

chrome.runtime.onMessage.addListener(function(message, sender, reply) {
    chrome.runtime.onMessage.removeListener(event);
});

Filtruj zdarzenia

Używaj interfejsów API obsługujących filtry zdarzeń, aby ograniczać detektory do spraw, które są istotne dla rozszerzenia. Jeśli rozszerzenie nasłuchuje zdarzenia tabs.onUpdated, spróbuj użyć zdarzenia webNavigation.onCompleted z filtrami, ponieważ interfejs API kart nie obsługuje filtrów.

chrome.webNavigation.onCompleted.addListener(function() {
    alert("This is my favorite website!");
}, {url: [{urlMatches : 'https://www.google.com/'}]});

Reaguj na słuchacze

Detektory wyzwalają działanie po wywołaniu zdarzenia. Aby zareagować na zdarzenie, uporządkuj żądaną reakcję w obrębie zdarzenia detektora.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message.data == "setAlarm") {
    chrome.alarms.create({delayInMinutes: 5})
  } else if (message.data == "runLogic") {
    chrome.tabs.executeScript({file: 'logic.js'});
  } else if (message.data == "changeColor") {
    chrome.tabs.executeScript(
        {code: 'document.body.style.backgroundColor="orange"'});
  };
});

Wyładuj skrypty działające w tle

Dane powinny być przechowywane okresowo, aby ważne informacje nie zostały utracone w przypadku awarii rozszerzenia bez odbierania kodu onSuspend. Aby Ci w tym pomóc, użyj interfejsu storage API.

chrome.storage.local.set({variable: variableInformation});

Jeśli rozszerzenie używa przekazywania wiadomości, upewnij się, że wszystkie porty są zamknięte. Skrypt działający w tle nie zostanie wyładowany, dopóki wszystkie porty wiadomości nie zostaną zamknięte. Nasłuchiwanie zdarzenia runtime.Port.onDisconnect pozwoli Ci uzyskać informacje o zamknięciu otwartych portów. Zamknij je ręcznie za pomocą polecenia runtime.Port.disconnect.

chrome.runtime.onMessage.addListener(function(message, callback) {
  if (message == 'hello') {
    sendResponse({greeting: 'welcome!'})
  } else if (message == 'goodbye') {
    chrome.runtime.Port.disconnect();
  }
});

Czas życia skryptu w tle można obserwować, monitorując, kiedy wpis rozszerzenia pojawia się i znika z menedżera zadań Chrome.

ALT_TEXT_HERE

Otwórz menedżera zadań. Aby to zrobić, kliknij menu Chrome, najedź kursorem na więcej narzędzi i wybierz „Menedżer zadań”.

Skrypty działające w tle wyładują się automatycznie po kilku sekundach braku aktywności. Jeśli wymagane jest wyczyszczenie w ostatniej chwili, odsłuchaj zdarzenie runtime.onSuspend.

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.browserAction.setBadgeText({text: ""});
});

Zalecamy jednak przechowywanie danych zamiast stosowania runtime.onSuspend. Nie pozwala na dokładne wyczyszczenie danych i nie pomoże w przypadku awarii.