Erweiterungsaktionen in Manifest V3

Seit der Einführung von Chrome-Erweiterungen können Entwickler mithilfe von Aktionen Erweiterungsfunktionen direkt in der Chrome-Benutzeroberfläche auf oberster Ebene anzeigen. Eine Aktion ist eine Symbolschaltfläche, mit der ein Pop-up geöffnet oder eine Funktion in der Erweiterung ausgelöst werden kann. Bisher wurden in Chrome zwei Arten von Aktionen unterstützt: Browseraktionen und Seitenaktionen. Mit Manifest V3 wurde dies geändert, indem die Funktionen in einer neuen chrome.action API zusammengefasst wurden.

Eine kurze Geschichte der Erweiterungsaktionen

chrome.action ist zwar neu in Manifest V3, die grundlegenden Funktionen gehen jedoch auf die Zeit zurück, als Erweiterungen im Januar 2010 in der stabilen Version verfügbar wurden. Die erste stabile Version der Chrome-Erweiterungsplattform unterstützte zwei verschiedene Arten von Aktionen: Browseraktionen und Seitenaktionen.

Mit Browseraktionen konnten Entwickler von Erweiterungen ein Symbol „in der Hauptsymbolleiste von Google Chrome rechts neben der Adressleiste“ (Quelle) anzeigen und Nutzern eine einfache Möglichkeit bieten, Erweiterungsfunktionen auf jeder Seite auszulösen. Seitenaktionen hingegen sollten „Aktionen darstellen, die auf der aktuellen Seite ausgeführt werden können, aber nicht auf alle Seiten zutreffen“ (Quelle).

In der Omnibox wird eine Seitenaktion (links) angezeigt, die darauf hinweist, dass die Erweiterung auf dieser Seite etwas tun kann. Eine Browseraktion (rechts) ist immer sichtbar.

Mit Browseraktionen hatten Entwickler von Erweiterungen also eine persistente Benutzeroberfläche im Browser, während Seitenaktionen nur angezeigt wurden, wenn die Erweiterung auf der aktuellen Seite etwas Nützliches tun konnte.

Beide Aktionstypen waren optional. Entwickler von Erweiterungen konnten also entweder keine Aktionen, eine Seitenaktion oder eine Browseraktion angeben. Die Angabe mehrerer Aktionen war nicht zulässig.

Etwa sechs Jahre später wurde in Chrome 49 ein neues UI-Paradigma für Erweiterungen eingeführt. Damit Nutzer besser nachvollziehen können, welche Erweiterungen sie installiert haben, werden in Chrome jetzt alle aktiven Erweiterungen rechts neben der Omnibox angezeigt. Nutzer können Erweiterungen bei Bedarf in das Chrome-Menü verschieben.

Ausgeblendete Erweiterungssymbole werden im Chrome-Menü angezeigt.

Damit für jede Erweiterung ein Symbol angezeigt werden kann, wurden mit diesem Update auch zwei wichtige Änderungen am Verhalten von Erweiterungen in der Chrome-Benutzeroberfläche eingeführt. Zuerst wurden in der Symbolleiste Symbole für alle Erweiterungen angezeigt. Wenn die Erweiterung kein Symbol hat, wird in Chrome automatisch eines generiert. Zweitens wurden Seitenaktionen neben Browseraktionen in die Symbolleiste verschoben und es wurde eine Option hinzugefügt, um zwischen den Status „Anzeigen“ und „Ausblenden“ zu unterscheiden.

Eine deaktivierte Seitenaktion (links) wird in der Symbolleiste als Graustufenbild gerendert, während eine aktivierte Aktion (rechts) in Farbe angezeigt wird.

Durch diese Änderung konnten Erweiterungen für Seitenaktionen weiterhin wie erwartet funktionieren. Die Rolle von Seitenaktionen hat sich jedoch im Laufe der Zeit verringert. Eine der Auswirkungen des UI-Redesigns war, dass Seitenaktionen effektiv in Browseraktionen eingegliedert wurden. Da alle Erweiterungen in der Symbolleiste angezeigt wurden, erwarteten Nutzer, dass die Erweiterung aufgerufen wird, wenn sie auf das Symbol der Erweiterung in der Symbolleiste klicken. Browseraktionen wurden für Chrome-Erweiterungen immer wichtiger.

Änderungen bei Manifest V3

Die Chrome-Benutzeroberfläche und ‑Erweiterungen haben sich in den Jahren nach der Neugestaltung der Benutzeroberfläche von Erweiterungen im Jahr 2016 weiterentwickelt, aber Browser- und Seitenaktionen sind weitgehend unverändert geblieben. Das war zumindest so, bis wir damit begannen, die Erweiterungsplattform mit Manifest V3 zu modernisieren.

Dem Erweiterungsteam war klar, dass die Unterscheidung zwischen Browser- und Seitenaktionen zunehmend bedeutungslos wurde. Schlimmer noch: Aufgrund der subtilen Verhaltensunterschiede war es für Entwickler schwierig zu entscheiden, welche Version sie verwenden sollten. Wir haben festgestellt, dass wir diese Probleme beheben können, indem wir die Browseraktion und die Seitenaktion in einer einzigen „Aktion“ kombinieren.

Rufen Sie die Action API auf. chrome.action ist der chrome.browserAction am ähnlichsten, weist aber einige bemerkenswerte Unterschiede auf.

In chrome.action wird zuerst eine neue Methode namens getUserSettings() eingeführt. Mit dieser Methode können Erweiterungs-Entwickler prüfen, ob der Nutzer die Aktion der Erweiterung an die Symbolleiste angepinnt hat.

let userSettings = await chrome.action.getUserSettings();
console.log(`Is the action pinned? ${userSettings.isOnToolbar ? 'Yes' : 'No'}.`);

„getUserSettings“ mag im Vergleich zu „isPinned“ ein etwas ungewöhnlicher Name für diese Funktion erscheinen. Die bisherige Entwicklung von Chrome zeigt jedoch, dass sich die Benutzeroberfläche des Browsers schneller ändert als Erweiterungs-APIs. Daher möchten wir mit dieser API aktionsbezogene Nutzereinstellungen auf generischen Oberflächen bereitstellen, um zukünftige API-Änderungen zu minimieren. Außerdem können andere Browseranbieter browserspezifische UI-Konzepte im Objekt UserSettings bereitstellen, das von dieser Methode zurückgegeben wird.

Zweitens können das Symbol und der aktivierte/deaktivierte Status der Aktion einer Erweiterung über die Declarative Content API gesteuert werden. Das ist wichtig, da Erweiterungen so auf das Browserverhalten des Nutzers reagieren können, ohne auf die Inhalte oder URLs der besuchten Seiten zuzugreifen. Sehen wir uns an, wie eine Erweiterung ihre Aktion beispielsweise aktivieren kann, wenn der Nutzer Seiten auf beispiel.de besucht.

// Manifest V3
chrome.runtime.onInstalled.addListener(() => {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {
    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: {hostSuffix: '.example.com'},
          })
        ],
        actions: [new chrome.declarativeContent.ShowAction()]
      }
    ]);
  });
});

Der obige Code entspricht fast genau dem, was eine Erweiterung mit einer Seitenaktion tun würde. Der einzige Unterschied besteht darin, dass in Manifest V3 declarativeContent.ShowAction anstelle von declarativeContent.ShowPageAction in Manifest V2 verwendet wird.

Schließlich können Contentblocker die Methode setExtensionActionOptions der declarativeNetRequest API verwenden, um die Anzahl der von der Erweiterung für einen bestimmten Tab blockierten Anfragen anzuzeigen. Diese Funktion ist wichtig, da sie es Contentblockern ermöglicht, Endnutzer zu informieren, ohne potenziell vertrauliche Browsermetadaten der Erweiterung zu offenbaren.

Zusammenfassung

Die Modernisierung der Chrome-Erweiterungsplattform war einer der Hauptgründe für Manifest V3. In vielen Fällen bedeutete das den Wechsel zu neuen Technologien, aber auch die Vereinfachung unserer API-Oberfläche. Das war unser Ziel.

Ich hoffe, dass dieser Beitrag Ihnen einen Einblick in diesen Teil der Manifest V3-Plattform gegeben hat. Weitere Informationen dazu, wie das Chrome-Team die Zukunft von Browsererweiterungen sieht, finden Sie in der Entwicklerdokumentation auf den Seiten Plattformvision und Manifest V3 – Übersicht. In der Google-Gruppe chromium-extensions können Sie sich auch mit anderen Entwicklern über Chrome-Erweiterungen austauschen.