Pier Angelo Vendrame pushed to branch base-browser-102.7.0esr-12.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
d41058d1
by Pier Angelo Vendrame at 2023-02-08T12:20:09+01:00
-
9357ba91
by Pier Angelo Vendrame at 2023-02-08T12:20:18+01:00
3 changed files:
- toolkit/xre/nsXREDirProvider.cpp
- toolkit/xre/nsXREDirProvider.h
- xpcom/io/nsAppFileLocationProvider.cpp
Changes:
... | ... | @@ -111,6 +111,10 @@ nsIFile* gDataDirHome = nullptr; |
111 | 111 | nsCOMPtr<nsIFile> gDataDirProfileLocal = nullptr;
|
112 | 112 | nsCOMPtr<nsIFile> gDataDirProfile = nullptr;
|
113 | 113 | |
114 | +#if defined(RELATIVE_DATA_DIR)
|
|
115 | +mozilla::Maybe<nsCOMPtr<nsIFile>> gDataDirPortable;
|
|
116 | +#endif
|
|
117 | + |
|
114 | 118 | // These are required to allow nsXREDirProvider to be usable in xpcshell tests.
|
115 | 119 | // where gAppData is null.
|
116 | 120 | #if defined(XP_MACOSX) || defined(XP_UNIX)
|
... | ... | @@ -1324,6 +1328,91 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile, |
1324 | 1328 | return NS_OK;
|
1325 | 1329 | }
|
1326 | 1330 | |
1331 | +#if defined(RELATIVE_DATA_DIR)
|
|
1332 | +nsresult nsXREDirProvider::GetPortableDataDir(nsIFile** aFile,
|
|
1333 | + bool& aIsPortable) {
|
|
1334 | + if (gDataDirPortable) {
|
|
1335 | + if (*gDataDirPortable) {
|
|
1336 | + nsresult rv = (*gDataDirPortable)->Clone(aFile);
|
|
1337 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1338 | + aIsPortable = true;
|
|
1339 | + } else {
|
|
1340 | + aIsPortable = false;
|
|
1341 | + }
|
|
1342 | + return NS_OK;
|
|
1343 | + }
|
|
1344 | + |
|
1345 | + nsCOMPtr<nsIFile> exeFile, exeDir;
|
|
1346 | + bool persistent = false;
|
|
1347 | + nsresult rv =
|
|
1348 | + GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(exeFile));
|
|
1349 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1350 | + rv = exeFile->Normalize();
|
|
1351 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1352 | + rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
|
1353 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1354 | + |
|
1355 | +#if defined(XP_MACOSX)
|
|
1356 | + nsAutoString exeDirPath;
|
|
1357 | + rv = exeDir->GetPath(exeDirPath);
|
|
1358 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1359 | + // When the browser is installed in /Applications, we never run in portable
|
|
1360 | + // mode.
|
|
1361 | + if (exeDirPath.Find("/Applications/", true /* ignore case */) == 0) {
|
|
1362 | + aIsPortable = false;
|
|
1363 | + return NS_OK;
|
|
1364 | + }
|
|
1365 | +#endif
|
|
1366 | + |
|
1367 | + nsCOMPtr<nsIFile> systemInstallFile;
|
|
1368 | + rv = exeDir->Clone(getter_AddRefs(systemInstallFile));
|
|
1369 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1370 | + rv = systemInstallFile->AppendNative("system-install"_ns);
|
|
1371 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1372 | + |
|
1373 | + bool exists = false;
|
|
1374 | + rv = systemInstallFile->Exists(&exists);
|
|
1375 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1376 | + if (exists) {
|
|
1377 | + aIsPortable = false;
|
|
1378 | + gDataDirPortable.emplace(nullptr);
|
|
1379 | + return NS_OK;
|
|
1380 | + }
|
|
1381 | + |
|
1382 | + nsCOMPtr<nsIFile> localDir = exeDir;
|
|
1383 | +#if defined(XP_MACOSX)
|
|
1384 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
1385 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1386 | + exeDir = localDir;
|
|
1387 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
1388 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1389 | +#endif
|
|
1390 | + rv = localDir->SetRelativePath(localDir.get(),
|
|
1391 | + nsLiteralCString(RELATIVE_DATA_DIR));
|
|
1392 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1393 | + |
|
1394 | +#if defined(XP_MACOSX)
|
|
1395 | + // On macOS we try to create the directory immediately to switch to
|
|
1396 | + // system-install mode if needed (e.g., when running from the DMG).
|
|
1397 | + rv = localDir->Exists(&exists);
|
|
1398 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1399 | + if (!exists) {
|
|
1400 | + rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
|
1401 | + if (NS_FAILED(rv)) {
|
|
1402 | + aIsPortable = false;
|
|
1403 | + return NS_OK;
|
|
1404 | + }
|
|
1405 | + }
|
|
1406 | +#endif
|
|
1407 | + |
|
1408 | + gDataDirPortable.emplace(localDir);
|
|
1409 | + rv = (*gDataDirPortable)->Clone(aFile);
|
|
1410 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1411 | + aIsPortable = true;
|
|
1412 | + return rv;
|
|
1413 | +}
|
|
1414 | +#endif
|
|
1415 | + |
|
1327 | 1416 | nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
|
1328 | 1417 | bool aLocal) {
|
1329 | 1418 | // Copied from nsAppFileLocationProvider (more or less)
|
... | ... | @@ -1343,16 +1432,20 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile, |
1343 | 1432 | if (!singleton) {
|
1344 | 1433 | return NS_ERROR_OUT_OF_MEMORY;
|
1345 | 1434 | }
|
1346 | - rv = singleton->GetAppRootDir(getter_AddRefs(localDir));
|
|
1347 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1348 | - nsAutoCString profileDir(RELATIVE_DATA_DIR);
|
|
1349 | - rv = localDir->SetRelativePath(localDir.get(), profileDir);
|
|
1435 | + bool isPortable = false;
|
|
1436 | + rv = singleton->GetPortableDataDir(getter_AddRefs(localDir), isPortable);
|
|
1350 | 1437 | NS_ENSURE_SUCCESS(rv, rv);
|
1351 | - if (aLocal) {
|
|
1352 | - rv = localDir->AppendNative("Caches"_ns);
|
|
1353 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1438 | + if (isPortable) {
|
|
1439 | + if (aLocal) {
|
|
1440 | + rv = localDir->AppendNative("Caches"_ns);
|
|
1441 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
1442 | + }
|
|
1443 | + NS_IF_ADDREF(*aFile = localDir);
|
|
1444 | + return rv;
|
|
1354 | 1445 | }
|
1355 | -#elif defined(XP_MACOSX)
|
|
1446 | +#endif
|
|
1447 | + |
|
1448 | +#if defined(XP_MACOSX)
|
|
1356 | 1449 | FSRef fsRef;
|
1357 | 1450 | OSType folderType;
|
1358 | 1451 | if (aLocal) {
|
... | ... | @@ -1495,25 +1588,6 @@ nsresult nsXREDirProvider::GetUserDataDirectory(nsIFile** aFile, bool aLocal) { |
1495 | 1588 | return NS_OK;
|
1496 | 1589 | }
|
1497 | 1590 | |
1498 | -nsresult nsXREDirProvider::GetAppRootDir(nsIFile** aFile) {
|
|
1499 | - bool persistent = false;
|
|
1500 | - nsCOMPtr<nsIFile> file, appRootDir;
|
|
1501 | - nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &persistent, getter_AddRefs(file));
|
|
1502 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1503 | - rv = file->Normalize();
|
|
1504 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1505 | - int levelsToRemove = 1;
|
|
1506 | -#if defined(XP_MACOSX)
|
|
1507 | - levelsToRemove += 2;
|
|
1508 | -#endif
|
|
1509 | - while (levelsToRemove-- > 0) {
|
|
1510 | - rv = file->GetParent(getter_AddRefs(appRootDir));
|
|
1511 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
1512 | - file = appRootDir;
|
|
1513 | - }
|
|
1514 | - return appRootDir->Clone(aFile);
|
|
1515 | -}
|
|
1516 | - |
|
1517 | 1591 | nsresult nsXREDirProvider::EnsureDirectoryExists(nsIFile* aDirectory) {
|
1518 | 1592 | nsresult rv = aDirectory->Create(nsIFile::DIRECTORY_TYPE, 0700);
|
1519 | 1593 | |
... | ... | @@ -1564,6 +1638,13 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1564 | 1638 | return NS_OK;
|
1565 | 1639 | }
|
1566 | 1640 | |
1641 | +#if defined(RELATIVE_DATA_DIR)
|
|
1642 | + if (gDataDirPortable && *gDataDirPortable) {
|
|
1643 | + // Do nothing in portable mode
|
|
1644 | + return NS_OK;
|
|
1645 | + }
|
|
1646 | +#endif
|
|
1647 | + |
|
1567 | 1648 | nsAutoCString profile;
|
1568 | 1649 | nsAutoCString appName;
|
1569 | 1650 | nsAutoCString vendor;
|
... | ... | @@ -1579,27 +1660,23 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1579 | 1660 | #if defined(XP_MACOSX)
|
1580 | 1661 | if (!profile.IsEmpty()) {
|
1581 | 1662 | rv = AppendProfileString(aFile, profile.get());
|
1582 | -# ifndef RELATIVE_DATA_DIR
|
|
1583 | 1663 | } else {
|
1584 | 1664 | // Note that MacOS ignores the vendor when creating the profile hierarchy -
|
1585 | 1665 | // all application preferences directories live alongside one another in
|
1586 | 1666 | // ~/Library/Application Support/
|
1587 | 1667 | rv = aFile->AppendNative(appName);
|
1588 | -# endif
|
|
1589 | 1668 | }
|
1590 | 1669 | NS_ENSURE_SUCCESS(rv, rv);
|
1591 | 1670 | |
1592 | 1671 | #elif defined(XP_WIN)
|
1593 | 1672 | if (!profile.IsEmpty()) {
|
1594 | 1673 | rv = AppendProfileString(aFile, profile.get());
|
1595 | -# ifndef RELATIVE_DATA_DIR
|
|
1596 | 1674 | } else {
|
1597 | 1675 | if (!vendor.IsEmpty()) {
|
1598 | 1676 | rv = aFile->AppendNative(vendor);
|
1599 | 1677 | NS_ENSURE_SUCCESS(rv, rv);
|
1600 | 1678 | }
|
1601 | 1679 | rv = aFile->AppendNative(appName);
|
1602 | -# endif
|
|
1603 | 1680 | }
|
1604 | 1681 | NS_ENSURE_SUCCESS(rv, rv);
|
1605 | 1682 | |
... | ... | @@ -1614,26 +1691,21 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1614 | 1691 | nsAutoCString folder;
|
1615 | 1692 | // Make it hidden (by starting with "."), except when local (the
|
1616 | 1693 | // profile is already under ~/.cache or XDG_CACHE_HOME).
|
1617 | -# ifndef RELATIVE_DATA_DIR
|
|
1618 | 1694 | if (!aLocal) folder.Assign('.');
|
1619 | -# endif
|
|
1620 | 1695 | |
1621 | 1696 | if (!profile.IsEmpty()) {
|
1622 | 1697 | // Skip any leading path characters
|
1623 | 1698 | const char* profileStart = profile.get();
|
1624 | 1699 | while (*profileStart == '/' || *profileStart == '\\') profileStart++;
|
1625 | 1700 | |
1626 | -# ifndef RELATIVE_DATA_DIR
|
|
1627 | 1701 | // On the off chance that someone wanted their folder to be hidden don't
|
1628 | 1702 | // let it become ".."
|
1629 | 1703 | if (*profileStart == '.' && !aLocal) profileStart++;
|
1630 | -# endif
|
|
1631 | 1704 | |
1632 | 1705 | folder.Append(profileStart);
|
1633 | 1706 | ToLowerCase(folder);
|
1634 | 1707 | |
1635 | 1708 | rv = AppendProfileString(aFile, folder.BeginReading());
|
1636 | -# ifndef RELATIVE_DATA_DIR
|
|
1637 | 1709 | } else {
|
1638 | 1710 | if (!vendor.IsEmpty()) {
|
1639 | 1711 | folder.Append(vendor);
|
... | ... | @@ -1652,7 +1724,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) { |
1652 | 1724 | |
1653 | 1725 | rv = aFile->AppendNative(folder);
|
1654 | 1726 | }
|
1655 | -# endif
|
|
1656 | 1727 | }
|
1657 | 1728 | NS_ENSURE_SUCCESS(rv, rv);
|
1658 | 1729 |
... | ... | @@ -109,14 +109,6 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, |
109 | 109 | */
|
110 | 110 | nsresult GetProfileDir(nsIFile** aResult);
|
111 | 111 | |
112 | - /**
|
|
113 | - * Get the path to the base application directory.
|
|
114 | - *
|
|
115 | - * In almost all platforms it is the directory that contains the Firefox
|
|
116 | - * executable; on macOS we remove also Contents/MacOS from it.
|
|
117 | - */
|
|
118 | - nsresult GetAppRootDir(nsIFile** aFile);
|
|
119 | - |
|
120 | 112 | protected:
|
121 | 113 | nsresult GetFilesInternal(const char* aProperty,
|
122 | 114 | nsISimpleEnumerator** aResult);
|
... | ... | @@ -163,6 +155,14 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, |
163 | 155 | private:
|
164 | 156 | static nsresult SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
|
165 | 157 | bool aLocal);
|
158 | + |
|
159 | +#if defined(RELATIVE_DATA_DIR)
|
|
160 | + /**
|
|
161 | + * Get the path to the portable data dir, if the application is running in
|
|
162 | + * portable mode.
|
|
163 | + */
|
|
164 | + nsresult GetPortableDataDir(nsIFile** aFile, bool& aIsPortable);
|
|
165 | +#endif
|
|
166 | 166 | };
|
167 | 167 | |
168 | 168 | #endif |
... | ... | @@ -229,57 +229,130 @@ nsresult nsAppFileLocationProvider::CloneMozBinDirectory(nsIFile** aLocalFile) { |
229 | 229 | return NS_OK;
|
230 | 230 | }
|
231 | 231 | |
232 | -//----------------------------------------------------------------------------------------
|
|
233 | -// GetProductDirectory - Gets the directory which contains the application data
|
|
234 | -// folder
|
|
235 | -//
|
|
236 | -// UNIX : ~/.mozilla/
|
|
237 | -// WIN : <Application Data folder on user's machine>\Mozilla
|
|
238 | -// Mac : :Documents:Mozilla:
|
|
239 | -//----------------------------------------------------------------------------------------
|
|
240 | -nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
|
|
241 | - bool aLocal) {
|
|
242 | - if (NS_WARN_IF(!aLocalFile)) {
|
|
243 | - return NS_ERROR_INVALID_ARG;
|
|
244 | - }
|
|
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.
|
|
245 | 238 | |
246 | 239 | nsresult rv = NS_ERROR_UNEXPECTED;
|
247 | - bool exists;
|
|
248 | - nsCOMPtr<nsIFile> localDir;
|
|
249 | - |
|
250 | -#if defined(RELATIVE_DATA_DIR)
|
|
251 | 240 | nsCOMPtr<nsIProperties> directoryService(
|
252 | 241 | do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
|
253 | 242 | NS_ENSURE_SUCCESS(rv, rv);
|
254 | - |
|
255 | - bool persistent = false;
|
|
256 | - nsCOMPtr<nsIFile> file, appRootDir;
|
|
243 | + nsCOMPtr<nsIFile> exeFile, exeDir;
|
|
257 | 244 | rv = directoryService->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
|
258 | - getter_AddRefs(file));
|
|
245 | + getter_AddRefs(exeFile));
|
|
246 | + rv = exeFile->Normalize();
|
|
259 | 247 | NS_ENSURE_SUCCESS(rv, rv);
|
260 | - rv = file->Normalize();
|
|
248 | + rv = exeFile->GetParent(getter_AddRefs(exeDir));
|
|
261 | 249 | NS_ENSURE_SUCCESS(rv, rv);
|
262 | - int levelsToRemove = 1;
|
|
250 | + |
|
263 | 251 | # if defined(XP_MACOSX)
|
264 | - 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 | + }
|
|
265 | 261 | # endif
|
266 | - while (levelsToRemove-- > 0) {
|
|
267 | - rv = file->GetParent(getter_AddRefs(appRootDir));
|
|
268 | - NS_ENSURE_SUCCESS(rv, rv);
|
|
269 | - 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;
|
|
270 | 275 | }
|
271 | 276 | |
272 | - localDir = appRootDir;
|
|
273 | - nsAutoCString profileDir(RELATIVE_DATA_DIR);
|
|
274 | - rv = localDir->SetRelativePath(localDir.get(), profileDir);
|
|
277 | + nsCOMPtr<nsIFile> localDir = exeDir;
|
|
278 | +# if defined(XP_MACOSX)
|
|
279 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
275 | 280 | NS_ENSURE_SUCCESS(rv, rv);
|
281 | + exeDir = localDir;
|
|
282 | + rv = exeDir->GetParent(getter_AddRefs(localDir));
|
|
283 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
284 | +# endif
|
|
276 | 285 | |
286 | + rv = localDir->SetRelativePath(localDir.get(),
|
|
287 | + nsLiteralCString(RELATIVE_DATA_DIR));
|
|
288 | + NS_ENSURE_SUCCESS(rv, rv);
|
|
277 | 289 | if (aLocal) {
|
278 | 290 | rv = localDir->AppendNative("Caches"_ns);
|
279 | 291 | NS_ENSURE_SUCCESS(rv, rv);
|
280 | 292 | }
|
281 | 293 | |
282 | -#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)
|
|
283 | 356 | FSRef fsRef;
|
284 | 357 | OSType folderType =
|
285 | 358 | aLocal ? (OSType)kCachedDataFolderType : (OSType)kDomainLibraryFolderType;
|
... | ... | @@ -318,12 +391,10 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile, |
318 | 391 | # error dont_know_how_to_get_product_dir_on_your_platform
|
319 | 392 | #endif
|
320 | 393 | |
321 | -#if !defined(RELATIVE_DATA_DIR)
|
|
322 | 394 | rv = localDir->AppendRelativeNativePath(DEFAULT_PRODUCT_DIR);
|
323 | 395 | if (NS_FAILED(rv)) {
|
324 | 396 | return rv;
|
325 | 397 | }
|
326 | -#endif
|
|
327 | 398 | rv = localDir->Exists(&exists);
|
328 | 399 | |
329 | 400 | if (NS_SUCCEEDED(rv) && !exists) {
|
... | ... | @@ -342,6 +413,11 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile, |
342 | 413 | //----------------------------------------------------------------------------------------
|
343 | 414 | // GetDefaultUserProfileRoot - Gets the directory which contains each user
|
344 | 415 | // profile dir
|
416 | +//
|
|
417 | +// - Windows and macOS: $PRODUCT_DIRECTORY/Profiles
|
|
418 | +// - Unix: $PRODUCT_DIRECTORY
|
|
419 | +// See also GetProductDirectory for instructions on how $PRODUCT_DIRECTORY is
|
|
420 | +// generated.
|
|
345 | 421 | //----------------------------------------------------------------------------------------
|
346 | 422 | nsresult nsAppFileLocationProvider::GetDefaultUserProfileRoot(
|
347 | 423 | nsIFile** aLocalFile, bool aLocal) {
|