Ereignisse mit Hintergrundskripts verwalten

Erweiterungen sind ereignisbasierte Programme, die dazu dienen, das Surfen mit Chrome zu modifizieren oder zu verbessern. Ereignisse sind Browsertrigger, z. B. das Aufrufen einer neuen Seite, das Entfernen eines Lesezeichens oder das Schließen eines Tabs. Erweiterungen überwachen diese Ereignisse im Hintergrundskript und reagieren dann mit bestimmten Anweisungen.

Eine Hintergrundseite wird bei Bedarf geladen und bei Inaktivität entladen. Beispiele für Ereignisse:

  • Die Erweiterung wird zuerst installiert oder auf eine neue Version aktualisiert.
  • Die Hintergrundseite hat auf ein Ereignis gewartet, und das Ereignis wird ausgelöst.
  • Ein Inhaltsskript oder eine andere Erweiterung sendet eine Nachricht.
  • In einer anderen Ansicht in der Erweiterung, z. B. in einem Pop-up, wird runtime.getBackgroundPage aufgerufen.

Nach dem Laden wird eine Hintergrundseite weiter angezeigt, solange sie eine Aktion ausführt, z. B. das Aufrufen einer Chrome API oder das Senden einer Netzwerkanfrage. Außerdem wird die Hintergrundseite erst entladen, wenn alle sichtbaren Ansichten und alle Nachrichtenports geschlossen sind. Das Öffnen einer Ansicht führt nicht dazu, dass die Ereignisseite geladen wird, sondern nur verhindert, dass sie nach dem Laden geschlossen wird.

Effektive Hintergrundskripte bleiben inaktiv, bis sie ein Ereignis überwachen, das auf Brände wartet, mit bestimmten Anweisungen reagieren und dann entladen werden.

Hintergrundskripts registrieren

Hintergrundskripts werden im Manifest im Feld "background" registriert. Sie werden in einem Array nach dem Schlüssel "scripts" aufgeführt und für "persistent" muss „false“ angegeben werden.

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

Es können mehrere Hintergrundskripts für modularisierten Code registriert werden.

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

Wenn eine Erweiterung derzeit eine persistente Hintergrundseite verwendet, findest du im Leitfaden zur Hintergrundmigration eine Anleitung zum Wechsel zu einem nicht persistenten Modell.

Erweiterung initialisieren

Warten Sie auf das runtime.onInstalled-Ereignis, um eine Erweiterung bei der Installation zu initialisieren. Verwenden Sie dieses Ereignis, um einen Status festzulegen oder eine einmalige Initialisierung durchzuführen, beispielsweise für ein Kontextmenü.

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

Listener einrichten

Strukturieren Sie Hintergrundskripts um Ereignisse, von denen die Erweiterung abhängig ist. Wenn Sie funktionell relevante Ereignisse definieren, können Hintergrundskripts inaktiv bleiben, bis diese Ereignisse ausgelöst werden. Außerdem wird verhindert, dass der Erweiterung wichtige Trigger fehlen.

Listener müssen vom Anfang der Seite synchron registriert werden.

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
});

Listener sollten nicht asynchron registriert werden, da sie nicht ordnungsgemäß ausgelöst werden.

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

Erweiterungen können Listener aus ihren Hintergrundskripts entfernen, indem sie removeListener aufrufen. Wenn alle Listener für ein Ereignis entfernt werden, lädt Chrome das Hintergrundskript der Erweiterung für dieses Ereignis nicht mehr.

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

Ereignisse filtern

Verwenden Sie APIs, die Ereignisfilter unterstützen, um die Listener auf die Fälle zu beschränken, die für die Erweiterung relevant sind. Wenn eine Erweiterung auf das Ereignis tabs.onUpdated wartet, versuchen Sie stattdessen, das Ereignis webNavigation.onCompleted mit Filtern zu verwenden, da die Tabs API keine Filter unterstützt.

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

Auf Zuhörer reagieren

Listener dienen zum Auslösen von Funktionen, sobald ein Ereignis ausgelöst wurde. Wenn Sie auf ein Ereignis reagieren möchten, strukturieren Sie die gewünschte Reaktion innerhalb des Listener-Ereignisses.

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"'});
  };
});

Hintergrund-Skripts entladen

Daten sollten regelmäßig gespeichert werden, damit keine wichtigen Informationen verloren gehen, wenn eine Erweiterung ohne Empfang von onSuspend abstürzt. Verwenden Sie dazu die storage API.

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

Wenn eine Erweiterung die Nachrichtenübergabe verwendet, müssen alle Ports geschlossen sein. Das Hintergrundskript wird erst entladen, wenn alle Nachrichtenports geschlossen wurden. Wenn Sie das Ereignis runtime.Port.onDisconnect beobachten, erhalten Sie Informationen dazu, wann offene Ports geschlossen werden. Schließen Sie sie manuell mit runtime.Port.disconnect.

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

Die Lebensdauer eines Hintergrundskripts lässt sich beobachten, indem überwacht wird, wann ein Eintrag für die Erweiterung erscheint und im Task-Manager von Chrome verschwindet.

ALT_TEXT_HERE

Öffnen Sie den Task-Manager, indem Sie auf das Chrome-Menü klicken, den Mauszeiger auf weitere Tools bewegen und „Task-Manager“ auswählen.

Hintergrundscripts werden nach einigen Sekunden Inaktivität automatisch entladen. Wenn eine Bereinigung in letzter Minute erforderlich ist, warten Sie auf das Ereignis runtime.onSuspend.

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

Persistente Daten sollten jedoch gegenüber runtime.onSuspend bevorzugt werden. Sie ermöglicht nicht so viel Bereinigung wie nötig und hilft im Falle eines Absturzes nicht.