2012-04-05 28 views
5

Necesito obtener la ruta del directorio de extensión instalado desde JavaScript.Cómo determinar el directorio de la extensión

Mi objetivo es escribir en un archivo JSON dentro del directorio de extensión desde una extensión de Firefox. Para hacer eso, necesito determinar el directorio en el que está instalada la extensión dentro del perfil de Firefox.

utilizo este código:

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(); 

Se lanza el siguiente error:

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

que esencialmente tiene que conseguir el camino de la extensión automática de JavaScript. Comprobé la identificación de mi extensión y también intenté escribir en archivos de otras extensiones sin suerte.


Muchas gracias por sus respuestas. No me permitió resolver mi problema al instante de todos modos, pero me obligó a leer la documentación de Mozilla. Finalmente entendí cómo funciona. Gracias de nuevo.

solución a la pregunta anterior:

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

Creo que usted necesita estar seguro de que su extensión es desempaquetado con el fin de escribir archivos en su directorio de instalación. – erikvold

+0

por lo que es posible que desee guardar el archivo en el directorio de perfil del usuario. – erikvold

Respuesta

2

partir de Firefox 4 que usted debe utilizar el 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); 
}); 

Tenga en cuenta que la nueva API es asíncrona, ir a buscar los datos sobre una extensión puede tomar tiempo. Además, deberá especificar <em:unpack>true</em:unpack> flag en su install.rdf, de lo contrario su extensión no se desempaquetará al momento de la instalación (por razones de rendimiento) y no habrá ningún archivo en el disco correspondiente al config.json (será una ubicación dentro del archivo XPI empaquetado) . Existe otro problema con la escritura en el directorio de extensiones: todos los archivos se reemplazarán cuando se actualice la extensión. Una mejor idea podría ser escribir en un archivo en el directorio de perfil, entonces no tendrá que sacrificar el rendimiento.

Escribir en un archivo se puede simplificar usando 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

Puede encontrar el directorio de perfil del usuario con:

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

Es probablemente una mejor idea para guardar el archivo aquí, pero Don no conozco el contexto.

Cuestiones relacionadas