2012-04-05 4 views
5

Мне нужно получить путь к установочной директории с расширением JavaScript.Как определить каталог расширения

Моя цель - записать файл JSON в каталог расширения из расширения Firefox. Для этого мне нужно определить каталог, в котором расширение установлено в профиле Firefox.

Я использую этот код:

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

Он выдает следующее сообщение об ошибке:

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

мне по существу нужно получить путь расширения автоматически из JavaScript. Я дважды проверял идентификатор моего расширения, и я также пытался писать файлы из других расширений без везения.


Большое спасибо за ваши ответы. Это не позволило мне решить мою проблему мгновенно, но это заставило меня прочитать документацию Mozilla. Наконец, я понял, как это работает. Еще раз спасибо.

Решение на поставленный выше вопрос:

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

Я думаю, вы должны быть уверены, что ваш добавочный номер распечатывается для того, чтобы записать файлы на это каталог установки. – erikvold

+0

, поэтому вы можете сохранить файл в каталоге профиля пользователя. – erikvold

ответ

2

Начиная с Firefox 4 Вы должны использовать 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); 
}); 

Обратите внимание, что новый API является асинхронным, выборка данных о продлении может занять некоторое время. Кроме того, вам нужно будет указать <em:unpack>true</em:unpack> flag в вашем install.rdf, в противном случае расширение не будет распаковано после установки (по соображениям производительности), и на диске не будет файла, соответствующего config.json (это скорее будет местоположение внутри упакованного файла XPI) , Существует еще одна проблема с записью в каталог расширения: все файлы там будут заменены при обновлении расширения. Лучшая идея может заключаться в записи в файл в каталоге профиля, тогда вам не нужно жертвовать производительностью.

Запись в файл можно упростить с помощью 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

Firefox 4 заменить использование nsIExtensionManager в пользу Add-on Manager.

Таким образом, вы должны использовать Add-on Manager вместо для FF> = 4

0

Вы можете найти пользователя каталог профиля с:

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

Это, вероятно, лучше, чтобы сохранить файл здесь, но я не Не знаю контекста.

Смежные вопросы