OSX - 更改特殊路径,特别是更新传送到的文件夹

OSX - Change special paths, especialy folder to which update is delivered

这是一个 firefox 插件问题,只是为你标记 osx。

在 MacOS X 上,我已将 /Applications/Firefox.app 的所有内容复制到 /Users/noit/Desktop/custom profile.app。除了所有文件都被复制为别名(文件夹被复制为文件夹)。只有非别名文件是 custom profile.app/Contents/Resources/firefox.icns 中的图标,我用自定义图标覆盖了那个。 (准确地说,plist.info 已被复制,但 CFBundleExecutable 已更改为我放置在 MacOS 文件夹中的新执行程序,它使用命令行参数从 MacOS 启动 firefox,以确保正确的配置文件启动)

这允许我 运行 作为 "shortcut" 的单独配置文件。现在,如果用户 "Keeps in Dock" 显示停靠栏图标,或者在重新启动计算机时标记 "Re-open windows from last time",或者如果用户右键单击停靠栏图标并显示 "Open at log in",或者如果用户重新启动 Firefox,它会正确启动进入正确的配置文件。额外的好处是它遵循自定义图标。

从这里运行创建配置文件时出现的一些问题:

谢谢

编辑:

这是右边的常规应用和左边的别名复制应用之间的区别:

https://www.diffchecker.com/lihx3o8w

所以改变的键一共是20个:

Key             Regular.app                                                                 Alias.app
`XREExeF`       `/Applications/Firefox.app/Contents/MacOS/firefox`                          `/Users/noit/Desktop/Firefox - dev.app/Contents/MacOS/firefox`
`ProfLDS`       `/Users/noit/Library/Caches/Firefox/Profiles/jv5ijq47.Unnamed Profile 1`    `/Users/noit/Library/Application Support/Firefox/Profiles/jv5ijq47.Unnamed Profile 1`
`XREAppDist`    `/Applications/Firefox.app/Contents/Resources/distribution`                 `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/distribution`
`UpdRootD`      `/Users/noit/Library/Caches/Mozilla/updates/Applications/Firefox`           `/Users/noit/Library/Caches/Mozilla/updates/Users/noit/Desktop/Firefox - dev`
`DefRt`         `/Applications/Firefox.app/Contents/Resources/browser/defaults`             `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/defaults`
`PrfDef`        `/Applications/Firefox.app/Contents/Resources/defaults/pref`                `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/defaults/pref`
`profDef`       `/Applications/Firefox.app/Contents/Resources/browser/defaults/profile`     `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/defaults/profile`
`ProfDefNoLoc`  `/Applications/Firefox.app/Contents/Resources/browser/defaults/profile`     `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/defaults/profile`
`ARes`          `/Applications/Firefox.app/Contents/Resources/browser/res`                  `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/res`
`AChrom`        `/Applications/Firefox.app/Contents/Resources/browser/chrome`               `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/chrome`
`APlugns`       `/Applications/Firefox.app/Contents/Resources/browser/plugins`              `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/plugins`
`SrchPlugns`    `/Applications/Firefox.app/Contents/Resources/browser/searchplugins`        `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser/searchplugins`
`ProfLD`        `/Users/noit/Library/Caches/Firefox/Profiles/jv5ijq47.Unnamed Profile 1`    `/Users/noit/Library/Application Support/Firefox/Profiles/jv5ijq47.Unnamed Profile 1`
`XPIClnupD`     `/Applications/Firefox.app/Contents/Resources/browser`                      `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser`
`CurProcD`      `/Applications/Firefox.app/Contents/Resources/browser`                      `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser`
`XCurProcD`     `/Applications/Firefox.app/Contents/Resources/browser`                      `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources/browser`
`XpcomLib`      `/Applications/Firefox.app/Contents/MacOS/XUL`                              `/Users/noit/Desktop/Firefox - dev.app/Contents/MacOS/XUL`
`GreD`          `/Applications/Firefox.app/Contents/Resources`                              `/Users/noit/Desktop/Firefox - dev.app/Contents/Resources`
`GreBinD`       `/Applications/Firefox.app/Contents/MacOS`                                  `/Users/noit/Desktop/Firefox - dev.app/Contents/MacOS`

我认为我的方向是正确的:https://dxr.mozilla.org/mozilla-central/source/toolkit/mozapps/update/tests/unit_aus_update/head_update.js#3389

如果你复制粘贴下面的代码,如果你这样做,它将替换路径:Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get('XREExeF', Ci.nsIFile).path; 但如果你这样做 FileUtils.getFile('XREExeF', []),它会抛出

[Exception... "Component returned failure code: 0x80520015 (NS_ERROR_FILE_ACCESS_DENIED) [nsIFile.create]" nsresult: "0x80520015 (NS_ERROR_FILE_ACCESS_DENIED)" location: "JS frame :: resource://gre/modules/FileUtils.jsm :: FileUtils_getDir :: line 70" data: no]

关于如何修复此错误的任何想法?

我认为我真的走对了路!谢谢! :D

function do_get_file(path, allowNonexistent) { //https://dxr.mozilla.org/mozilla-central/source/mobile/android/base/tests/robocop_head.js#803
  try {
    let lf = Components.classes["@mozilla.org/file/directory_service;1"]
      .getService(Components.interfaces.nsIProperties)
      .get("CurWorkD", Components.interfaces.nsILocalFile);

    let bits = path.split("/");
    for (let i = 0; i < bits.length; i++) {
      if (bits[i]) {
        if (bits[i] == "..")
          lf = lf.parent;
        else
          lf.append(bits[i]);
      }
    }

    if (!allowNonexistent && !lf.exists()) {
      // Not using do_throw(): caller will continue.
      _passed = false;
      var stack = Components.stack.caller;
      console.error("TEST-UNEXPECTED-FAIL | " + stack.filename + " | [" +
            stack.name + " : " + stack.lineNumber + "] " + lf.path +
            " does not exist\n");
    }

    return lf;
  }
  catch (ex) {
    console.error(ex.toString(), Components.stack.caller);
  }

  return null;
}

var gTestID = 'gTestID/';
function getApplyDirPath() {
  return gTestID + "/dir.app/";
}

function getApplyDirFile(aRelPath, aAllowNonexistent) {
  let relpath = getApplyDirPath() + (aRelPath ? aRelPath : "");
  return do_get_file(relpath, aAllowNonexistent);
}
var DIR_MACOS = 'DIR_MACOS';
var FILE_APP_BIN = 'FILE_APP_BIN';
var XRE_EXECUTABLE_FILE = 'XREExeF';
var XRE_UPDATE_ROOT_DIR = 'XRE_UPDATE_ROOT_DIR';
let dirProvider = {
    getFile: function AGP_DP_getFile(aProp, aPersistent) {
      aPersistent.value = true;
      switch (aProp) {
        case XRE_EXECUTABLE_FILE:
            return getApplyDirFile(DIR_MACOS + FILE_APP_BIN, true);
          break;
      }
      return null;
    },
    QueryInterface: function(aIID) {
      if (aIID.equals(Ci.nsIDirectoryServiceProvider) ||
          aIID.equals(Ci.nsISupports))
        return this;
      throw Cr.NS_ERROR_NO_INTERFACE;
    }
  };

var ds = Services.dirsvc.QueryInterface(Ci.nsIDirectoryService);
ds.QueryInterface(Ci.nsIProperties).undefine('XREExeF');
console.log(rez)
ds.registerProvider(dirProvider);