Как пройти через каталог в Mozilla Firefox 4.0 и более поздних версиях? - PullRequest
1 голос
/ 21 января 2012

Используется для этого так:

// Firefox 3.6 and before; Mozilla 1.9.2 and before  
var ext = this.Cc["@mozilla.org/extensions/manager;1"]
              .getService(this.Ci.nsIExtensionManager)
              .getInstallLocation(id)
              .getItemLocation(id); 

// list all XML files in the installation folder:
var entries = ext.directoryEntries;
var files = [];

while(entries.hasMoreElements())
{ )

Как мне получить переменную ext сейчас? Я получил следующее:

Components.utils.import("resource://gre/modules/AddonManager.jsm");  
AddonManager.getAddonByID(id, function(addon) {
  ext = addon.getResourceURI("");  }

Но не уверен, как на самом деле получить информацию каталога для его прохождения ...

1 Ответ

0 голосов
/ 23 января 2012

Возможно, каталог для обхода отсутствует - начиная с Firefox 4 расширения больше не распаковываются при их установке, поэтому URI ресурса будет указывать на файл XPI (по схеме протокола jar:).Опять же, в некоторых случаях расширение будет распаковано после установки, тогда вы получите file:/// URI.Таким образом, вы должны сделать что-то вроде этого (не проверено):

var uri = addon.getResourceURI("");
if (uri instanceof Components.interfaces.nsIJARURI)
{
  var xpiFile = uri.JARFile.QueryInterface(Components.interfaces.nsIFileURL).file;
  var reader = Components.classes["@mozilla.org/libjar/zip-reader;1"]
                         .createInstance(Components.interfaces.nsIZipReader);
  reader.init(xpiFile);
  var enumerator = reader.findEntries(null);
  while (enumerator.hasMoreElements())
  {
    var entry = enumerator.getNext().QueryInterface(Components.interfaces.nsIZipEntry);
    alert(entry.name);
  }
  reader.close();
}
else if (uri instanceof Components.interfaces.nsIFileURL)
{
  var dir = uri.file;
  var enumerator = dir.directoryEntries;
  while (enumerator.hasMoreElements())
  {
    var entry = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile);
    alert(entry.path);
  }
}
else
  throw new Error("Unexpected install location");
...