Index: chrome/app/chrome_main_delegate.cc |
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc |
index b33dec417a1fe9ab77c86e7868ff781748e5e2e8..ab36af037d3fc594be98460d0b08dbe44af09acb 100644 |
--- a/chrome/app/chrome_main_delegate.cc |
+++ b/chrome/app/chrome_main_delegate.cc |
@@ -41,6 +41,7 @@ |
#include "chrome/common/trace_event_args_whitelist.h" |
#include "chrome/common/url_constants.h" |
#include "chrome/gpu/chrome_content_gpu_client.h" |
+#include "chrome/install_static/user_data_dir.h" |
#include "chrome/renderer/chrome_content_renderer_client.h" |
#include "chrome/utility/chrome_content_utility_client.h" |
#include "components/component_updater/component_updater_paths.h" |
@@ -359,8 +360,20 @@ struct MainFunction { |
}; |
// Initializes the user data dir. Must be called before InitializeLocalState(). |
-void InitializeUserDataDir() { |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
+void InitializeUserDataDir(base::CommandLine* command_line) { |
+#if defined(OS_WIN) |
+ std::wstring user_data_dir_str, invalid_user_data_dir_str; |
+ CHECK(install_static::GetUserDataDirectory(&user_data_dir_str, |
+ &invalid_user_data_dir_str)); |
+ base::FilePath user_data_dir(user_data_dir_str); |
+ if (!invalid_user_data_dir_str.empty()) { |
+ chrome::SetInvalidSpecifiedUserDataDir( |
+ base::FilePath(invalid_user_data_dir_str)); |
+ command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); |
+ } |
+ CHECK(PathService::OverrideAndCreateIfNeeded(chrome::DIR_USER_DATA, |
+ user_data_dir, false, true)); |
+#else // OS_WIN |
base::FilePath user_data_dir = |
command_line->GetSwitchValuePath(switches::kUserDataDir); |
std::string process_type = |
@@ -378,15 +391,10 @@ void InitializeUserDataDir() { |
user_data_dir = base::FilePath::FromUTF8Unsafe(user_data_dir_string); |
} |
} |
-#endif |
-#if defined(OS_MACOSX) || defined(OS_WIN) |
+#endif // OS_LINUX |
+#if defined(OS_MACOSX) |
policy::path_parser::CheckUserDataDirPolicy(&user_data_dir); |
-#endif |
- |
- // On Windows, trailing separators leave Chrome in a bad state. |
- // See crbug.com/464616. |
- if (user_data_dir.EndsWithSeparator()) |
- user_data_dir = user_data_dir.StripTrailingSeparators(); |
+#endif // OS_MAC |
const bool specified_directory_was_invalid = !user_data_dir.empty() && |
!PathService::OverrideAndCreateIfNeeded(chrome::DIR_USER_DATA, |
@@ -419,6 +427,7 @@ void InitializeUserDataDir() { |
// child or service processes will attempt to use the invalid directory. |
if (specified_directory_was_invalid) |
command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); |
+#endif // OS_WIN |
} |
#if !defined(OS_ANDROID) |
@@ -748,7 +757,7 @@ void ChromeMainDelegate::PreSandboxStartup() { |
// Initialize the user data dir for any process type that needs it. |
if (chrome::ProcessNeedsProfileDir(process_type)) { |
- InitializeUserDataDir(); |
+ InitializeUserDataDir(base::CommandLine::ForCurrentProcess()); |
#if defined(OS_WIN) && !defined(CHROME_MULTIPLE_DLL_CHILD) |
if (downgrade::IsMSIInstall()) { |
downgrade::MoveUserDataForFirstRunAfterDowngrade(); |