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..ca3e866b83756dbeadbb6d1af008cf5771d8d5e3 100644 |
--- a/chrome/app/chrome_main_delegate.cc |
+++ b/chrome/app/chrome_main_delegate.cc |
@@ -26,6 +26,7 @@ |
#include "build/build_config.h" |
#include "chrome/browser/chrome_content_browser_client.h" |
#include "chrome/browser/defaults.h" |
+#include "chrome/browser/ui/startup/bad_flags_prompt.h" |
#include "chrome/common/channel_info.h" |
#include "chrome/common/chrome_constants.h" |
#include "chrome/common/chrome_content_client.h" |
@@ -358,14 +359,51 @@ struct MainFunction { |
int (*function)(const content::MainFunctionParams&); |
}; |
+#if !defined(OS_ANDROID) |
+void InitLogging(const std::string& process_type) { |
+ logging::OldFileDeletionState file_state = |
+ logging::APPEND_TO_OLD_LOG_FILE; |
+ if (process_type.empty()) { |
+ file_state = logging::DELETE_OLD_LOG_FILE; |
+ } |
+ const base::CommandLine& command_line = |
+ *base::CommandLine::ForCurrentProcess(); |
+ logging::InitChromeLogging(command_line, file_state); |
+} |
+#endif |
+ |
+#if !defined(CHROME_MULTIPLE_DLL_CHILD) |
+void RecordMainStartupMetrics(base::TimeTicks exe_entry_point_ticks) { |
+ if (!exe_entry_point_ticks.is_null()) |
+ startup_metric_utils::RecordExeMainEntryPointTicks(exe_entry_point_ticks); |
+#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) |
+ // Record the startup process creation time on supported platforms. |
+ startup_metric_utils::RecordStartupProcessCreationTime( |
+ base::CurrentProcessInfo::CreationTime()); |
+#endif |
+ |
+// On Android the main entry point time is the time when the Java code starts. |
+// This happens before the shared library containing this code is even loaded. |
+// The Java startup code has recorded that time, but the C++ code can't fetch it |
+// from the Java side until it has initialized the JNI. See |
+// ChromeMainDelegateAndroid. |
+#if !defined(OS_ANDROID) |
+ startup_metric_utils::RecordMainEntryPointTime(base::Time::Now()); |
+#endif |
+} |
+#endif // !defined(CHROME_MULTIPLE_DLL_CHILD) |
+ |
+} // namespace |
+ |
// Initializes the user data dir. Must be called before InitializeLocalState(). |
-void InitializeUserDataDir() { |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
+// WARNING! It is important that this code match behavior with |
+// GetUserDataDirectory() in chrome_elf. The two functions must be updated in |
+// sync. |
+void InitializeUserDataDir(base::CommandLine* command_line) { |
base::FilePath user_data_dir = |
command_line->GetSwitchValuePath(switches::kUserDataDir); |
std::string process_type = |
command_line->GetSwitchValueASCII(switches::kProcessType); |
- |
#if defined(OS_LINUX) |
// On Linux, Chrome does not support running multiple copies under different |
// DISPLAYs, so the profile directory can be specified in the environment to |
@@ -397,22 +435,9 @@ void InitializeUserDataDir() { |
// Warn and fail early if the process fails to get a user data directory. |
if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) { |
- // If an invalid command-line or policy override was specified, the user |
- // will be given an error with that value. Otherwise, use the directory |
- // returned by PathService (or the fallback default directory) in the error. |
- if (!specified_directory_was_invalid) { |
- // PathService::Get() returns false and yields an empty path if it fails |
- // to create DIR_USER_DATA. Retrieve the default value manually to display |
- // a more meaningful error to the user in that case. |
- if (user_data_dir.empty()) |
- chrome::GetDefaultUserDataDirectory(&user_data_dir); |
- chrome::SetInvalidSpecifiedUserDataDir(user_data_dir); |
- } |
- |
- // The browser process (which is identified by an empty |process_type|) will |
- // handle the error later; other processes that need the dir crash here. |
- CHECK(process_type.empty()) << "Unable to get the user data directory " |
- << "for process type: " << process_type; |
+ chrome::MaybeShowInvalidUserDataDirWarningDialog(); |
+ LOG(FATAL) << "Unable to get the user data directory " |
+ << "for process type: " << process_type; |
} |
// Append the fallback user data directory to the commandline. Otherwise, |
@@ -421,41 +446,6 @@ void InitializeUserDataDir() { |
command_line->AppendSwitchPath(switches::kUserDataDir, user_data_dir); |
} |
-#if !defined(OS_ANDROID) |
-void InitLogging(const std::string& process_type) { |
- logging::OldFileDeletionState file_state = |
- logging::APPEND_TO_OLD_LOG_FILE; |
- if (process_type.empty()) { |
- file_state = logging::DELETE_OLD_LOG_FILE; |
- } |
- const base::CommandLine& command_line = |
- *base::CommandLine::ForCurrentProcess(); |
- logging::InitChromeLogging(command_line, file_state); |
-} |
-#endif |
- |
-#if !defined(CHROME_MULTIPLE_DLL_CHILD) |
-void RecordMainStartupMetrics(base::TimeTicks exe_entry_point_ticks) { |
- if (!exe_entry_point_ticks.is_null()) |
- startup_metric_utils::RecordExeMainEntryPointTicks(exe_entry_point_ticks); |
-#if defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX) |
- // Record the startup process creation time on supported platforms. |
- startup_metric_utils::RecordStartupProcessCreationTime( |
- base::CurrentProcessInfo::CreationTime()); |
-#endif |
- |
-// On Android the main entry point time is the time when the Java code starts. |
-// This happens before the shared library containing this code is even loaded. |
-// The Java startup code has recorded that time, but the C++ code can't fetch it |
-// from the Java side until it has initialized the JNI. See |
-// ChromeMainDelegateAndroid. |
-#if !defined(OS_ANDROID) |
- startup_metric_utils::RecordMainEntryPointTime(base::Time::Now()); |
-#endif |
-} |
-#endif // !defined(CHROME_MULTIPLE_DLL_CHILD) |
- |
-} // namespace |
ChromeMainDelegate::ChromeMainDelegate() |
: ChromeMainDelegate(base::TimeTicks()) {} |
@@ -748,7 +738,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(); |