2012-04-05 11 views
5

JavaScriptから拡張機能インストールされたディレクトリのパスを取得する必要があります。拡張機能のディレクトリを特定する方法

私の目標は、Firefoxの拡張機能から拡張ディレクトリ内のJSONファイルに書き込むことです。そのためには、Firefoxプロファイル内に拡張機能がインストールされているディレクトリを特定する必要があります。私は基本的に、JavaScriptから自動的に拡張のパスを取得する必要があります

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

:それは次のようなエラーがスローされます

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

私はこのコードを使用します。 私は自分の内線番号のIDを二度チェックしましたが、運がない他の内線番号からのファイルへの書き込みも試みました。


返信いただきありがとうございます。とにかく私の問題を即座に解決することはできませんでしたが、それは私に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

あなたはAdd-on Manager APIを使用する必要があります。また、install.rdf<em:unpack>true</em:unpack> flagを指定する必要があります。そうしないと、インストール時に拡張機能が解凍されず(パフォーマンス上の理由から)、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はAdd-on Managerの賛成でnsIExtensionManagerの使用を置き換えます。

ですから、FF> = 4

0

のための代わりにAdd-on Managerを使用する必要がありますあなたはしてユーザーのプロファイルディレクトリを見つけることができます。

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

それはおそらく、ここにファイルを保存するには良いアイデアですが、私ドン文脈を知りません。時間がかかることが拡張に関するデータを取得する、新しい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); 
}); 

注:Firefoxの4以降で

関連する問題