2012-04-09 1 views
2

Ich entwickeln Firefox-Erweiterung mit gebündelten ausführbaren Datei, die beim Start des Browsers ausgeführt werden sollte.Verwenden relative Pfad in Firefox-Erweiterung

Um den Prozess zu starten, brauche ich eine nsIFile oder nsILocalFile Instanz, die auf eine ausführbare Datei zeigt. Ich kenne eine Lösung, wie es Service mit Verzeichnis erhalten:

var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile); 
file.append("extensions"); 
file.append("<extension id>"); 
file.append("<relative path>"); 

Aber diese Lösung hat zwei Nachteile:

  1. Es funktioniert nicht im Entwicklungsmodus, wenn anstelle der installierten Erweiterung Ich habe nur Textdatei mit echtem Ausfahrweg

  2. ich bin nicht sicher, dass es wegen der hartkodierte „Erweiterungen“ Teils des Pfades auf allen Firefox-Konfigurationen arbeitet

Gibt es also eine schönere Möglichkeit, eine ausführbare Datei auszuführen, die mit der Firefox-Erweiterung geliefert wird?

Danke.

Antwort

3

Sie machen viel zu viele Annahmen über die Verzeichnisstruktur des Firefox-Profils - nicht. Die Add-on Manager API können Sie den Pfad einer Datei innerhalb der Erweiterung erhalten, sollten Sie es verwenden:

Components.utils.import("resource://gre/modules/AddonManager.jsm"); 

AddonManager.getAddonByID("<extension id>", function(addon) 
{ 
    var uri = addon.getResourceURI("<relative path>"); 
    var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file; 
    ... 
}); 
2

Eine Funktion startup des neustartlosen Addons (in der Datei bootstrap.js) erhält als ersten Parameter den Pfad, in dem das Addon installiert ist. Sie können dann verschiedene Tricks spielen, um Dateien innerhalb der .jar Datei zu lesen, falls vorhanden: siehe https://github.com/protz/GMail-Conversation-View/blob/master/bootstrap.js#L55 als Beispiel.

In einem Nicht-Restartless-Fall muss ich gestehen, ich habe nicht viel von einer Idee :).