# Browser Extensions

Browser Extensions (englisch für Browser-Erweiterungen, auch WebExtensions genannt) ist ein Standard für Browsererweiterungen, der in den meisten aktuellen Webbrowsern umgesetzt wird. Das Format basiert auf den Erweiterungen für Google Chrome, wird inzwischen aber auch von anderen Browsern unterstützt und gemeinsam weiterentwickelt.

## Name

Der Standard nutzt als Bezeichnung den generischen Namen Browser Extensions. Opera-Entwickler bevorzugen Navigator Extensions, während Mozilla den Begriff WebExtensions verwendet.

## Geschichte

Lange Zeit hatte jeder Browser sein eigenes Format für Erweiterungen, lediglich sehr eng verwandte Browser nutzten das gleiche Format. Für Chrome entwickelte Google ein eigenes Erweiterungsformat, das vollständig auf Webtechnologien basiert.
Als Opera 2013 mit der Version 15 zur Rendering-Engine Blink wechselte, wurde auch Unterstützung für Googles Browsererweiterungen mit einigen Opera-spezifischen Zusätzen eingeführt, gleichzeitig äußerten Opera-Entwickler die Idee, das Format zu einem browserübergreifenden Standard zu machen.
Drei Jahre später, im Mai 2016, gründeten Opera, Microsoft und Mozilla die Extensions Community Group, um das Format zu spezifizieren.
Kurz darauf führte Microsoft die Unterstützung mit Edge 10 ein, zeitgleich erreichte Mozillas Implementierung mit Firefox 48 einen stabilen Status.
Seit Ende 2017 sind mit Firefox 57 WebExtensions das einzige unterstützte Erweiterungsformat in Firefox. Das führte zur Entwicklung von WaterFox und CyberFox, auf Firefox 52 ESR-basierende Alternativen, mit dem Ziel, die Abwärtskompatibilität zum alten Add-On-Format beizubehalten.
Ziel des Standards ist es zunächst, ein gemeinsames Format und die wichtigsten Programmierschnittstellen (APIs) zu spezifizieren. Damit soll es möglich sein, Browsererweiterungen zu schreiben, die entweder direkt in allen Browsern funktionieren, oder zumindest aus einer gemeinsamen Codebasis direkt für alle Browser erstellt werden können. Über den Standard hinaus können Browser eigene APIs implementieren, die dann von Erweiterungen in diesem Browser genutzt werden können.

## Technik

Browsererweiterungen bestehen aus mehreren Dateien, die üblicherweise in einem ZIP-Container zusammengefasst werden. Die zentrale Datei ist dabei manifest.json, eine Datei im JSON-Format mit wichtigen Daten über die Erweiterung. Neben allgemeinen Metadaten wie dem Namen der Erweiterung und Angaben zum Entwickler enthält diese Datei auch die Berechtigungen, die für die Erweiterung notwendig sind, und sie gibt an, in welcher Situation welcher Code ausgeführt werden soll. Wenn beispielsweise auf allen Seiten von Wikipedia ein bestimmter Code ausgeführt werden soll, so kann er mit folgendem Eintrag in der Manifest-Datei festgelegt werden:
Der Code selbst ist in JavaScript geschrieben, zudem kommen HTML und CSS zum Einsatz, beispielsweise für Konfigurationsseiten. Neben den üblichen APIs, die allen Webseiten zur Verfügung stehen, kann die Erweiterung über das globale browser-Objekt je nach erteilten Berechtigungen mit dem Browser und der aufgerufenen Seite interagieren. So kann eine Erweiterung mit dem folgenden Code ein Lesezeichen anlegen, vorausgesetzt sie besitzt die Berechtigung dazu:
Unterschiedliche Browser stellen unterschiedliche APIs zur Verfügung, zum einen, weil einige Schnittstellen erst noch implementiert werden müssen, zum anderen, weil bestimmte Funktionen in einigen Browsern grundsätzlich nicht vorgesehen sind. So gibt es die API, um eine Seitenleiste zu implementieren, nur in Browsern, die Seitenleisten auch tatsächlich verwenden, und fehlt in anderen Browsern. Wie für Webseiten üblich können solche Unterschiede zwischen den Browsern am Vorhandensein oder Fehlen der entsprechenden Methoden erkannt und geeignet behandelt werden. Ebenso gibt es Polyfills, die die Unterschiede zwischen den Browsern ausgleichen.
Damit Sicherheitslücken in Browsererweiterungen nicht so leicht zur Einschleusung von Schadcode genutzt werden können, gelten für Erweiterungen strenge CSP-Regeln, die allerdings bei Bedarf auch gelockert werden können. Zudem gilt die übliche Same-Origin-Policy, eine Erweiterung kann also nur ihre eigenen Daten lesen. Auch diese Einschränkung kann bei Bedarf aufgehoben oder gelockert werden. Über den Standard hinaus fordern Browser zudem in der Regel, dass die Erweiterung eine digitale Signatur enthält.

## Kompatibilität

Google Chrome unterstützt diese Browsererweiterungen ab Version 4, allerdings in der ursprünglichen eigenen Variante. Insbesondere heißt das globale Objekt nicht browser, sondern chrome. Die ZIP-Datei wird mit einem speziellen Header versehen und nutzt als Dateiendung crx für Chrome Extension.
Opera unterstützt das Format ab Version 15 und verwendet neben dem chrome-Objekt auch das globale Objekt opr für eigene APIs. Als Dateiendung kommt bei Opera nex für Navigator Extension zum Einsatz. Die Implementierung ist weitgehend kompatibel zu Google Chrome, mit nur wenigen fehlenden APIs und einigen zusätzlichen Funktionen.
Firefox führte eine Unterstützung schrittweise ab Version 42 ein und baute den Umfang mit den folgenden Versionen kontinuierlich aus. Der Zugriff auf die APIs kann sowohl über das globale browser-Objekt als auch über chrome erfolgen. Die Mehrheit der vorhandenen Chrome-Erweiterungen funktioniert auch in Firefox. Als Dateiendung wird wie für bisherige Firefox-Erweiterungen weiterhin xpi verwendet.
Microsoft Edge implementiert den Standard ab Version 14 und bietet ein automatisches Konvertierungswerkzeug an, mit dem für Chrome geschriebene Erweiterungen auch für Edge einsatzfähig gemacht werden können.