| // Copyright 2020 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/common/chrome_paths_lacros.h" |
| |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/logging.h" |
| #include "base/no_destructor.h" |
| #include "base/system/sys_info.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chromeos/crosapi/cpp/crosapi_constants.h" |
| #include "chromeos/crosapi/mojom/browser_service.mojom.h" |
| #include "chromeos/lacros/lacros_paths.h" |
| |
| namespace chrome { |
| namespace { |
| |
| struct DefaultPaths { |
| base::FilePath documents_dir; |
| base::FilePath downloads_dir; |
| // |drivefs| is empty if Drive is not enabled in Ash. |
| base::FilePath drivefs; |
| // |onedrive| is empty if Microsoft OneDrive is not mounted in Ash. |
| base::FilePath onedrive; |
| base::FilePath removable_media_dir; |
| base::FilePath android_files_dir; |
| base::FilePath linux_files_dir; |
| base::FilePath share_cache_dir; |
| base::FilePath preinstalled_web_app_config_dir; |
| base::FilePath preinstalled_web_app_extra_config_dir; |
| }; |
| |
| DefaultPaths& GetDefaultPaths() { |
| static base::NoDestructor<DefaultPaths> lacros_paths; |
| return *lacros_paths; |
| } |
| |
| } // namespace |
| |
| void SetLacrosDefaultPaths( |
| const base::FilePath& documents_dir, |
| const base::FilePath& downloads_dir, |
| const base::FilePath& drivefs, |
| const base::FilePath& onedrive, |
| const base::FilePath& removable_media_dir, |
| const base::FilePath& android_files_dir, |
| const base::FilePath& linux_files_dir, |
| const base::FilePath& ash_resources_dir, |
| const base::FilePath& share_cache_dir, |
| const base::FilePath& preinstalled_web_app_config_dir, |
| const base::FilePath& preinstalled_web_app_extra_config_dir) { |
| DCHECK(!documents_dir.empty()); |
| DCHECK(documents_dir.IsAbsolute()); |
| GetDefaultPaths().documents_dir = documents_dir; |
| |
| DCHECK(!downloads_dir.empty()); |
| DCHECK(downloads_dir.IsAbsolute()); |
| GetDefaultPaths().downloads_dir = downloads_dir; |
| |
| GetDefaultPaths().drivefs = drivefs; |
| GetDefaultPaths().onedrive = onedrive; |
| GetDefaultPaths().removable_media_dir = removable_media_dir; |
| GetDefaultPaths().android_files_dir = android_files_dir; |
| GetDefaultPaths().linux_files_dir = linux_files_dir; |
| |
| // As for ash resources path, set to chromeos::lacros_paths. |
| chromeos::lacros_paths::SetAshResourcesPath(ash_resources_dir); |
| |
| GetDefaultPaths().share_cache_dir = share_cache_dir; |
| GetDefaultPaths().preinstalled_web_app_config_dir = |
| preinstalled_web_app_config_dir; |
| GetDefaultPaths().preinstalled_web_app_extra_config_dir = |
| preinstalled_web_app_extra_config_dir; |
| } |
| |
| void SetLacrosDefaultPathsFromInitParams( |
| const crosapi::mojom::DefaultPaths* default_paths) { |
| // default_paths may be null on browser_tests and individual components may be |
| // empty due to version skew between ash and lacros. |
| if (default_paths) { |
| base::FilePath drivefs_dir; |
| if (default_paths->drivefs.has_value()) |
| drivefs_dir = default_paths->drivefs.value(); |
| base::FilePath onedrive_dir; |
| if (default_paths->onedrive.has_value()) { |
| onedrive_dir = default_paths->onedrive.value(); |
| } |
| base::FilePath removable_media_dir; |
| if (default_paths->removable_media.has_value()) |
| removable_media_dir = default_paths->removable_media.value(); |
| base::FilePath android_files_dir; |
| if (default_paths->android_files.has_value()) |
| android_files_dir = default_paths->android_files.value(); |
| base::FilePath linux_files_dir; |
| if (default_paths->linux_files.has_value()) |
| linux_files_dir = default_paths->linux_files.value(); |
| base::FilePath ash_resources_dir; |
| if (default_paths->ash_resources.has_value()) |
| ash_resources_dir = default_paths->ash_resources.value(); |
| base::FilePath share_cache_dir; |
| if (default_paths->share_cache.has_value()) |
| share_cache_dir = default_paths->share_cache.value(); |
| base::FilePath preinstalled_web_app_config_dir; |
| if (default_paths->preinstalled_web_app_config.has_value()) { |
| preinstalled_web_app_config_dir = |
| default_paths->preinstalled_web_app_config.value(); |
| } |
| base::FilePath preinstalled_web_app_extra_config_dir; |
| if (default_paths->preinstalled_web_app_extra_config.has_value()) { |
| preinstalled_web_app_extra_config_dir = |
| default_paths->preinstalled_web_app_extra_config.value(); |
| } |
| |
| chrome::SetLacrosDefaultPaths( |
| default_paths->documents, default_paths->downloads, drivefs_dir, |
| onedrive_dir, removable_media_dir, android_files_dir, linux_files_dir, |
| ash_resources_dir, share_cache_dir, preinstalled_web_app_config_dir, |
| preinstalled_web_app_extra_config_dir); |
| } |
| } |
| |
| void SetDriveFsMountPointPath(const base::FilePath& drivefs) { |
| GetDefaultPaths().drivefs = drivefs; |
| } |
| |
| void SetOneDriveMountPointPath(const base::FilePath& onedrive) { |
| GetDefaultPaths().onedrive = onedrive; |
| } |
| |
| bool GetOneDriveMountPointPath(base::FilePath* result) { |
| // NOTE: Lacros overrides the path with a value from ash early in startup. See |
| // crosapi::mojom::LacrosInitParams. |
| if (GetDefaultPaths().onedrive.empty()) { |
| return false; |
| } |
| *result = GetDefaultPaths().onedrive; |
| return true; |
| } |
| |
| bool GetDefaultUserDataDirectory(base::FilePath* result) { |
| if (base::SysInfo::IsRunningOnChromeOS()) { |
| *result = base::FilePath(crosapi::kLacrosUserDataPath); |
| } else { |
| // For developers on Linux desktop, just pick a reasonable default. Most |
| // developers will pass --user-data-dir and override this value anyway. |
| *result = base::GetHomeDir().Append(".config").Append("lacros"); |
| } |
| return true; |
| } |
| |
| void GetUserCacheDirectory(const base::FilePath& profile_dir, |
| base::FilePath* result) { |
| // Chrome OS doesn't allow special cache overrides like desktop Linux. |
| *result = profile_dir; |
| } |
| |
| bool GetUserDocumentsDirectory(base::FilePath* result) { |
| // NOTE: Lacros overrides the path with a value from ash early in startup. See |
| // crosapi::mojom::LacrosInitParams. |
| CHECK(!GetDefaultPaths().documents_dir.empty()); |
| *result = GetDefaultPaths().documents_dir; |
| return true; |
| } |
| |
| bool GetUserDownloadsDirectorySafe(base::FilePath* result) { |
| // NOTE: Lacros overrides the path with a value from ash early in startup. See |
| // crosapi::mojom::LacrosInitParams. |
| CHECK(!GetDefaultPaths().downloads_dir.empty()); |
| *result = GetDefaultPaths().downloads_dir; |
| return true; |
| } |
| |
| bool GetUserDownloadsDirectory(base::FilePath* result) { |
| return GetUserDownloadsDirectorySafe(result); |
| } |
| |
| bool GetUserMusicDirectory(base::FilePath* result) { |
| // Chrome OS does not support custom media directories. |
| return false; |
| } |
| |
| bool GetUserPicturesDirectory(base::FilePath* result) { |
| // Chrome OS does not support custom media directories. |
| return false; |
| } |
| |
| bool GetUserVideosDirectory(base::FilePath* result) { |
| // Chrome OS does not support custom media directories. |
| return false; |
| } |
| |
| bool ProcessNeedsProfileDir(const std::string& process_type) { |
| // We have no reason to forbid this on Chrome OS as we don't have roaming |
| // profile troubles there. |
| return true; |
| } |
| |
| bool GetDriveFsMountPointPath(base::FilePath* result) { |
| // NOTE: Lacros overrides the path with a value from ash early in startup. See |
| // crosapi::mojom::LacrosInitParams. |
| if (GetDefaultPaths().drivefs.empty()) |
| return false; |
| *result = GetDefaultPaths().drivefs; |
| return true; |
| } |
| |
| bool GetRemovableMediaPath(base::FilePath* result) { |
| if (GetDefaultPaths().removable_media_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().removable_media_dir; |
| return true; |
| } |
| |
| bool GetAndroidFilesPath(base::FilePath* result) { |
| if (GetDefaultPaths().android_files_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().android_files_dir; |
| return true; |
| } |
| |
| bool GetLinuxFilesPath(base::FilePath* result) { |
| if (GetDefaultPaths().linux_files_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().linux_files_dir; |
| return true; |
| } |
| |
| bool GetShareCachePath(base::FilePath* result) { |
| if (GetDefaultPaths().share_cache_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().share_cache_dir; |
| return true; |
| } |
| |
| bool GetPreinstalledWebAppConfigPath(base::FilePath* result) { |
| if (GetDefaultPaths().preinstalled_web_app_config_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().preinstalled_web_app_config_dir; |
| return true; |
| } |
| |
| bool GetPreinstalledWebAppExtraConfigPath(base::FilePath* result) { |
| if (GetDefaultPaths().preinstalled_web_app_extra_config_dir.empty()) |
| return false; |
| *result = GetDefaultPaths().preinstalled_web_app_extra_config_dir; |
| return true; |
| } |
| |
| } // namespace chrome |