Pier Angelo Vendrame pushed to branch tor-browser-102.7.0esr-12.5-1 at The Tor Project / Applications / Tor Browser

Commits:

8 changed files:

Changes:

  • mozconfig-macos-x86_64
    ... ... @@ -5,4 +5,5 @@ ac_add_options --enable-strip
    5 5
     # See bug #41131
    
    6 6
     ac_add_options --disable-update-agent
    
    7 7
     
    
    8
    +ac_add_options --with-relative-data-dir=../TorBrowser-Data/Browser
    
    8 9
     ac_add_options --enable-tor-browser-data-outside-app-dir

  • toolkit/xre/nsAppRunner.cpp
    ... ... @@ -3099,13 +3099,16 @@ static ReturnAbortOnError ShowProfileManager(
    3099 3099
       return LaunchChild(false, true);
    
    3100 3100
     }
    
    3101 3101
     
    
    3102
    -#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
    
    3103
    -static ProfileStatus CheckTorBrowserDataWriteAccess(nsIFile* aAppDir) {
    
    3102
    +#ifdef XP_MACOSX
    
    3103
    +static ProfileStatus CheckTorBrowserDataWriteAccess() {
    
    3104 3104
       // Check whether we can write to the directory that will contain
    
    3105 3105
       // TorBrowser-Data.
    
    3106
    +  RefPtr<nsXREDirProvider> singleton = nsXREDirProvider::GetSingleton();
    
    3107
    +  if (!singleton) {
    
    3108
    +    return PROFILE_STATUS_OTHER_ERROR;
    
    3109
    +  }
    
    3106 3110
       nsCOMPtr<nsIFile> tbDataDir;
    
    3107
    -  nsresult rv =
    
    3108
    -      nsXREDirProvider::GetTorBrowserUserDataDir(getter_AddRefs(tbDataDir));
    
    3111
    +  nsresult rv = singleton->GetTorBrowserUserDataDir(getter_AddRefs(tbDataDir));
    
    3109 3112
       NS_ENSURE_SUCCESS(rv, PROFILE_STATUS_OTHER_ERROR);
    
    3110 3113
       nsCOMPtr<nsIFile> tbDataDirParent;
    
    3111 3114
       rv = tbDataDir->GetParent(getter_AddRefs(tbDataDirParent));
    
    ... ... @@ -5081,25 +5084,14 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
    5081 5084
       }
    
    5082 5085
     #endif
    
    5083 5086
     
    
    5084
    -#if (defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID)) || \
    
    5085
    -    defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
    
    5086
    -  nsCOMPtr<nsIFile> exeFile, exeDir;
    
    5087
    -  bool persistent;
    
    5088
    -  rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
    
    5089
    -                            getter_AddRefs(exeFile));
    
    5090
    -  NS_ENSURE_SUCCESS(rv, 1);
    
    5091
    -  rv = exeFile->GetParent(getter_AddRefs(exeDir));
    
    5092
    -  NS_ENSURE_SUCCESS(rv, 1);
    
    5093
    -#endif
    
    5094
    -
    
    5095 5087
       rv = NS_NewToolkitProfileService(getter_AddRefs(mProfileSvc));
    
    5096
    -#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
    
    5088
    +#ifdef XP_MACOSX
    
    5097 5089
       if (NS_FAILED(rv)) {
    
    5098 5090
         // NS_NewToolkitProfileService() returns a generic NS_ERROR_FAILURE error
    
    5099 5091
         // if creation of the TorBrowser-Data directory fails due to access denied
    
    5100 5092
         // or because of a read-only disk volume. Do an extra check here to detect
    
    5101 5093
         // these errors so we can display an informative error message.
    
    5102
    -    ProfileStatus status = CheckTorBrowserDataWriteAccess(exeDir);
    
    5094
    +    ProfileStatus status = CheckTorBrowserDataWriteAccess();
    
    5103 5095
         if ((PROFILE_STATUS_ACCESS_DENIED == status) ||
    
    5104 5096
             (PROFILE_STATUS_READ_ONLY == status)) {
    
    5105 5097
           ProfileErrorDialog(nullptr, nullptr, status, nullptr, mNativeApp,
    
    ... ... @@ -5216,14 +5208,12 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
    5216 5208
         if (CheckArg("test-process-updates")) {
    
    5217 5209
           SaveToEnv("MOZ_TEST_PROCESS_UPDATES=1");
    
    5218 5210
         }
    
    5219
    -#  ifndef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
    
    5220 5211
         nsCOMPtr<nsIFile> exeFile, exeDir;
    
    5221 5212
         rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
    
    5222 5213
                                   getter_AddRefs(exeFile));
    
    5223 5214
         NS_ENSURE_SUCCESS(rv, 1);
    
    5224 5215
         rv = exeFile->GetParent(getter_AddRefs(exeDir));
    
    5225 5216
         NS_ENSURE_SUCCESS(rv, 1);
    
    5226
    -#  endif
    
    5227 5217
     
    
    5228 5218
     #  ifdef TOR_BROWSER_UPDATE
    
    5229 5219
         nsAutoCString compatVersion(TOR_BROWSER_VERSION_QUOTED);
    

  • toolkit/xre/nsXREDirProvider.cpp
    ... ... @@ -56,8 +56,6 @@
    56 56
     #  include "nsIPK11Token.h"
    
    57 57
     #endif
    
    58 58
     
    
    59
    -#include "TorFileUtils.h"
    
    60
    -
    
    61 59
     #include <stdlib.h>
    
    62 60
     
    
    63 61
     #ifdef XP_WIN
    
    ... ... @@ -113,6 +111,10 @@ nsIFile* gDataDirHome = nullptr;
    113 111
     nsCOMPtr<nsIFile> gDataDirProfileLocal = nullptr;
    
    114 112
     nsCOMPtr<nsIFile> gDataDirProfile = nullptr;
    
    115 113
     
    
    114
    +#if defined(RELATIVE_DATA_DIR)
    
    115
    +mozilla::Maybe<nsCOMPtr<nsIFile>> gDataDirPortable;
    
    116
    +#endif
    
    117
    +
    
    116 118
     // These are required to allow nsXREDirProvider to be usable in xpcshell tests.
    
    117 119
     // where gAppData is null.
    
    118 120
     #if defined(XP_MACOSX) || defined(XP_UNIX)
    
    ... ... @@ -1205,14 +1207,19 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
    1205 1207
       }
    
    1206 1208
     #endif
    
    1207 1209
       nsCOMPtr<nsIFile> updRoot;
    
    1210
    +  nsCOMPtr<nsIFile> appFile;
    
    1211
    +  bool per = false;
    
    1212
    +  nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
    
    1213
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1214
    +
    
    1208 1215
     #if defined(TOR_BROWSER_UPDATE)
    
    1209 1216
       // For Tor Browser, we store update history, etc. within the UpdateInfo
    
    1210 1217
       // directory under the user data directory.
    
    1211
    -  nsresult rv = GetTorBrowserUserDataDir(getter_AddRefs(updRoot));
    
    1218
    +  rv = GetTorBrowserUserDataDir(getter_AddRefs(updRoot));
    
    1212 1219
       NS_ENSURE_SUCCESS(rv, rv);
    
    1213 1220
       rv = updRoot->AppendNative("UpdateInfo"_ns);
    
    1214 1221
       NS_ENSURE_SUCCESS(rv, rv);
    
    1215
    -#  if defined(XP_MACOSX) && defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
    
    1222
    +#  if defined(XP_MACOSX)
    
    1216 1223
       // Since the TorBrowser-Data directory may be shared among different
    
    1217 1224
       // installations of the application, embed the app path in the update dir
    
    1218 1225
       // so that the update history is partitioned. This is much less likely to
    
    ... ... @@ -1220,29 +1227,20 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
    1220 1227
       // those platforms include a "container" folder that provides partitioning
    
    1221 1228
       // by default, and we do not support use of a shared, OS-recommended area
    
    1222 1229
       // for user data on those platforms.
    
    1223
    -  nsAutoString appDirPath;
    
    1224
    -  nsCOMPtr<nsIFile> appRootDir;
    
    1225
    -  rv = GetAppRootDir(getter_AddRefs(appRootDir));
    
    1230
    +  nsAutoString appPath;
    
    1231
    +  rv = appFile->GetPath(appPath);
    
    1226 1232
       NS_ENSURE_SUCCESS(rv, rv);
    
    1227
    -  rv = appRootDir->GetPath(appDirPath);
    
    1228
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1229
    -
    
    1230
    -  int32_t dotIndex = appDirPath.RFind(".app");
    
    1233
    +  int32_t dotIndex = appPath.RFind(".app");
    
    1231 1234
       if (dotIndex == kNotFound) {
    
    1232
    -    dotIndex = appDirPath.Length();
    
    1235
    +    dotIndex = appPath.Length();
    
    1233 1236
       }
    
    1234
    -  appDirPath = Substring(appDirPath, 1, dotIndex - 1);
    
    1235
    -  rv = updRoot->AppendRelativePath(appDirPath);
    
    1237
    +  appPath = Substring(appPath, 1, dotIndex - 1);
    
    1238
    +  rv = updRoot->AppendRelativePath(appPath);
    
    1236 1239
       NS_ENSURE_SUCCESS(rv, rv);
    
    1237 1240
     #  endif
    
    1238 1241
     #else  // ! TOR_BROWSER_UPDATE
    
    1239
    -  nsCOMPtr<nsIFile> appFile;
    
    1240
    -  bool per = false;
    
    1241
    -  nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
    
    1242
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1243 1242
       rv = appFile->GetParent(getter_AddRefs(updRoot));
    
    1244 1243
       NS_ENSURE_SUCCESS(rv, rv);
    
    1245
    -
    
    1246 1244
     #  ifdef XP_MACOSX
    
    1247 1245
       nsCOMPtr<nsIFile> appRootDirFile;
    
    1248 1246
       nsCOMPtr<nsIFile> localDir;
    
    ... ... @@ -1360,6 +1358,91 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
    1360 1358
       return NS_OK;
    
    1361 1359
     }
    
    1362 1360
     
    
    1361
    +#if defined(RELATIVE_DATA_DIR)
    
    1362
    +nsresult nsXREDirProvider::GetPortableDataDir(nsIFile** aFile,
    
    1363
    +                                              bool& aIsPortable) {
    
    1364
    +  if (gDataDirPortable) {
    
    1365
    +    if (*gDataDirPortable) {
    
    1366
    +      nsresult rv = (*gDataDirPortable)->Clone(aFile);
    
    1367
    +      NS_ENSURE_SUCCESS(rv, rv);
    
    1368
    +      aIsPortable = true;
    
    1369
    +    } else {
    
    1370
    +      aIsPortable = false;
    
    1371
    +    }
    
    1372
    +    return NS_OK;
    
    1373
    +  }
    
    1374
    +
    
    1375
    +  nsCOMPtr<nsIFile> exeFile, exeDir;
    
    1376
    +  bool persistent = false;
    
    1377
    +  nsresult rv =
    
    1378
    +      GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(exeFile));
    
    1379
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1380
    +  rv = exeFile->Normalize();
    
    1381
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1382
    +  rv = exeFile->GetParent(getter_AddRefs(exeDir));
    
    1383
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1384
    +
    
    1385
    +#  if defined(XP_MACOSX)
    
    1386
    +  nsAutoString exeDirPath;
    
    1387
    +  rv = exeDir->GetPath(exeDirPath);
    
    1388
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1389
    +  // When the browser is installed in /Applications, we never run in portable
    
    1390
    +  // mode.
    
    1391
    +  if (exeDirPath.Find("/Applications/", true /* ignore case */) == 0) {
    
    1392
    +    aIsPortable = false;
    
    1393
    +    return NS_OK;
    
    1394
    +  }
    
    1395
    +#  endif
    
    1396
    +
    
    1397
    +  nsCOMPtr<nsIFile> systemInstallFile;
    
    1398
    +  rv = exeDir->Clone(getter_AddRefs(systemInstallFile));
    
    1399
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1400
    +  rv = systemInstallFile->AppendNative("system-install"_ns);
    
    1401
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1402
    +
    
    1403
    +  bool exists = false;
    
    1404
    +  rv = systemInstallFile->Exists(&exists);
    
    1405
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1406
    +  if (exists) {
    
    1407
    +    aIsPortable = false;
    
    1408
    +    gDataDirPortable.emplace(nullptr);
    
    1409
    +    return NS_OK;
    
    1410
    +  }
    
    1411
    +
    
    1412
    +  nsCOMPtr<nsIFile> localDir = exeDir;
    
    1413
    +#  if defined(XP_MACOSX)
    
    1414
    +  rv = exeDir->GetParent(getter_AddRefs(localDir));
    
    1415
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1416
    +  exeDir = localDir;
    
    1417
    +  rv = exeDir->GetParent(getter_AddRefs(localDir));
    
    1418
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1419
    +#  endif
    
    1420
    +  rv = localDir->SetRelativePath(localDir.get(),
    
    1421
    +                                 nsLiteralCString(RELATIVE_DATA_DIR));
    
    1422
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1423
    +
    
    1424
    +#  if defined(XP_MACOSX)
    
    1425
    +  // On macOS we try to create the directory immediately to switch to
    
    1426
    +  // system-install mode if needed (e.g., when running from the DMG).
    
    1427
    +  rv = localDir->Exists(&exists);
    
    1428
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1429
    +  if (!exists) {
    
    1430
    +    rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
    
    1431
    +    if (NS_FAILED(rv)) {
    
    1432
    +      aIsPortable = false;
    
    1433
    +      return NS_OK;
    
    1434
    +    }
    
    1435
    +  }
    
    1436
    +#  endif
    
    1437
    +
    
    1438
    +  gDataDirPortable.emplace(localDir);
    
    1439
    +  rv = (*gDataDirPortable)->Clone(aFile);
    
    1440
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1441
    +  aIsPortable = true;
    
    1442
    +  return rv;
    
    1443
    +}
    
    1444
    +#endif
    
    1445
    +
    
    1363 1446
     nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
    
    1364 1447
                                                         bool aLocal) {
    
    1365 1448
       // Copied from nsAppFileLocationProvider (more or less)
    
    ... ... @@ -1374,38 +1457,40 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
    1374 1457
         return gDataDirHome->Clone(aFile);
    
    1375 1458
       }
    
    1376 1459
     
    
    1377
    -#if defined(RELATIVE_DATA_DIR) || defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
    
    1378
    -#  ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
    
    1379
    -  rv = GetTorBrowserUserDataDir(getter_AddRefs(localDir));
    
    1380
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1381
    -  rv = localDir->AppendNative("Browser"_ns);
    
    1382
    -#  else
    
    1460
    +#if defined(RELATIVE_DATA_DIR)
    
    1383 1461
       RefPtr<nsXREDirProvider> singleton = GetSingleton();
    
    1384 1462
       if (!singleton) {
    
    1385 1463
         return NS_ERROR_OUT_OF_MEMORY;
    
    1386 1464
       }
    
    1387
    -  rv = singleton->GetAppRootDir(getter_AddRefs(localDir));
    
    1465
    +  bool isPortable = false;
    
    1466
    +  rv = singleton->GetPortableDataDir(getter_AddRefs(localDir), isPortable);
    
    1388 1467
       NS_ENSURE_SUCCESS(rv, rv);
    
    1389
    -  nsAutoCString profileDir(RELATIVE_DATA_DIR);
    
    1390
    -  rv = localDir->SetRelativePath(localDir.get(), profileDir);
    
    1391
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1392
    -#  endif
    
    1393
    -  if (aLocal) {
    
    1394
    -    rv = localDir->AppendNative("Caches"_ns);
    
    1395
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    1468
    +  if (isPortable) {
    
    1469
    +    if (aLocal) {
    
    1470
    +      rv = localDir->AppendNative("Caches"_ns);
    
    1471
    +      NS_ENSURE_SUCCESS(rv, rv);
    
    1472
    +    }
    
    1473
    +    NS_IF_ADDREF(*aFile = localDir);
    
    1474
    +    return rv;
    
    1396 1475
       }
    
    1397
    -#elif defined(XP_MACOSX)
    
    1476
    +#endif
    
    1477
    +
    
    1478
    +#if defined(XP_MACOSX)
    
    1398 1479
       FSRef fsRef;
    
    1480
    +#  if defined(TOR_BROWSER_VERSION)
    
    1481
    +  OSType folderType = kApplicationSupportFolderType;
    
    1482
    +#  else
    
    1399 1483
       OSType folderType;
    
    1400 1484
       if (aLocal) {
    
    1401 1485
         folderType = kCachedDataFolderType;
    
    1402 1486
       } else {
    
    1403
    -#  ifdef MOZ_THUNDERBIRD
    
    1487
    +#    ifdef MOZ_THUNDERBIRD
    
    1404 1488
         folderType = kDomainLibraryFolderType;
    
    1405
    -#  else
    
    1489
    +#    else
    
    1406 1490
         folderType = kApplicationSupportFolderType;
    
    1407
    -#  endif
    
    1491
    +#    endif
    
    1408 1492
       }
    
    1493
    +#  endif
    
    1409 1494
       OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
    
    1410 1495
       NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
    
    1411 1496
     
    
    ... ... @@ -1418,6 +1503,17 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
    1418 1503
       rv = dirFileMac->InitWithFSRef(&fsRef);
    
    1419 1504
       NS_ENSURE_SUCCESS(rv, rv);
    
    1420 1505
     
    
    1506
    +#  if defined(TOR_BROWSER_VERSION)
    
    1507
    +  rv = dirFileMac->AppendNative("TorBrowser-Data"_ns);
    
    1508
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1509
    +  rv = dirFileMac->AppendNative("Browser"_ns);
    
    1510
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1511
    +  if (aLocal) {
    
    1512
    +    rv = dirFileMac->AppendNative("Caches"_ns);
    
    1513
    +    NS_ENSURE_SUCCESS(rv, rv);
    
    1514
    +  }
    
    1515
    +#  endif
    
    1516
    +
    
    1421 1517
       localDir = dirFileMac;
    
    1422 1518
     #elif defined(XP_IOS)
    
    1423 1519
       nsAutoCString userDir;
    
    ... ... @@ -1537,37 +1633,6 @@ nsresult nsXREDirProvider::GetUserDataDirectory(nsIFile** aFile, bool aLocal) {
    1537 1633
       return NS_OK;
    
    1538 1634
     }
    
    1539 1635
     
    
    1540
    -nsresult nsXREDirProvider::GetTorBrowserUserDataDir(nsIFile** aFile) {
    
    1541
    -  NS_ENSURE_ARG_POINTER(aFile);
    
    1542
    -  nsCOMPtr<nsIFile> appRootDir;
    
    1543
    -  RefPtr<nsXREDirProvider> singleton = GetSingleton();
    
    1544
    -  if (!singleton) {
    
    1545
    -    return NS_ERROR_OUT_OF_MEMORY;
    
    1546
    -  }
    
    1547
    -  nsresult rv = singleton->GetAppRootDir(getter_AddRefs(appRootDir));
    
    1548
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1549
    -  return TorBrowser_GetUserDataDir(appRootDir, aFile);
    
    1550
    -}
    
    1551
    -
    
    1552
    -nsresult nsXREDirProvider::GetAppRootDir(nsIFile** aFile) {
    
    1553
    -  bool persistent = false;
    
    1554
    -  nsCOMPtr<nsIFile> file, appRootDir;
    
    1555
    -  nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(file));
    
    1556
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1557
    -  rv = file->Normalize();
    
    1558
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    1559
    -  int levelsToRemove = 1;
    
    1560
    -#if defined(XP_MACOSX)
    
    1561
    -  levelsToRemove += 2;
    
    1562
    -#endif
    
    1563
    -  while (levelsToRemove-- > 0) {
    
    1564
    -    rv = file->GetParent(getter_AddRefs(appRootDir));
    
    1565
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    1566
    -    file = appRootDir;
    
    1567
    -  }
    
    1568
    -  return appRootDir->Clone(aFile);
    
    1569
    -}
    
    1570
    -
    
    1571 1636
     nsresult nsXREDirProvider::EnsureDirectoryExists(nsIFile* aDirectory) {
    
    1572 1637
       nsresult rv = aDirectory->Create(nsIFile::DIRECTORY_TYPE, 0700);
    
    1573 1638
     
    
    ... ... @@ -1618,6 +1683,13 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
    1618 1683
         return NS_OK;
    
    1619 1684
       }
    
    1620 1685
     
    
    1686
    +#if defined(RELATIVE_DATA_DIR)
    
    1687
    +  if (gDataDirPortable && *gDataDirPortable) {
    
    1688
    +    // Do nothing in portable mode
    
    1689
    +    return NS_OK;
    
    1690
    +  }
    
    1691
    +#endif
    
    1692
    +
    
    1621 1693
       nsAutoCString profile;
    
    1622 1694
       nsAutoCString appName;
    
    1623 1695
       nsAutoCString vendor;
    
    ... ... @@ -1631,29 +1703,29 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
    1631 1703
       nsresult rv = NS_OK;
    
    1632 1704
     
    
    1633 1705
     #if defined(XP_MACOSX)
    
    1706
    +#  ifndef TOR_BROWSER_VERSION
    
    1707
    +  // For Tor Browser we already prepare the data directory as we need it, even
    
    1708
    +  // when we are running a system install.
    
    1634 1709
       if (!profile.IsEmpty()) {
    
    1635 1710
         rv = AppendProfileString(aFile, profile.get());
    
    1636
    -#  ifndef RELATIVE_DATA_DIR
    
    1637 1711
       } else {
    
    1638 1712
         // Note that MacOS ignores the vendor when creating the profile hierarchy -
    
    1639 1713
         // all application preferences directories live alongside one another in
    
    1640 1714
         // ~/Library/Application Support/
    
    1641 1715
         rv = aFile->AppendNative(appName);
    
    1642
    -#  endif
    
    1643 1716
       }
    
    1644 1717
       NS_ENSURE_SUCCESS(rv, rv);
    
    1718
    +#  endif
    
    1645 1719
     
    
    1646 1720
     #elif defined(XP_WIN)
    
    1647 1721
       if (!profile.IsEmpty()) {
    
    1648 1722
         rv = AppendProfileString(aFile, profile.get());
    
    1649
    -#  ifndef RELATIVE_DATA_DIR
    
    1650 1723
       } else {
    
    1651 1724
         if (!vendor.IsEmpty()) {
    
    1652 1725
           rv = aFile->AppendNative(vendor);
    
    1653 1726
           NS_ENSURE_SUCCESS(rv, rv);
    
    1654 1727
         }
    
    1655 1728
         rv = aFile->AppendNative(appName);
    
    1656
    -#  endif
    
    1657 1729
       }
    
    1658 1730
       NS_ENSURE_SUCCESS(rv, rv);
    
    1659 1731
     
    
    ... ... @@ -1668,26 +1740,21 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
    1668 1740
       nsAutoCString folder;
    
    1669 1741
       // Make it hidden (by starting with "."), except when local (the
    
    1670 1742
       // profile is already under ~/.cache or XDG_CACHE_HOME).
    
    1671
    -#  ifndef RELATIVE_DATA_DIR
    
    1672 1743
       if (!aLocal) folder.Assign('.');
    
    1673
    -#  endif
    
    1674 1744
     
    
    1675 1745
       if (!profile.IsEmpty()) {
    
    1676 1746
         // Skip any leading path characters
    
    1677 1747
         const char* profileStart = profile.get();
    
    1678 1748
         while (*profileStart == '/' || *profileStart == '\\') profileStart++;
    
    1679 1749
     
    
    1680
    -#  ifndef RELATIVE_DATA_DIR
    
    1681 1750
         // On the off chance that someone wanted their folder to be hidden don't
    
    1682 1751
         // let it become ".."
    
    1683 1752
         if (*profileStart == '.' && !aLocal) profileStart++;
    
    1684
    -#  endif
    
    1685 1753
     
    
    1686 1754
         folder.Append(profileStart);
    
    1687 1755
         ToLowerCase(folder);
    
    1688 1756
     
    
    1689 1757
         rv = AppendProfileString(aFile, folder.BeginReading());
    
    1690
    -#  ifndef RELATIVE_DATA_DIR
    
    1691 1758
       } else {
    
    1692 1759
         if (!vendor.IsEmpty()) {
    
    1693 1760
           folder.Append(vendor);
    
    ... ... @@ -1706,7 +1773,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
    1706 1773
     
    
    1707 1774
           rv = aFile->AppendNative(folder);
    
    1708 1775
         }
    
    1709
    -#  endif
    
    1710 1776
       }
    
    1711 1777
       NS_ENSURE_SUCCESS(rv, rv);
    
    1712 1778
     
    
    ... ... @@ -1734,3 +1800,21 @@ nsresult nsXREDirProvider::AppendProfileString(nsIFile* aFile,
    1734 1800
     
    
    1735 1801
       return NS_OK;
    
    1736 1802
     }
    
    1803
    +
    
    1804
    +nsresult nsXREDirProvider::GetTorBrowserUserDataDir(nsIFile** aFile) {
    
    1805
    +#ifdef ANDROID
    
    1806
    +  // We expect this function not to be called on Android.
    
    1807
    +  // But, for sake of completeness, we handle also this case.
    
    1808
    +  const char* homeDir = getenv("HOME");
    
    1809
    +  if (!homeDir || !*homeDir) {
    
    1810
    +    return NS_ERROR_FAILURE;
    
    1811
    +  }
    
    1812
    +  return NS_NewNativeLocalFile(nsDependentCString(homeDir), true, aFile);
    
    1813
    +#endif
    
    1814
    +
    
    1815
    +  NS_ENSURE_ARG_POINTER(aFile);
    
    1816
    +  nsCOMPtr<nsIFile> dataDir;
    
    1817
    +  nsresult rv = GetUserDataDirectoryHome(getter_AddRefs(dataDir), false);
    
    1818
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    1819
    +  return dataDir->GetParent(aFile);
    
    1820
    +}

  • toolkit/xre/nsXREDirProvider.h
    ... ... @@ -110,18 +110,11 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
    110 110
       nsresult GetProfileDir(nsIFile** aResult);
    
    111 111
     
    
    112 112
       /**
    
    113
    -   * Get the TorBrowser user data directory by calling the
    
    114
    -   * TorBrowser_GetUserDataDir() utility function.
    
    113
    +   * Get the Tor Browser user data directory.
    
    114
    +   * We take for granted that for Tor Browser we can take the parent directory
    
    115
    +   * of the one returned by GetUserDataDirectoryHome (with aLocal = false).
    
    115 116
        */
    
    116
    -  static nsresult GetTorBrowserUserDataDir(nsIFile** aFile);
    
    117
    -
    
    118
    -  /**
    
    119
    -   * Get the path to the base application directory.
    
    120
    -   *
    
    121
    -   * In almost all platforms it is the directory that contains the Firefox
    
    122
    -   * executable; on macOS we remove also Contents/MacOS from it.
    
    123
    -   */
    
    124
    -  nsresult GetAppRootDir(nsIFile** aFile);
    
    117
    +  nsresult GetTorBrowserUserDataDir(nsIFile** aFile);
    
    125 118
     
    
    126 119
      protected:
    
    127 120
       nsresult GetFilesInternal(const char* aProperty,
    
    ... ... @@ -169,6 +162,14 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
    169 162
      private:
    
    170 163
       static nsresult SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
    
    171 164
                                                   bool aLocal);
    
    165
    +
    
    166
    +#if defined(RELATIVE_DATA_DIR)
    
    167
    +  /**
    
    168
    +   * Get the path to the portable data dir, if the application is running in
    
    169
    +   * portable mode.
    
    170
    +   */
    
    171
    +  nsresult GetPortableDataDir(nsIFile** aFile, bool& aIsPortable);
    
    172
    +#endif
    
    172 173
     };
    
    173 174
     
    
    174 175
     #endif

  • xpcom/io/TorFileUtils.cpp deleted
    1
    -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    
    2
    -/* vim: set ts=8 sts=2 et sw=2 tw=80: */
    
    3
    -/* This Source Code Form is subject to the terms of the Mozilla Public
    
    4
    - * License, v. 2.0. If a copy of the MPL was not distributed with this
    
    5
    - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
    
    6
    -
    
    7
    -#include "TorFileUtils.h"
    
    8
    -#include "nsString.h"
    
    9
    -#ifdef MOZ_WIDGET_COCOA
    
    10
    -#  include <Carbon/Carbon.h>
    
    11
    -#  include "nsILocalFileMac.h"
    
    12
    -#endif
    
    13
    -
    
    14
    -nsresult TorBrowser_GetUserDataDir(nsIFile* aAppDir, nsIFile** aFile) {
    
    15
    -  NS_ENSURE_ARG_POINTER(aFile);
    
    16
    -  nsCOMPtr<nsIFile> tbDataDir;
    
    17
    -
    
    18
    -#ifdef ANDROID
    
    19
    -  const char* homeDir = getenv("HOME");
    
    20
    -  if (!homeDir || !*homeDir) return NS_ERROR_FAILURE;
    
    21
    -  nsresult rv = NS_NewNativeLocalFile(nsDependentCString(homeDir), true,
    
    22
    -                                      getter_AddRefs(tbDataDir));
    
    23
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    24
    -#elif defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
    
    25
    -  nsAutoCString tbDataLeafName("TorBrowser-Data"_ns);
    
    26
    -#  ifndef XP_MACOSX
    
    27
    -  // On all platforms except Mac OS, we always operate in a "portable" mode
    
    28
    -  // where the TorBrowser-Data directory is located next to the application.
    
    29
    -  nsresult rv = aAppDir->GetParent(getter_AddRefs(tbDataDir));
    
    30
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    31
    -  rv = tbDataDir->AppendNative(tbDataLeafName);
    
    32
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    33
    -#  else
    
    34
    -  // For Mac OS, determine whether we should store user data in the OS's
    
    35
    -  // standard location (i.e., under ~/Library/Application Support). We use
    
    36
    -  // the OS location if (1) the application is installed in a directory whose
    
    37
    -  // path contains "/Applications" or (2) the TorBrowser-Data directory does
    
    38
    -  // not exist and cannot be created (which probably means we lack write
    
    39
    -  // permission to the directory that contains the application).
    
    40
    -  nsAutoString appRootPath;
    
    41
    -  nsresult rv = aAppDir->GetPath(appRootPath);
    
    42
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    43
    -  bool useOSLocation =
    
    44
    -      (appRootPath.Find("/Applications", true /* ignore case */) >= 0);
    
    45
    -  if (!useOSLocation) {
    
    46
    -    // We hope to use the portable (aka side-by-side) approach, but before we
    
    47
    -    // commit to that, let's ensure that we can create the TorBrowser-Data
    
    48
    -    // directory. If it already exists, we will try to use it; if not and we
    
    49
    -    // fail to create it, we will switch to ~/Library/Application Support.
    
    50
    -    rv = aAppDir->GetParent(getter_AddRefs(tbDataDir));
    
    51
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    52
    -    rv = tbDataDir->AppendNative(tbDataLeafName);
    
    53
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    54
    -    bool exists = false;
    
    55
    -    rv = tbDataDir->Exists(&exists);
    
    56
    -    if (NS_SUCCEEDED(rv) && !exists)
    
    57
    -      rv = tbDataDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
    
    58
    -    useOSLocation = NS_FAILED(rv);
    
    59
    -  }
    
    60
    -
    
    61
    -  if (useOSLocation) {
    
    62
    -    // We are using ~/Library/Application Support/TorBrowser-Data. We do not
    
    63
    -    // need to create that directory here because the code in nsXREDirProvider
    
    64
    -    // will do so (and the user should always have write permission for
    
    65
    -    // ~/Library/Application Support; if they do not we have no more options).
    
    66
    -    FSRef fsRef;
    
    67
    -    OSErr err = ::FSFindFolder(kUserDomain, kApplicationSupportFolderType,
    
    68
    -                               kCreateFolder, &fsRef);
    
    69
    -    NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
    
    70
    -    // To convert the FSRef returned by FSFindFolder() into an nsIFile that
    
    71
    -    // points to ~/Library/Application Support, we first create an empty
    
    72
    -    // nsIFile object (no path) and then use InitWithFSRef() to set the
    
    73
    -    // path.
    
    74
    -    rv = NS_NewNativeLocalFile(""_ns, true, getter_AddRefs(tbDataDir));
    
    75
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    76
    -    nsCOMPtr<nsILocalFileMac> dirFileMac = do_QueryInterface(tbDataDir);
    
    77
    -    if (!dirFileMac) return NS_ERROR_UNEXPECTED;
    
    78
    -    rv = dirFileMac->InitWithFSRef(&fsRef);
    
    79
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    80
    -    rv = tbDataDir->AppendNative(tbDataLeafName);
    
    81
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    82
    -  }
    
    83
    -#  endif
    
    84
    -
    
    85
    -#else
    
    86
    -  // User data is embedded within the application directory (i.e.,
    
    87
    -  // TOR_BROWSER_DATA_OUTSIDE_APP_DIR is not defined).
    
    88
    -  nsresult rv = aAppDir->Clone(getter_AddRefs(tbDataDir));
    
    89
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    90
    -  rv = tbDataDir->AppendNative("TorBrowser"_ns);
    
    91
    -  NS_ENSURE_SUCCESS(rv, rv);
    
    92
    -#endif
    
    93
    -
    
    94
    -  tbDataDir.forget(aFile);
    
    95
    -  return NS_OK;
    
    96
    -}

  • xpcom/io/TorFileUtils.h deleted
    1
    -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    
    2
    -/* vim: set ts=8 sts=2 et sw=2 tw=80: */
    
    3
    -/* This Source Code Form is subject to the terms of the Mozilla Public
    
    4
    - * License, v. 2.0. If a copy of the MPL was not distributed with this
    
    5
    - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
    
    6
    -
    
    7
    -#ifndef TorFileUtils_h__
    
    8
    -#define TorFileUtils_h__
    
    9
    -
    
    10
    -#include "nsIFile.h"
    
    11
    -
    
    12
    -/**
    
    13
    - * TorBrowser_GetUserDataDir
    
    14
    - *
    
    15
    - * Retrieve the Tor Browser user data directory.
    
    16
    - * When built with --enable-tor-browser-data-outside-app-dir, the directory
    
    17
    - * is next to the application directory, except on Mac OS where it may be
    
    18
    - * there or it may be at ~/Library/Application Support/TorBrowser-Data (the
    
    19
    - * latter location is used if the .app bundle is in a directory whose path
    
    20
    - * contains /Applications or if we lack write access to the directory that
    
    21
    - * contains the .app).
    
    22
    - * When built without --enable-tor-browser-data-outside-app-dir, this
    
    23
    - * directory is TorBrowser.app/TorBrowser.
    
    24
    - *
    
    25
    - * @param aAppDir   The path to Tor Browser directory
    
    26
    - * @param aFile     Out parameter that is set to the Tor Browser user data
    
    27
    - *                  directory.
    
    28
    - * @return NS_OK on success.  Error otherwise.
    
    29
    - */
    
    30
    -extern nsresult TorBrowser_GetUserDataDir(nsIFile* aAppDir, nsIFile** aFile);
    
    31
    -
    
    32
    -#endif  // !TorFileUtils_h__

  • xpcom/io/moz.build
    ... ... @@ -86,7 +86,6 @@ EXPORTS += [
    86 86
         "nsUnicharInputStream.h",
    
    87 87
         "nsWildCard.h",
    
    88 88
         "SpecialSystemDirectory.h",
    
    89
    -    "TorFileUtils.h",
    
    90 89
     ]
    
    91 90
     
    
    92 91
     EXPORTS.mozilla += [
    
    ... ... @@ -137,10 +136,6 @@ UNIFIED_SOURCES += [
    137 136
         "SpecialSystemDirectory.cpp",
    
    138 137
     ]
    
    139 138
     
    
    140
    -SOURCES += [
    
    141
    -    "TorFileUtils.cpp",
    
    142
    -]
    
    143
    -
    
    144 139
     if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
    
    145 140
         SOURCES += [
    
    146 141
             "CocoaFileUtils.mm",
    

  • xpcom/io/nsAppFileLocationProvider.cpp
    ... ... @@ -27,8 +27,6 @@
    27 27
     #  include <sys/param.h>
    
    28 28
     #endif
    
    29 29
     
    
    30
    -#include "TorFileUtils.h"
    
    31
    -
    
    32 30
     // WARNING: These hard coded names need to go away. They need to
    
    33 31
     // come from localizable resources
    
    34 32
     
    
    ... ... @@ -231,66 +229,137 @@ nsresult nsAppFileLocationProvider::CloneMozBinDirectory(nsIFile** aLocalFile) {
    231 229
       return NS_OK;
    
    232 230
     }
    
    233 231
     
    
    234
    -//----------------------------------------------------------------------------------------
    
    235
    -// GetProductDirectory - Gets the directory which contains the application data
    
    236
    -// folder
    
    237
    -//
    
    238
    -// UNIX   : ~/.mozilla/
    
    239
    -// WIN    : <Application Data folder on user's machine>\Mozilla
    
    240
    -// Mac    : :Documents:Mozilla:
    
    241
    -//----------------------------------------------------------------------------------------
    
    242
    -nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
    
    243
    -                                                        bool aLocal) {
    
    244
    -  if (NS_WARN_IF(!aLocalFile)) {
    
    245
    -    return NS_ERROR_INVALID_ARG;
    
    246
    -  }
    
    232
    +#ifdef RELATIVE_DATA_DIR
    
    233
    +static nsresult SetupPortableMode(nsIFile** aDirectory, bool aLocal,
    
    234
    +                                  bool& aIsPortable) {
    
    235
    +  // This is almost the same as nsXREDirProvider::GetPortableDataDir.
    
    236
    +  // However, it seems that this is never called, at least during simple usage
    
    237
    +  // of the browser.
    
    247 238
     
    
    248 239
       nsresult rv = NS_ERROR_UNEXPECTED;
    
    249
    -  bool exists;
    
    250
    -  nsCOMPtr<nsIFile> localDir;
    
    251
    -
    
    252
    -#if defined(RELATIVE_DATA_DIR) || defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
    
    253 240
       nsCOMPtr<nsIProperties> directoryService(
    
    254 241
           do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
    
    255 242
       NS_ENSURE_SUCCESS(rv, rv);
    
    256
    -
    
    257
    -  bool persistent = false;
    
    258
    -  nsCOMPtr<nsIFile> file, appRootDir;
    
    243
    +  nsCOMPtr<nsIFile> exeFile, exeDir;
    
    259 244
       rv = directoryService->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
    
    260
    -                             getter_AddRefs(file));
    
    245
    +                             getter_AddRefs(exeFile));
    
    246
    +  rv = exeFile->Normalize();
    
    261 247
       NS_ENSURE_SUCCESS(rv, rv);
    
    262
    -  rv = file->Normalize();
    
    248
    +  rv = exeFile->GetParent(getter_AddRefs(exeDir));
    
    263 249
       NS_ENSURE_SUCCESS(rv, rv);
    
    264
    -  int levelsToRemove = 1;
    
    250
    +
    
    265 251
     #  if defined(XP_MACOSX)
    
    266
    -  levelsToRemove += 2;
    
    252
    +  nsAutoString exeDirPath;
    
    253
    +  rv = exeDir->GetPath(exeDirPath);
    
    254
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    255
    +  // When the browser is installed in /Applications, we never run in portable
    
    256
    +  // mode.
    
    257
    +  if (exeDirPath.Find("/Applications/", true /* ignore case */) == 0) {
    
    258
    +    aIsPortable = false;
    
    259
    +    return NS_OK;
    
    260
    +  }
    
    267 261
     #  endif
    
    268
    -  while (levelsToRemove-- > 0) {
    
    269
    -    rv = file->GetParent(getter_AddRefs(appRootDir));
    
    270
    -    NS_ENSURE_SUCCESS(rv, rv);
    
    271
    -    file = appRootDir;
    
    262
    +
    
    263
    +  nsCOMPtr<nsIFile> systemInstallFile;
    
    264
    +  rv = exeDir->Clone(getter_AddRefs(systemInstallFile));
    
    265
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    266
    +  rv = systemInstallFile->AppendNative("system-install"_ns);
    
    267
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    268
    +
    
    269
    +  bool exists = false;
    
    270
    +  rv = systemInstallFile->Exists(&exists);
    
    271
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    272
    +  if (exists) {
    
    273
    +    aIsPortable = false;
    
    274
    +    return NS_OK;
    
    272 275
       }
    
    273 276
     
    
    274
    -#  ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
    
    275
    -  rv = TorBrowser_GetUserDataDir(appRootDir, getter_AddRefs(localDir));
    
    277
    +  nsCOMPtr<nsIFile> localDir = exeDir;
    
    278
    +#  if defined(XP_MACOSX)
    
    279
    +  rv = exeDir->GetParent(getter_AddRefs(localDir));
    
    276 280
       NS_ENSURE_SUCCESS(rv, rv);
    
    277
    -  rv = localDir->AppendNative("Browser"_ns);
    
    278
    -#  else
    
    279
    -  localDir = appRootDir;
    
    280
    -  nsAutoCString profileDir(RELATIVE_DATA_DIR);
    
    281
    -  rv = localDir->SetRelativePath(localDir.get(), profileDir);
    
    282
    -#  endif
    
    281
    +  exeDir = localDir;
    
    282
    +  rv = exeDir->GetParent(getter_AddRefs(localDir));
    
    283 283
       NS_ENSURE_SUCCESS(rv, rv);
    
    284
    +#  endif
    
    284 285
     
    
    286
    +  rv = localDir->SetRelativePath(localDir.get(),
    
    287
    +                                 nsLiteralCString(RELATIVE_DATA_DIR));
    
    288
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    285 289
       if (aLocal) {
    
    286 290
         rv = localDir->AppendNative("Caches"_ns);
    
    287 291
         NS_ENSURE_SUCCESS(rv, rv);
    
    288 292
       }
    
    289 293
     
    
    290
    -#elif defined(MOZ_WIDGET_COCOA)
    
    294
    +  rv = localDir->Exists(&exists);
    
    295
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    296
    +  if (!exists) {
    
    297
    +    rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
    
    298
    +#  if defined(XP_MACOSX)
    
    299
    +    if (NS_FAILED(rv)) {
    
    300
    +      // On macOS, we forgive this failure to allow running from the DMG.
    
    301
    +      aIsPortable = false;
    
    302
    +      return NS_OK;
    
    303
    +    }
    
    304
    +#  else
    
    305
    +    NS_ENSURE_SUCCESS(rv, rv);
    
    306
    +#  endif
    
    307
    +  }
    
    308
    +
    
    309
    +  localDir.forget(aDirectory);
    
    310
    +  aIsPortable = true;
    
    311
    +  return rv;
    
    312
    +}
    
    313
    +#endif
    
    314
    +
    
    315
    +//----------------------------------------------------------------------------------------
    
    316
    +// GetProductDirectory - Gets the directory which contains the application data
    
    317
    +// folder
    
    318
    +//
    
    319
    +// If portable mode is enabled:
    
    320
    +//  - aLocal == false: $APP_ROOT/$RELATIVE_DATA_DIR
    
    321
    +//  - aLocal == true:  $APP_ROOT/$RELATIVE_DATA_DIR/Caches
    
    322
    +// where $APP_ROOT is:
    
    323
    +//  - the parent directory of the executable on Windows and Linux
    
    324
    +//  - the root of the app bundle on macOS
    
    325
    +//
    
    326
    +// Otherwise:
    
    327
    +//  - Windows:
    
    328
    +//    - aLocal == false: %APPDATA%/$MOZ_USER_DIR
    
    329
    +//    - aLocal == true: %LOCALAPPDATA%/$MOZ_USER_DIR
    
    330
    +//  - macOS:
    
    331
    +//    - aLocal == false: kDomainLibraryFolderType/$MOZ_USER_DIR
    
    332
    +//    - aLocal == true: kCachedDataFolderType/$MOZ_USER_DIR
    
    333
    +//  - Unix: ~/$MOZ_USER_DIR
    
    334
    +//----------------------------------------------------------------------------------------
    
    335
    +nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
    
    336
    +                                                        bool aLocal) {
    
    337
    +  if (NS_WARN_IF(!aLocalFile)) {
    
    338
    +    return NS_ERROR_INVALID_ARG;
    
    339
    +  }
    
    340
    +
    
    341
    +  nsresult rv = NS_ERROR_UNEXPECTED;
    
    342
    +  bool exists;
    
    343
    +  nsCOMPtr<nsIFile> localDir;
    
    344
    +
    
    345
    +#if defined(RELATIVE_DATA_DIR)
    
    346
    +  bool isPortable = false;
    
    347
    +  rv = SetupPortableMode(aLocalFile, aLocal, isPortable);
    
    348
    +  // If portable mode is enabled, we absolutely want it (e.g., to be sure there
    
    349
    +  // will not be disk leaks), so a failure is to be propagated.
    
    350
    +  if (NS_FAILED(rv) || isPortable) {
    
    351
    +    return rv;
    
    352
    +  }
    
    353
    +#endif
    
    354
    +
    
    355
    +#if defined(MOZ_WIDGET_COCOA)
    
    291 356
       FSRef fsRef;
    
    357
    +#  if defined(TOR_BROWSER_VERSION)
    
    358
    +  OSType folderType = kApplicationSupportFolderType;
    
    359
    +#  else
    
    292 360
       OSType folderType =
    
    293 361
           aLocal ? (OSType)kCachedDataFolderType : (OSType)kDomainLibraryFolderType;
    
    362
    +#  endif
    
    294 363
       OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
    
    295 364
       if (err) {
    
    296 365
         return NS_ERROR_FAILURE;
    
    ... ... @@ -304,6 +373,17 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
    304 373
       if (NS_FAILED(rv)) {
    
    305 374
         return rv;
    
    306 375
       }
    
    376
    +
    
    377
    +#  if defined(TOR_BROWSER_VERSION)
    
    378
    +  rv = localDir->AppendNative("TorBrowser-Data"_ns);
    
    379
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    380
    +  rv = localDir->AppendNative("Browser"_ns);
    
    381
    +  NS_ENSURE_SUCCESS(rv, rv);
    
    382
    +  if (aLocal) {
    
    383
    +    rv = localDir->AppendNative("Caches"_ns);
    
    384
    +    NS_ENSURE_SUCCESS(rv, rv);
    
    385
    +  }
    
    386
    +#  endif
    
    307 387
     #elif defined(XP_WIN)
    
    308 388
       nsCOMPtr<nsIProperties> directoryService =
    
    309 389
           do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
    
    ... ... @@ -326,7 +406,7 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
    326 406
     #  error dont_know_how_to_get_product_dir_on_your_platform
    
    327 407
     #endif
    
    328 408
     
    
    329
    -#if !defined(RELATIVE_DATA_DIR) && !defined(TOR_BROWSER_VERSION)
    
    409
    +#if !defined(TOR_BROWSER_VERSION)
    
    330 410
       rv = localDir->AppendRelativeNativePath(DEFAULT_PRODUCT_DIR);
    
    331 411
       if (NS_FAILED(rv)) {
    
    332 412
         return rv;
    
    ... ... @@ -350,6 +430,11 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
    350 430
     //----------------------------------------------------------------------------------------
    
    351 431
     // GetDefaultUserProfileRoot - Gets the directory which contains each user
    
    352 432
     // profile dir
    
    433
    +//
    
    434
    +// - Windows and macOS: $PRODUCT_DIRECTORY/Profiles
    
    435
    +// - Unix: $PRODUCT_DIRECTORY
    
    436
    +// See also GetProductDirectory for instructions on how $PRODUCT_DIRECTORY is
    
    437
    +// generated.
    
    353 438
     //----------------------------------------------------------------------------------------
    
    354 439
     nsresult nsAppFileLocationProvider::GetDefaultUserProfileRoot(
    
    355 440
         nsIFile** aLocalFile, bool aLocal) {