如何确定扩展的目录

How to determine the extension's directory

本文关键字:扩展 何确定      更新时间:2023-09-26

我需要从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();

从 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>标志,否则您的扩展将不会在安装时解压缩(出于性能原因),并且磁盘上将没有与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();

Firefox 4 取代了 nsIExtensionManager 的使用,转而使用 Add-on Manager。

因此,您应该将附加组件管理器用于FF>= 4

您可以使用以下内容找到用户的个人资料目录:

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

文件保存在这里可能是一个更好的主意,但我不知道上下文。