Firefox-Add-on erstellen und bei addons.mozilla.org einreichen
Was im Manifest für Firefox anders ist, wie Sie mit web-ext testen und paketieren und wie die Einreichung, Signierung und Prüfung bei addons.mozilla.org abläuft.
Ein Firefox-Add-on erstellen Sie nach demselben WebExtensions-Modell wie eine Chrome-Erweiterung: ein Ordner mit manifest.json, JavaScript und HTML. Firefox-spezifisch sind die Add-on-ID im Manifest, der Hintergrund über background.scripts und die Signierung durch Mozilla. Veröffentlicht wird kostenlos über addons.mozilla.org (AMO), lokal testen Sie über about:debugging oder das Kommandozeilenwerkzeug web-ext.
Was bei Firefox anders ist
Wer schon eine Chrome-Erweiterung gebaut hat, kennt das meiste. Die Unterschiede liegen im Detail:
| Thema | Chrome | Firefox |
|---|---|---|
| Manifest-Versionen | nur V3 | V2 und V3 |
| Hintergrund unter V3 | service_worker |
scripts (Ereignisseite mit DOM) |
| Namensraum | chrome.* |
browser.* mit Promises, chrome.* ebenfalls verfügbar |
Blockierendes webRequest unter V3 |
nicht für normale Erweiterungen | erlaubt |
| Add-on-ID | vom Store vergeben | im Manifest unter browser_specific_settings |
| Signierung | durch den Store bei Veröffentlichung | Pflicht für jede Installation in der regulären Version |
Eine Gegenüberstellung der Manifest-Versionen finden Sie im Beitrag Manifest V2 vs. V3.
Das Manifest für Firefox
Ein minimales Manifest V3 für Firefox sieht so aus:
{
"manifest_version": 3,
"name": "Tab-Notizen",
"version": "1.0.0",
"description": "Speichert eine kurze Notiz zur aktuell geöffneten Seite.",
"action": { "default_popup": "popup.html" },
"background": { "scripts": ["background.js"] },
"permissions": ["storage", "activeTab"],
"browser_specific_settings": {
"gecko": {
"id": "tab-notizen@example.org",
"data_collection_permissions": { "required": ["none"] }
}
}
}
Wichtig sind zwei Schlüssel unter browser_specific_settings.gecko:
id: Die Add-on-ID identifiziert Ihr Add-on dauerhaft. Unter Manifest V3 ist sie für die Signierung erforderlich. Üblich ist ein Format wie eine E-Mail-Adresse mit einer Domain, die Sie kontrollieren, oder eine GUID in geschweiften Klammern. Ändern Sie die ID nach der Veröffentlichung nicht mehr, sonst entsteht ein neues Add-on.data_collection_permissions: Mozilla verlangt von neuen Add-ons eine Angabe, ob und welche Daten erhoben und übertragen werden. Firefox zeigt diese Angaben bei der Installation an. Ein Add-on, das nichts überträgt, deklariert"none".
Soll dieselbe Codebasis auch in Chrome laufen, können Sie unter background sowohl scripts als auch service_worker angeben. Firefox nutzt dann die Skripte, Chrome den Service Worker. Alternativ erzeugt ein Build-Schritt je Browser ein eigenes Manifest.
Code: browser oder chrome?
Firefox stellt die APIs unter browser.* bereit und liefert dort Promises zurück. Der Namensraum chrome.* funktioniert zur Kompatibilität ebenfalls. Ein kleiner Hintergrund-Code für das Beispiel:
// background.js
browser.runtime.onMessage.addListener((nachricht) => {
if (nachricht.typ === "notiz-speichern") {
return browser.storage.local
.set({ [nachricht.url]: nachricht.text })
.then(() => ({ ok: true }));
}
// andere Nachrichten: nichts zurückgeben
});
In Firefox darf ein onMessage-Listener ein Promise zurückgeben, dessen Wert als Antwort ankommt. Wer auch Chrome bedient, prüft dieses Verhalten dort gesondert oder nutzt das Polyfill von Mozilla, das die Unterschiede glättet.
Eine Codebasis für Firefox und Chrome
Die meisten Projekte bedienen beide Browser aus einem Quellordner. Drei Wege haben sich bewährt:
- Ein gemeinsames Manifest: Unter
backgroundstehen sowohlscriptsals auchservice_worker, undbrowser_specific_settingswird von Chrome ignoriert. Das ist der einfachste Weg, solange sich die Browser nur wenig unterscheiden. - Ein Build-Schritt mit zwei Manifesten: Ein Skript erzeugt aus einer Vorlage je Browser ein eigenes Manifest und kopiert den Code in zwei Ausgabeordner. Das ist sauberer, sobald Berechtigungen oder Einstiegspunkte voneinander abweichen.
- Ein Erweiterungs-Framework: Werkzeuge, die auf Vite oder ähnlichen Bundlern aufsetzen, erzeugen die Pakete für mehrere Browser automatisch und übernehmen das Neuladen beim Entwickeln.
Unabhängig vom Weg gilt: Prüfen Sie vor dem Aufruf einer API, ob sie existiert, statt den Browser zu erkennen. Ein Ausdruck wie globalThis.browser ?? globalThis.chrome liefert in beiden Browsern einen nutzbaren Namensraum. Halten Sie außerdem die Versionsnummer für beide Pakete synchron, damit Fehlermeldungen von Nutzern eindeutig einer Version zugeordnet werden können.
Lokal testen
Über about:debugging
- Öffnen Sie
about:debuggingund wählen Sie „Dieser Firefox“. - Klicken Sie auf „Temporäres Add-on laden“ und wählen Sie die
manifest.json. - Über „Untersuchen“ öffnen Sie die Entwicklerwerkzeuge für den Hintergrund des Add-ons.
Temporäre Add-ons verschwinden beim Neustart von Firefox. Für den Alltag ist deshalb web-ext bequemer.
Mit web-ext
web-ext ist ein Kommandozeilenwerkzeug von Mozilla, das über npm installiert wird. Es startet Firefox mit Ihrem Add-on in einem frischen Profil und lädt es bei jeder Dateiänderung automatisch neu.
npm install --global web-ext
web-ext run # Firefox mit dem Add-on starten
web-ext lint # Manifest und Code prüfen wie bei AMO
web-ext build # ZIP-Paket für die Einreichung erzeugen
web-ext lint nutzt dieselben Prüfregeln wie die automatische Validierung auf AMO. Fehler, die hier auftauchen, sollten Sie vor der Einreichung beheben. Das spart Runden mit abgelehnten Uploads.
Einreichen bei addons.mozilla.org
- Konto anlegen: Melden Sie sich mit einem Mozilla-Konto im Developer Hub auf addons.mozilla.org an und akzeptieren Sie die Vereinbarung für Entwickler.
- Vertriebsweg wählen: „Auf dieser Website“ (gelistet) für den öffentlichen Katalog oder „Selbst verteilen“ (unlisted), wenn Sie die signierte Datei selbst anbieten.
- Paket hochladen: Laden Sie das ZIP aus
web-ext buildhoch. AMO validiert es automatisch und zeigt Fehler und Warnungen. - Quellcode beifügen, falls nötig: Wenn Ihr Paket gebündelten, minifizierten oder generierten Code enthält, verlangt Mozilla den Originalquellcode und eine Bauanleitung, mit der Prüfer das Paket nachbauen können.
- Angaben ausfüllen: Name, Zusammenfassung, Beschreibung, Kategorien, Screenshots, Support-Kontakt, Datenschutzerklärung bei Datenverarbeitung und eine Lizenz.
- Absenden: Nach bestandener automatischer Prüfung wird das Add-on signiert. Gelistete Add-ons können zusätzlich manuell geprüft werden, auch nach der Veröffentlichung.
Bei der Lizenz fragt AMO ausdrücklich nach. Welche Lizenz zu welchem Ziel passt, beschreibt der Beitrag Open-Source-Lizenz für Plugins wählen.
Signieren per Kommandozeile
Für automatisierte Abläufe, etwa in einer CI-Pipeline, kann web-ext sign das Paket direkt an AMO senden. Dazu erzeugen Sie im Developer Hub einen API-Schlüssel mit zugehörigem Geheimnis und übergeben beides als Parameter oder Umgebungsvariablen. Mit dem Kanal unlisted erhalten Sie eine signierte Datei zur Selbstverteilung, mit listed reichen Sie eine neue Version für den Katalog ein. Behandeln Sie die Schlüssel wie Passwörter und legen Sie sie niemals im Repository ab.
Checkliste vor dem ersten Upload
-
browser_specific_settings.gecko.idgesetzt und endgültig gewählt - Angaben zur Datenerhebung vollständig und passend zum tatsächlichen Verhalten
-
web-ext lintohne Fehler, Warnungen gelesen und bewertet - Nur Berechtigungen im Manifest, die der Code wirklich nutzt
- Kein Code, der von fremden Servern nachgeladen und ausgeführt wird
- Bei gebündeltem Code: Quellcode-Archiv und kurze Bauanleitung bereit
- Symbol, aussagekräftige Beschreibung und mindestens ein Screenshot vorbereitet
- Lizenz festgelegt und Datenschutzerklärung vorhanden, falls Daten verarbeitet werden
- Versionsnummer höher als die zuletzt hochgeladene
Wer diese Punkte vorab abhakt, erspart sich die meisten Rückfragen aus der Prüfung. Vor allem die Bauanleitung wird oft unterschätzt: Prüfer müssen aus Ihrem Quellcode exakt dasselbe Paket erzeugen können, das Sie hochgeladen haben.
Prüfung und typische Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Upload abgelehnt, ID fehlt | Manifest V3 ohne gecko.id |
ID im Manifest ergänzen |
| Warnung zu Datenerhebung | data_collection_permissions fehlt oder steht an falscher Stelle |
unter browser_specific_settings.gecko eintragen |
| Nachfrage nach Quellcode | gebündelter oder minifizierter Code | Quellcode und Bauanleitung hochladen |
Hinweis auf innerHTML |
potenziell unsichere DOM-Zuweisung | textContent oder DOM-Methoden verwenden |
| Add-on nach Update deaktiviert | Signierung oder Prüfung fehlgeschlagen | Meldungen im Developer Hub prüfen |
Prüfer achten besonders darauf, dass der Code nachvollziehbar ist, keine Daten ohne Zustimmung überträgt und keine fremden Inhalte unsicher in Seiten einfügt. Verschleierter Code ist nicht erlaubt.
Firefox für Android
Firefox für Android unterstützt Erweiterungen ebenfalls. Damit Ihr Add-on dort angeboten wird, markieren Sie es bei AMO als kompatibel mit Android und testen es vorab, etwa mit web-ext run --target=firefox-android und einem per USB verbundenen Gerät. Nicht jede API steht auf Android zur Verfügung, und Popups verhalten sich auf kleinen Bildschirmen anders.
Nach der Veröffentlichung
Jede neue Version braucht eine höhere Versionsnummer und durchläuft erneut Validierung und Signierung. Firefox aktualisiert Add-ons automatisch. Neue Berechtigungen lösen dabei eine Rückfrage bei Nutzern aus, was erfahrungsgemäß zu Abbrüchen führt. Fordern Sie Rechte deshalb so früh wie nötig, aber so sparsam wie möglich an, oder nutzen Sie optional_permissions, die erst bei Bedarf abgefragt werden. Wie Sie Versionen, Changelog und Pflege organisieren, behandelt der Bereich Add-ons veröffentlichen und pflegen.
Fragen und Antworten
- Kostet das Veröffentlichen auf addons.mozilla.org Geld?
- Nein. Konto, Einreichung und Signierung sind kostenlos. Sie brauchen lediglich ein Mozilla-Konto, mit dem Sie sich im Developer Hub anmelden.
- Kann ich ein Firefox-Add-on ohne Signierung dauerhaft installieren?
- In der regulären Firefox-Version nicht. Unsignierte Add-ons lassen sich dort nur temporär über about:debugging laden. Developer Edition, Nightly und ESR erlauben es, die Signaturpflicht für Testzwecke abzuschalten.
- Läuft meine Chrome-Erweiterung auch in Firefox?
- Oft mit wenigen Anpassungen. Typisch sind die Gecko-ID im Manifest, background.scripts statt service_worker und einzelne APIs, die Firefox anders oder gar nicht unterstützt. Der Namensraum chrome funktioniert in Firefox ebenfalls, browser ist die native Variante mit Promises.
- Was bedeutet selbst verteilt (unlisted)?
- Mozilla signiert das Paket, es erscheint aber nicht im öffentlichen Katalog. Sie bieten die Datei selbst an, etwa auf Ihrer Website oder intern. Diese Pakete werden automatisch geprüft und nur bei Bedarf manuell.
Weiterlesen
- Manifest V2 vs. V3
Service Worker statt Hintergrundseite, Regeln statt blockierendem webRequest, kein nachgeladener Code: die Unterschiede im Überblick und wie Sie migrieren.
- Veröffentlichen
Stores und Prüfprozesse, Versionsnummern und Changelog, Lizenzen und Bezahlmodelle: was nach dem letzten Commit kommt und warum ein Add-on nie ganz fertig ist.
- Lizenz für Plugins wählen
GPL, MIT und Apache 2.0 im Vergleich: was die Lizenzen erlauben und verlangen, welche Plattform welche Lizenz voraussetzt und wie Sie eine Lizenz sauber im Projekt hinterlegen.