Ereignisse mit Hintergrundskripts verwalten

Erweiterungen sind ereignisbasierte Programme, die dazu dienen, die Browsernutzung in Chrome zu verändern oder zu verbessern. Veranstaltungen sind Browser-Auslöser, z. B. das Aufrufen einer neuen Seite, das Entfernen eines Lesezeichens oder das Schließen eines Tabs. Diese Ereignisse werden von Erweiterungen im Hintergrundskript überwacht und dann entsprechend reagieren.

Eine Hintergrundseite wird geladen, wenn sie benötigt wird, und entladen, wenn sie inaktiv wird. Einige Beispiele für Ereignisse umfassen:

  • Die Erweiterung wird zuerst installiert oder auf eine neue Version aktualisiert.
  • Die Hintergrundseite hat auf ein Ereignis gewartet und dieses wird gesendet.
  • Über ein Content-Skript oder eine andere Erweiterung wird eine Nachricht gesendet.
  • In einer anderen Ansicht in der Erweiterung, z. B. in einem Pop-up, wird runtime.getBackgroundPage aufgerufen.

Nach dem Laden bleibt eine Hintergrundseite aktiv, solange sie eine Aktion ausführt. wie das Aufrufen einer Chrome API oder das Senden einer Netzwerkanfrage. Außerdem wird die Hintergrundseite Erst dann entladen, wenn alle sichtbaren Ansichten und Nachrichtenports geschlossen sind. Wenn Sie eine Ansicht öffnen, führt nicht zum Laden der Ereignisseite, sondern verhindert nur, dass sie nach dem Laden geschlossen wird.

Effektive Skripts im Hintergrund bleiben inaktiv, bis sie auf Brände warten, mit angegebenen Anweisungen und entladen Sie dann.

Hintergrundskripte registrieren

Hintergrundskripte werden im Manifest im Feld "background" registriert. Sie sind nach dem Schlüssel "scripts" in einem Array aufgeführt ist und "persistent" als „false“ angegeben werden sollte.

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

Für modularisierten Code können mehrere Hintergrundskripte registriert werden.

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

Wenn eine Erweiterung derzeit eine dauerhafte Hintergrundseite verwendet, lesen Sie den Abschnitt Hintergrundmigration Leitfaden mit Anleitungen zum Wechsel zu einem nicht persistenten Modell.

Erweiterung initialisieren

Warten Sie das Ereignis runtime.onInstalled, um eine Erweiterung bei der Installation zu initialisieren. Verwenden -Ereignis zum Festlegen eines Status oder zur einmaligen Initialisierung, z. B. ein Kontextmenü.

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

Hörer einrichten

Strukturieren Sie Hintergrundskripte basierend auf Ereignissen, von denen die Erweiterung abhängt. Funktionsrelevanz definieren -Ereignissen ermöglichen, dass Hintergrundskripte inaktiv sind, bis diese Ereignisse ausgelöst werden, und verhindert, ohne wichtige Trigger zu entfernen.

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

Registrieren Sie Listener nicht asynchron, da sie sonst 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 Hörer aus ihren Hintergrundskripts entfernen, indem sie removeListener aufrufen. Wenn alle Listener für ein Ereignis entfernt, lädt Chrome das Hintergrundskript der Erweiterung nicht mehr zu diesem Termin.

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

Ereignisse filtern

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

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. Um auf ein Ereignis zu reagieren, 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"'});
  };
});

Hintergrundskripte entladen

Daten sollten regelmäßig aufbewahrt werden, damit wichtige Informationen nicht verloren gehen, wenn eine Erweiterung stürzt ab, ohne onSuspend zu erhalten. Verwenden Sie dazu die Storage API.

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

Wenn eine Erweiterung die Nachrichtenweitergabe verwendet, müssen alle Ports geschlossen sein. Das Hintergrundskript erst entladen, wenn alle Nachrichtenports geschlossen sind. Ereignis runtime.Port.onDisconnect überwachen gibt Aufschluss darüber, wann offene Ports geschlossen werden. Manuell schließen 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 kann beobachtet werden, indem überwacht wird, wann ein Eintrag für die Erweiterung wird im Task-Manager von Chrome angezeigt und verschwindet.

ALT_TEXT_HERE

Öffnen Sie den Task-Manager, indem Sie auf das Chrome-Menü klicken, den Mauszeiger auf weitere Tools bewegen und "Task Verwaltungskonto“.

Die Skripts im Hintergrund werden nach einigen Sekunden Inaktivität von selbst entladen. Bei Bedarf in letzter Minute ist erforderlich, warten Sie das Ereignis runtime.onSuspend ab.

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

Allerdings sollten die gespeicherten Daten gegenüber runtime.onSuspend bevorzugt werden. Nicht ermöglichen so viel Bereinigungsbedarf wie nötig und helfen bei einem Unfall nicht weiter.