2012-04-05 4 views
5

Je dois obtenir le chemin du répertoire installé de l'extension à partir de JavaScript.Comment déterminer le répertoire de l'extension

Mon but est d'écrire dans un fichier JSON dans le répertoire d'extension à partir d'une extension Firefox. Pour ce faire, j'ai besoin de déterminer le répertoire dans lequel l'extension est installée dans le profil de Firefox.

J'utilise ce code:

function writeToFile() 
{ 
    var id = "[email protected]";// The extension's id from install.rdf(i.e. <em:id>) 
    var ext = Components.classes["@mozilla.org/extensions/manager;1"] 
         .getService(Components.interfaces.nsIExtensionManager) 
         .getInstallLocation(id) 
         .getItemLocation(id); 
    var file = Components.classes["@mozilla.org/file/local;1"] 
         .createInstance(Components.interfaces.nsILocalFile); 
    file.initWithPath(ext.path); 
    file.append("config.json");  
    var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"] 
          .createInstance(Components.interfaces.nsIFileOutputStream); 
    foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0); 
    var data = '[ {"id" : "2"} ]'; 
    foStream.write(data, data.length); 
    foStream.close(); 

Il jette l'erreur suivante:

TypeError:Components.classes['@mozilla.org/extensions/manager;1'] is undefined. 

J'ai besoin essentiellement pour obtenir le chemin de l'extension automatiquement à partir de JavaScript. J'ai vérifié l'ID de mon extension et j'ai également essayé d'écrire dans des fichiers d'autres extensions sans succès.


Merci beaucoup pour vos réponses. Cela ne m'a pas permis de résoudre mon problème instantanément, mais cela m'a forcé à lire la documentation de Mozilla. J'ai enfin compris comment cela fonctionne. Merci encore.

solution à la question ci-dessus:

Components.utils.import("resource://gre/modules/AddonManager.jsm"); 
    Components.utils.import("resource://gre/modules/FileUtils.jsm"); 
    AddonManager.getAddonByID("plugin_id", function(addon) { 

    var uri = addon.getResourceURI("config.json"); 
    var file = Components.classes["@mozilla.org/file/local;1"] 
         .createInstance(Components.interfaces.nsILocalFile); 
    var stringUri = uri.asciiSpec; 
    stringUri = stringUri.replace(new RegExp(/\//g), '\\'); 
    stringUri = stringUri.slice(8); 
    alert(stringUri); 
    file.initWithPath(stringUri); 
    alert(addon.hasResource("config.json")); 

    var stream = FileUtils.openFileOutputStream(file, 
               FileUtils.MODE_WRONLY 
               | FileUtils.MODE_CREATE 
               | FileUtils.MODE_TRUNCATE); 
    stream.write(dataToWrite, dataToWrite.length); 
    stream.close(); 
+1

Je pense que vous devez être sûr que votre extension est décompressé afin d'écrire des fichiers, il est le répertoire d'installation. – erikvold

+0

donc vous pouvez enregistrer le fichier dans le répertoire de profil de l'utilisateur à la place. – erikvold

Répondre

2

À partir de Firefox 4 vous devez utiliser le Add-on Manager API:

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

AddonManager.getAddonByID(id, function(addon) 
{ 
    var uri = addon.getResourceURI("config.json"); 
    if (uri instanceof Components.interfaces.nsIFileURL) 
    writeToFile(uri.file); 
}); 

Notez que la nouvelle API est asynchrone, la récupération des données sur une extension peut prendre du temps. De plus, vous devrez spécifier <em:unpack>true</em:unpack> flag dans votre install.rdf, sinon votre extension ne sera pas décompactée lors de l'installation (pour des raisons de performances) et il n'y aura aucun fichier sur le disque correspondant à config.json (ce sera plutôt un emplacement dans le fichier XPI compressé) . Il y a un autre problème avec l'écriture dans le répertoire de l'extension: tous les fichiers seront remplacés quand l'extension sera mise à jour. Une meilleure idée pourrait être d'écrire un fichier dans le répertoire du profil, vous n'aurez donc pas besoin de sacrifier les performances.

L'écriture dans un fichier peut être simplifié en utilisant FileUtils.jsm:

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

var stream = FileOutputStream.openFileOutputStream(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE); 
stream.write(data, data.length); 
stream.close(); 
0

Vous pouvez trouver le répertoire du profil de l'utilisateur:

Components.utils.import("resource://gre/modules/Services.jsm"); 
Services.dirsvc.get("ProfD", Ci.nsILocalFile) 

Il est probablement une meilleure idée d'enregistrer votre fichier ici, mais je ne Je ne connais pas le contexte.

Questions connexes