| Index: chrome/app/chrome_main_delegate.cc
|
| diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
|
| index 473cede267adbf9bb90da6a451b68a43f3cc3d1b..eafeba7a99191b0a6b5f1ef7e0cfa42045125495 100644
|
| --- a/chrome/app/chrome_main_delegate.cc
|
| +++ b/chrome/app/chrome_main_delegate.cc
|
| @@ -360,8 +360,39 @@ 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)
|
| + wchar_t user_data_dir_buf[MAX_PATH], invalid_user_data_dir_buf[MAX_PATH];
|
| +
|
| + using GetUserDataDirectoryThunkFunction =
|
| + void (*)(wchar_t*, size_t, wchar_t*, size_t);
|
| + HMODULE elf_module = GetModuleHandle(chrome::kChromeElfDllName);
|
| + if (elf_module) {
|
| + // If we're in a test, chrome_elf won't be loaded.
|
| + GetUserDataDirectoryThunkFunction get_user_data_directory_thunk =
|
| + reinterpret_cast<GetUserDataDirectoryThunkFunction>(
|
| + GetProcAddress(elf_module, "GetUserDataDirectoryThunk"));
|
| + get_user_data_directory_thunk(
|
| + user_data_dir_buf, arraysize(user_data_dir_buf),
|
| + invalid_user_data_dir_buf, arraysize(invalid_user_data_dir_buf));
|
| + base::FilePath user_data_dir(user_data_dir_buf);
|
| + if (invalid_user_data_dir_buf[0] != 0) {
|
| + chrome::SetInvalidSpecifiedUserDataDir(
|
| + base::FilePath(invalid_user_data_dir_buf));
|
| + command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir);
|
| + }
|
| + CHECK(PathService::OverrideAndCreateIfNeeded(chrome::DIR_USER_DATA,
|
| + user_data_dir, false, true));
|
| + } else {
|
| + // In tests, just respect the flag if given.
|
| + base::FilePath user_data_dir =
|
| + command_line->GetSwitchValuePath(switches::kUserDataDir);
|
| + if (user_data_dir.EndsWithSeparator())
|
| + user_data_dir = user_data_dir.StripTrailingSeparators();
|
| + 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 =
|
| @@ -379,15 +410,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,
|
| @@ -420,6 +446,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)
|
| @@ -749,7 +776,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();
|
|
|