我需要从JavaScript获取扩展安装目录的路径。
我的目标是从Firefox扩展名写入扩展目录中的JSON文件。为此,我需要确定Firefox配置文件中安装扩展的目录。
我使用此代码:
function writeToFile()
{
var id = "plugin@uua";// 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自动获取扩展程序的路径。 我仔细检查了我的扩展程序的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();
答案 0 :(得分: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是异步的,获取有关扩展的数据可能需要一些时间。此外,您需要在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();
答案 1 :(得分:0)
Firefox 4取代了使用nsIExtensionManager,转而使用Add-on Manager。
因此,您应该使用Add-on Manager代替FF&gt; = 4
答案 2 :(得分:0)
您可以在以下位置找到用户的个人资料目录:
Components.utils.import("resource://gre/modules/Services.jsm");
Services.dirsvc.get("ProfD", Ci.nsILocalFile)
将文件保存在这里可能更好一点,但我不了解背景。