Aktualisierung von Erweiterungen für Firefox 3.5
Dieser Artikel bietet hilfreiche Informationen für Entwickler von Erweiterungen, die versuchen, ihre Erweiterungen so zu aktualisieren, dass sie ordnungsgemäß in Firefox 3.5 funktionieren.
Grundlagen der Aktualisierung
Dieser Abschnitt behandelt die Grundlagen dessen, was Sie tun müssen, wenn Sie eine Erweiterung für eine neue Version von Firefox aktualisieren.
Testen Sie Ihre Erweiterung
Beginnen Sie mit der Bearbeitung der Datei install.rdf
Ihrer Erweiterung, indem Sie maxVersion
auf 3.5b4 aktualisieren (wenn Sie die Beta-Version 4 von Firefox 3.5 testen) und die version
Ihrer Erweiterung erhöhen.
Erstellen Sie dann ein neues Firefox-Profil, damit Ihr Testen nicht Ihr übliches Profil gefährdet. Navigieren Sie zum Verzeichnis, das Firefox enthält, und geben Sie den folgenden Befehl ein:
firefox -createProfile testBeta4
Auf dem Mac müssen Sie bis in das Firefox-Anwendungsbundle navigieren:
cd /Applications/Firefox.app/Contents/MacOS/
firefox -createProfile testBeta4
Starten Sie Firefox mit dem neuen Profil, indem Sie diesen Befehl in der Befehlszeile eingeben:
firefox -P testBeta4
Testen Sie Ihre Erweiterung gründlich. Es wird empfohlen, die folgenden Einstellungen auf true
zu setzen, um auf JavaScript-Warnungen oder -Ausnahmen hingewiesen zu werden:
javascript.options.strict
javascript.options.showInConsole
Aktualisieren Sie Ihre Erweiterung
Wenn Sie beim Testen auf Probleme stoßen, aktualisieren Sie Ihren Code, um die Probleme zu beheben. Dieser Artikel enthält nützliche Informationen über Dinge, die möglicherweise Arbeit erfordern.
Sobald Sie dies getan haben, versuchen Sie, Ihre Erweiterung erneut zu verwenden, diesmal mit Ihrem regulären Profil. Dies hilft sicherzustellen, dass die Kompatibilität mit allen vorhandenen gespeicherten Daten gegeben ist.
Aktualisieren Sie Ihre Erweiterung auf addons.mozilla.org
Schließlich ist es an der Zeit, Ihre aktualisierte Erweiterung zu veröffentlichen. Wenn Ihre Erweiterung keine Codeänderungen benötigte, können Sie sich in das AMO-Dashboard einloggen und die Kompatibilitätsversion dort aktualisieren. Andernfalls müssen Sie eine neue Version bei AMO hochladen.
Siehe Einreichen eines Add-ons bei AMO für weitere Informationen.
Zugriff auf die Places-Datenbank
Vor Firefox 3.5 erforderte der direkte Zugriff auf die Places-Datenbank über die Storage API ein wenig Trickserei:
var places = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)
.get("ProfD", Components.interfaces.nsIFile);
places.append("places.sqlite");
var db = Components.classes["@mozilla.org/storage/service;1"]
.getService(Components.interfaces.mozIStorageService)
.openDatabase(places);
Dies erstellt manuell einen Pfad zur places.sqlite
-Datenbankdatei und öffnet dann die Datei für den Speicherzugriff.
Firefox 3.5 bietet einen speziellen Dienst, der einen bequemen Zugriff auf die Places-Datenbank ermöglicht; die obige Technik funktioniert in Firefox 3.5 oder später nicht.
var db = Components.classes[
"@mozilla.org/browser/nav-history-service;1"
].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
Suchtextfelder
Der textbox
-Typ timed
ist veraltet; stattdessen sollten Sie search
verwenden.
In Firefox 3 haben Sie möglicherweise verwendet:
<textbox type="timed" timeout="1000" oncommand="alert(this.value);"/>
In Firefox 3.5 sollten Sie dies ändern zu:
<textbox type="search" timeout="1000" oncommand="alert(this.value);"/>
JSON
Das JSON.jsm JavaScript-Modul wurde in Firefox 3.5 zugunsten der nativen JSON-Objektunterstützung entfernt. Für Details siehe Verwendung von JSON in Firefox und den Artikel über JSON für einen allgemeineren Überblick über JSON und seine Verwendung in verschiedenen Firefox-Versionen.
Um die Kompatibilität mit sowohl Firefox 3 als auch Firefox 3.5 sicherzustellen, können Sie Folgendes tun:
if (typeof JSON === "undefined") {
Components.utils.import("resource://gre/modules/JSON.jsm");
JSON.parse = JSON.fromString;
JSON.stringify = JSON.toString;
}
Dies funktioniert, indem das JSON.jsm JavaScript-Modul importiert wird, falls JSON nicht nativ unterstützt wird, und dann die von diesem Modul bereitgestellten Methoden zu denjenigen des nativen JSON-Objekts zugeordnet werden, so dass sie unabhängig von der Unterstützung funktionieren.
Sie können dieses Problem auch umgehen, indem Sie direkt das nsIJSON
-Interface verwenden.
Änderungen an Kontextmenüs
Um die neuen Audio- und Videofunktionen, die in Gecko 1.9.1 hinzugefügt wurden, zu unterstützen, wurde der Getter imageURL
der nsContextMenu
-Klasse in mediaURL
umbenannt; jedoch wurde imageURL
am 9. Juni 2009 wieder hinzugefügt.
Änderungen an der Chrome-Registrierung
Firefox 3.5 schließt ein Sicherheitsproblem, das die Verwendung von Remote-Chrome ermöglichte. Dies wird sich auf jedes Add-on auswirken, das in seiner chrome.manifest
-Datei eine Ressource enthält, die auf eine Website, Daten- oder Ressourcen-URLs verweist. Details finden Sie unter Sicherheitsänderungen in Firefox 3.5.
Abrufen eines Ladekontextes von einer Anfrage
Früher war es möglich, einen Ladekontext aus einer Anfrage zu erhalten, indem verschiedene docShell-APIs abgefragt wurden. Insbesondere war es gängige Praxis, notificationCallbacks.getInterface(nsIDOMWindow)
zu verwenden, um das mit dem Ladevorgang verbundene Fensterobjekt zu erhalten. Während der ältere Ansatz unter bestimmten Umständen noch funktionieren mag, wird seine Verwendung nicht mehr empfohlen (Details).
Der korrekte und zuverlässige Weg, dies zu tun, ist die Verwendung eines nsILoadContext
(siehe die Schnittstellendefinition).
In JavaScript machen Sie es so:
var loadContext;
try {
loadContext = aRequest
.QueryInterface(Components.interfaces.nsIChannel) // aRequest is equivalent to aSubject from observe
.notificationCallbacks.getInterface(Components.interfaces.nsILoadContext);
} catch (ex) {
try {
loadContext = aRequest.loadGroup.notificationCallbacks.getInterface(
Components.interfaces.nsILoadContext,
);
} catch (ex) {
loadContext = null;
}
}
// you can now use |loadContext.associatedWindow| to get the Window object
Ein weiteres JavaScript-Beispiel, falls das oben genannte nicht funktioniert:
// SOURCE: http://stackoverflow.com/questions/10719606/is-it-possible-to-know-the-target-domwindow-for-an-httprequest
function getWindowForRequest(request) {
if (request instanceof Components.interfaces.nsIRequest) {
try {
if (request.notificationCallbacks) {
return request.notificationCallbacks.getInterface(
Components.interfaces.nsILoadContext,
).associatedWindow;
}
} catch (e) {}
try {
if (request.loadGroup && request.loadGroup.notificationCallbacks) {
return request.loadGroup.notificationCallbacks.getInterface(
Components.interfaces.nsILoadContext,
).associatedWindow;
}
} catch (e) {}
}
return null;
}
In C++ können Sie es so machen:
nsCOMPtr<nsILoadContext> loadContext;
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
NS_QueryNotificationCallbacks(channel, loadContext);
Anpassbare Symbolleisten
In Firefox 3.5 hat sich das Verhalten anpassbarer Symbolleisten geändert, so dass die <xul:toolbar/>
-Bindung nun Symbolleistenelemente aus ihrer zugehörigen <xul:toolbarpalette/>
entfernt und sie zur Symbolleiste hinzufügt, anstatt sie zu klonen und zur Symbolleiste zu kopieren. Dies bedeutet, dass die Palette nun nur noch die Elemente enthält, die nicht in der Symbolleiste vorhanden sind, im Gegensatz zum vorherigen Verhalten, bei dem alle anpassbaren Elemente enthalten waren, unabhängig davon, ob sie in der Symbolleiste angezeigt wurden oder nicht. Dies könnte Probleme für Add-ons verursachen, die darauf angewiesen sind, alle anpassbaren Symbolleistenelemente aus der <xul:toolbarpalette/>
abzurufen, oder die versuchen, Elemente dynamisch in die Palette einzufügen, um sie während der Symbolleistenanpassung verfügbar zu machen. Weitere Informationen finden Sie in Firefox Bug 407725 und WebKit Bug 467045.
XPCNativeWrapper
Ab Firefox 3.5 können Sie keine data:
-Bindings mehr in Chrome-Paketen verwenden, die XPCNativeWrapper
-Automatisierung erhalten. Dies löst ein potenzielles Sicherheitsproblem.
XUL-Dokumente erhalten nun die XPCNativeWrapper
-Behandlung, so dass Sie nun die Methode getAttribute()
verwenden müssen, um Attributwerte abzurufen, anstatt sie direkt zu lesen.
Wenn Ihre Erweiterung xpcnativewrappers=no
verwendet (was sie ohnehin nicht tun sollte, da es nicht sicher ist), wird XBL von dieser Erweiterung nicht auf Dokumente angewendet, die XPCNativeWrapper
-Automatisierung ab Firefox 3.5 verwenden.
Interessante neue Fähigkeiten
Abhören von Ereignissen in allen Tabs
Firefox 3.5 führt die Unterstützung für das Hinzufügen und Entfernen von Fortschrittsbeobachtern ein, die in allen Tabs lauschen. Siehe Ereignisse in allen Tabs abhören für Details.
Für Theme-Entwickler
- Prüfen Sie Theme-Änderungen in Firefox 3.1.
- Besuchen Sie das MozillaZine-Forum Themeänderungen für FF3.1, um einen Überblick / eine Liste aller Änderungen zwischen 3.0 und 3.1 zu erhalten, die Theme-Entwickler betreffen. Dies betrifft neue CSS-Features (wie nth-child, -moz-box-shadow, etc.), Änderungen an bestehenden Widgets, allgemeine UI-Verbesserungen und neue FF3.1-Features (Audio/Video-Unterstützung, privates Surfen, erweiterte Sitzungswiederherstellung, Box-/Fenster-/Text-Schatten).