Firefox addon 获取资源的完整本地路径://类型url?

Firefox addon 获取资源的完整本地路径://类型url?,firefox-addon,Firefox Addon,如何获取资源的完整本地路径://类型url(即resource://gre/modules/Services.jsm) 对于chrome://类型I,使用以下代码: if ((/^(chrome):/.test(url))) { let ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces["nsIIOService"]), cr = Compo

如何获取资源的完整本地路径://类型url(即resource://gre/modules/Services.jsm

对于chrome://类型I,使用以下代码:

if ((/^(chrome):/.test(url)))
{
  let ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces["nsIIOService"]),
      cr = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces["nsIChromeRegistry"]),
      ph = Components.classes["@mozilla.org/network/protocol;1?name=file"].createInstance(Components.interfaces.nsIFileProtocolHandler);

  url = cr.convertChromeURL(ios.newURI(url, "UTF-8", null)).spec;

  if (!/^file:/.test(url))
    url = "file://" + url;

  url = ph.getFileFromURLSpec(url).path;
}
有什么想法吗


谢谢。

resource://
URI由一个。它可以从

Components.classes["@mozilla.org/network/protocol;1?name=resource"].getService(Ci.nsISubstitutingProtocolHandler)
@8472 多谢各位

使用该接口,我们可以获得完整的本地路径,如下所示:

/**
 * http://mxr.mozilla.org/mozilla-release/source/devtools/server/actors/script.js#2086
 *
 * Resolve a URI back to physical file.
 *
 * Of course, this works only for URIs pointing to local resources.
 *
 * @param  aURI
 *         URI to resolve
 * @return
 *         resolved nsIURI
 */
function resolveURIToLocalPath(aURI) {
  let resolved;
  switch (aURI.scheme) {
    case "jar":
    case "file":
      return aURI;

    case "chrome":
      resolved = Cc["@mozilla.org/chrome/chrome-registry;1"].
                 getService(Ci.nsIChromeRegistry).convertChromeURL(aURI);
      return resolveURIToLocalPath(resolved);

    case "resource":
      resolved = Cc["@mozilla.org/network/protocol;1?name=resource"].
                 getService(Ci.nsIResProtocolHandler).resolveURI(aURI);
      aURI = Services.io.newURI(resolved, null, null);
      return resolveURIToLocalPath(aURI);

    default:
      return null;
  }
}

function getLocalPath(url)
{
    let uri = null;
    try
    {
        uri = resolveURIToLocalPath(ios.newURI(url, "UTF-8", null));
    }
    catch(e){}
    return uri ? uri.spec : uri;
}

console.log(getLocalPath("resource://gre/modules/Services.jsm"));
它接受带有文件://浏览器://资源://方案的url字符串