Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: chrome/browser/browser_main.cc

Issue 7840041: Refactor some more BrowserMain code. Move core code that's required by all embedders to content. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: review comments Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/browser_main.h ('k') | chrome/browser/browser_main_gtk.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/browser_main.h" 5 #include "chrome/browser/browser_main.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/at_exit.h" 11 #include "base/at_exit.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/debug/trace_event.h" 13 #include "base/debug/trace_event.h"
14 #include "base/file_path.h" 14 #include "base/file_path.h"
15 #include "base/file_util.h" 15 #include "base/file_util.h"
16 #include "base/mac/scoped_nsautorelease_pool.h" 16 #include "base/mac/scoped_nsautorelease_pool.h"
17 #include "base/metrics/field_trial.h" 17 #include "base/metrics/field_trial.h"
18 #include "base/metrics/histogram.h" 18 #include "base/metrics/histogram.h"
19 #include "base/path_service.h" 19 #include "base/path_service.h"
20 #include "base/process_util.h" 20 #include "base/process_util.h"
21 #include "base/string_number_conversions.h" 21 #include "base/string_number_conversions.h"
22 #include "base/string_piece.h" 22 #include "base/string_piece.h"
23 #include "base/string_split.h" 23 #include "base/string_split.h"
24 #include "base/string_util.h" 24 #include "base/string_util.h"
25 #include "base/sys_string_conversions.h" 25 #include "base/sys_string_conversions.h"
26 #include "base/threading/platform_thread.h" 26 #include "base/threading/platform_thread.h"
27 #include "base/threading/thread_restrictions.h"
28 #include "base/time.h" 27 #include "base/time.h"
29 #include "base/utf_string_conversions.h" 28 #include "base/utf_string_conversions.h"
30 #include "base/values.h" 29 #include "base/values.h"
31 #include "build/build_config.h" 30 #include "build/build_config.h"
32 #include "chrome/browser/about_flags.h" 31 #include "chrome/browser/about_flags.h"
33 #include "chrome/browser/browser_main_win.h" 32 #include "chrome/browser/browser_main_win.h"
34 #include "chrome/browser/browser_process.h"
35 #include "chrome/browser/browser_process_impl.h" 33 #include "chrome/browser/browser_process_impl.h"
36 #include "chrome/browser/browser_shutdown.h" 34 #include "chrome/browser/browser_shutdown.h"
37 #include "chrome/browser/defaults.h" 35 #include "chrome/browser/defaults.h"
38 #include "chrome/browser/extensions/extension_protocols.h" 36 #include "chrome/browser/extensions/extension_protocols.h"
39 #include "chrome/browser/extensions/extension_service.h" 37 #include "chrome/browser/extensions/extension_service.h"
40 #include "chrome/browser/extensions/extensions_startup.h" 38 #include "chrome/browser/extensions/extensions_startup.h"
41 #include "chrome/browser/first_run/first_run.h"
42 #include "chrome/browser/first_run/first_run_browser_process.h" 39 #include "chrome/browser/first_run/first_run_browser_process.h"
43 #include "chrome/browser/first_run/upgrade_util.h" 40 #include "chrome/browser/first_run/upgrade_util.h"
44 #include "chrome/browser/google/google_url_tracker.h" 41 #include "chrome/browser/google/google_url_tracker.h"
45 #include "chrome/browser/instant/instant_field_trial.h" 42 #include "chrome/browser/instant/instant_field_trial.h"
46 #include "chrome/browser/jankometer.h" 43 #include "chrome/browser/jankometer.h"
47 #include "chrome/browser/language_usage_metrics.h" 44 #include "chrome/browser/language_usage_metrics.h"
48 #include "chrome/browser/metrics/field_trial_synchronizer.h" 45 #include "chrome/browser/metrics/field_trial_synchronizer.h"
49 #include "chrome/browser/metrics/histogram_synchronizer.h" 46 #include "chrome/browser/metrics/histogram_synchronizer.h"
50 #include "chrome/browser/metrics/metrics_log.h" 47 #include "chrome/browser/metrics/metrics_log.h"
51 #include "chrome/browser/metrics/metrics_service.h" 48 #include "chrome/browser/metrics/metrics_service.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 #endif 145 #endif
149 146
150 // TODO(port): several win-only methods have been pulled out of this, but 147 // TODO(port): several win-only methods have been pulled out of this, but
151 // BrowserMain() as a whole needs to be broken apart so that it's usable by 148 // BrowserMain() as a whole needs to be broken apart so that it's usable by
152 // other platforms. For now, it's just a stub. This is a serious work in 149 // other platforms. For now, it's just a stub. This is a serious work in
153 // progress and should not be taken as an indication of a real refactoring. 150 // progress and should not be taken as an indication of a real refactoring.
154 151
155 #if defined(OS_WIN) 152 #if defined(OS_WIN)
156 153
157 #include "base/environment.h" // For PreRead experiment. 154 #include "base/environment.h" // For PreRead experiment.
158 #include "base/win/scoped_com_initializer.h"
159 #include "base/win/windows_version.h" 155 #include "base/win/windows_version.h"
160 #include "chrome/browser/browser_trial.h" 156 #include "chrome/browser/browser_trial.h"
161 #include "chrome/browser/browser_util_win.h" 157 #include "chrome/browser/browser_util_win.h"
162 #include "chrome/browser/first_run/try_chrome_dialog_view.h" 158 #include "chrome/browser/first_run/try_chrome_dialog_view.h"
163 #include "chrome/browser/first_run/upgrade_util_win.h" 159 #include "chrome/browser/first_run/upgrade_util_win.h"
164 #include "chrome/browser/net/url_fixer_upper.h" 160 #include "chrome/browser/net/url_fixer_upper.h"
165 #include "chrome/browser/rlz/rlz.h" 161 #include "chrome/browser/rlz/rlz.h"
166 #include "chrome/browser/ui/views/user_data_dir_dialog.h" 162 #include "chrome/browser/ui/views/user_data_dir_dialog.h"
167 #include "chrome/installer/util/helper.h" 163 #include "chrome/installer/util/helper.h"
168 #include "chrome/installer/util/install_util.h" 164 #include "chrome/installer/util/install_util.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 217
222 #if defined(OS_CHROMEOS) 218 #if defined(OS_CHROMEOS)
223 // Test loading libcros and exit. We return 0 if the library could be loaded, 219 // Test loading libcros and exit. We return 0 if the library could be loaded,
224 // and 1 if it can't be. This is for validation that the library is installed 220 // and 1 if it can't be. This is for validation that the library is installed
225 // and versioned properly for Chrome to find. 221 // and versioned properly for Chrome to find.
226 if (command_line.HasSwitch(switches::kTestLoadLibcros)) 222 if (command_line.HasSwitch(switches::kTestLoadLibcros))
227 exit(!chromeos::CrosLibrary::Get()->EnsureLoaded()); 223 exit(!chromeos::CrosLibrary::Get()->EnsureLoaded());
228 #endif 224 #endif
229 } 225 }
230 226
231 void RunUIMessageLoop(BrowserProcess* browser_process) {
232 TRACE_EVENT_BEGIN_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
233 // This should be invoked as close to the start of the browser's
234 // UI thread message loop as possible to get a stable measurement
235 // across versions.
236 RecordBrowserStartupTime();
237
238 // If the UI thread blocks, the whole UI is unresponsive.
239 // Do not allow disk IO from the UI thread.
240 base::ThreadRestrictions::SetIOAllowed(false);
241
242 #if defined(TOOLKIT_VIEWS)
243 views::AcceleratorHandler accelerator_handler;
244 MessageLoopForUI::current()->Run(&accelerator_handler);
245 #elif defined(USE_X11)
246 MessageLoopForUI::current()->Run(NULL);
247 #elif defined(OS_POSIX)
248 MessageLoopForUI::current()->Run();
249 #endif
250 #if defined(OS_CHROMEOS)
251 chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded",
252 true);
253 #endif
254
255 TRACE_EVENT_END_ETW("BrowserMain:MESSAGE_LOOP", 0, "");
256 }
257
258 void AddFirstRunNewTabs(BrowserInit* browser_init, 227 void AddFirstRunNewTabs(BrowserInit* browser_init,
259 const std::vector<GURL>& new_tabs) { 228 const std::vector<GURL>& new_tabs) {
260 for (std::vector<GURL>::const_iterator it = new_tabs.begin(); 229 for (std::vector<GURL>::const_iterator it = new_tabs.begin();
261 it != new_tabs.end(); ++it) { 230 it != new_tabs.end(); ++it) {
262 if (it->is_valid()) 231 if (it->is_valid())
263 browser_init->AddFirstRunTab(*it); 232 browser_init->AddFirstRunTab(*it);
264 } 233 }
265 } 234 }
266 235
267 #if defined(USE_LINUX_BREAKPAD) 236 #if defined(USE_LINUX_BREAKPAD)
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 const char kMissingLocaleDataTitle[] = "Missing File Error"; 660 const char kMissingLocaleDataTitle[] = "Missing File Error";
692 const char kMissingLocaleDataMessage[] = 661 const char kMissingLocaleDataMessage[] =
693 "Unable to find locale data files. Please reinstall."; 662 "Unable to find locale data files. Please reinstall.";
694 } // namespace chrome_browser 663 } // namespace chrome_browser
695 664
696 // BrowserMainParts ------------------------------------------------------------ 665 // BrowserMainParts ------------------------------------------------------------
697 666
698 ChromeBrowserMainParts::ChromeBrowserMainParts( 667 ChromeBrowserMainParts::ChromeBrowserMainParts(
699 const MainFunctionParams& parameters) 668 const MainFunctionParams& parameters)
700 : BrowserMainParts(parameters), 669 : BrowserMainParts(parameters),
701 shutdown_watcher_(new ShutdownWatcherHelper()) { 670 shutdown_watcher_(new ShutdownWatcherHelper()),
671 record_search_engine_(false),
672 translate_manager_(NULL),
673 profile_(NULL),
674 run_message_loop_(true) {
702 // If we're running tests (ui_task is non-null). 675 // If we're running tests (ui_task is non-null).
703 if (parameters.ui_task) 676 if (parameters.ui_task)
704 browser_defaults::enable_help_app = false; 677 browser_defaults::enable_help_app = false;
705 } 678 }
706 679
707 ChromeBrowserMainParts::~ChromeBrowserMainParts() { 680 ChromeBrowserMainParts::~ChromeBrowserMainParts() {
708 } 681 }
709 682
710 void ChromeBrowserMainParts::SetupHistogramSynchronizer() {
711 histogram_synchronizer_ = new HistogramSynchronizer();
712 }
713
714 // This will be called after the command-line has been mutated by about:flags 683 // This will be called after the command-line has been mutated by about:flags
715 MetricsService* ChromeBrowserMainParts::SetupMetricsAndFieldTrials( 684 MetricsService* ChromeBrowserMainParts::SetupMetricsAndFieldTrials(
716 const CommandLine& parsed_command_line, 685 const CommandLine& parsed_command_line,
717 PrefService* local_state) { 686 PrefService* local_state) {
718 // Must initialize metrics after labs have been converted into switches, 687 // Must initialize metrics after labs have been converted into switches,
719 // but before field trials are set up (so that client ID is available for 688 // but before field trials are set up (so that client ID is available for
720 // one-time randomized field trials). 689 // one-time randomized field trials).
721 MetricsService* metrics = InitializeMetrics(parsed_command_line, local_state); 690 MetricsService* metrics = InitializeMetrics(parsed_command_line, local_state);
722 691
723 // Initialize FieldTrialList to support FieldTrials that use one-time 692 // Initialize FieldTrialList to support FieldTrials that use one-time
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 // in ChromeMain() got destructed when the function returned. 1070 // in ChromeMain() got destructed when the function returned.
1102 base::AtExitManager exit_manager; 1071 base::AtExitManager exit_manager;
1103 upgrade_util::RelaunchChromeBrowserWithNewCommandLineIfNeeded(); 1072 upgrade_util::RelaunchChromeBrowserWithNewCommandLineIfNeeded();
1104 } 1073 }
1105 #endif 1074 #endif
1106 1075
1107 void ChromeBrowserMainParts::PostMainMessageLoopStart() { 1076 void ChromeBrowserMainParts::PostMainMessageLoopStart() {
1108 Profiling::MainMessageLoopStarted(); 1077 Profiling::MainMessageLoopStarted();
1109 } 1078 }
1110 1079
1111 void ChromeBrowserMainParts::ToolkitInitialized() { 1080 void ChromeBrowserMainParts::PreMainMessageLoopRun() {
1112 #if defined(TOOLKIT_VIEWS) 1081 set_result_code(PreMainMessageLoopRunInternal());
1113 // The delegate needs to be set before any UI is created so that windows
1114 // display the correct icon.
1115 if (!views::ViewsDelegate::views_delegate)
1116 views::ViewsDelegate::views_delegate = new ChromeViewsDelegate;
1117
1118 // TODO(beng): Move to WidgetImpl and implement on Windows too!
1119 if (parameters().command_line_.HasSwitch(switches::kDebugViewsPaint))
1120 views::Widget::SetDebugPaintEnabled(true);
1121 #endif
1122
1123 #if defined(OS_WIN)
1124 gfx::PlatformFontWin::adjust_font_callback = &AdjustUIFont;
1125 gfx::PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize;
1126 #endif
1127 } 1082 }
1128 1083
1129 int ChromeBrowserMainParts::TemporaryContinue() { 1084 int ChromeBrowserMainParts::PreMainMessageLoopRunInternal() {
1085 run_message_loop_ = false;
1130 FilePath user_data_dir; 1086 FilePath user_data_dir;
1131 #if defined(OS_WIN) 1087 #if defined(OS_WIN)
1132 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); 1088 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
1133 #else 1089 #else
1134 // Getting the user data dir can fail if the directory isn't 1090 // Getting the user data dir can fail if the directory isn't
1135 // creatable, for example; on Windows in code below we bring up a 1091 // creatable, for example; on Windows in code below we bring up a
1136 // dialog prompting the user to pick a different directory. 1092 // dialog prompting the user to pick a different directory.
1137 // However, ProcessSingleton needs a real user_data_dir on Mac/Linux, 1093 // However, ProcessSingleton needs a real user_data_dir on Mac/Linux,
1138 // so it's better to fail here than fail mysteriously elsewhere. 1094 // so it's better to fail here than fail mysteriously elsewhere.
1139 CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) 1095 CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir))
1140 << "Must be able to get user data directory!"; 1096 << "Must be able to get user data directory!";
1141 #endif 1097 #endif
1142 1098
1143 ProcessSingleton process_singleton(user_data_dir); 1099 process_singleton_.reset(new ProcessSingleton(user_data_dir));
1144 1100
1145 bool is_first_run = FirstRun::IsChromeFirstRun() || 1101 bool is_first_run = FirstRun::IsChromeFirstRun() ||
1146 parsed_command_line().HasSwitch(switches::kFirstRun); 1102 parsed_command_line().HasSwitch(switches::kFirstRun);
1147 1103
1148 scoped_ptr<BrowserProcessImpl> browser_process;
1149 if (parsed_command_line().HasSwitch(switches::kImport) || 1104 if (parsed_command_line().HasSwitch(switches::kImport) ||
1150 parsed_command_line().HasSwitch(switches::kImportFromFile)) { 1105 parsed_command_line().HasSwitch(switches::kImportFromFile)) {
1151 // We use different BrowserProcess when importing so no GoogleURLTracker is 1106 // We use different BrowserProcess when importing so no GoogleURLTracker is
1152 // instantiated (as it makes a net::URLRequest and we don't have an IO 1107 // instantiated (as it makes a net::URLRequest and we don't have an IO
1153 // thread, see bug #1292702). 1108 // thread, see bug #1292702).
1154 browser_process.reset(new FirstRunBrowserProcess(parsed_command_line())); 1109 browser_process_.reset(new FirstRunBrowserProcess(parsed_command_line()));
1155 is_first_run = false; 1110 is_first_run = false;
1156 } else { 1111 } else {
1157 browser_process.reset(new BrowserProcessImpl(parsed_command_line())); 1112 browser_process_.reset(new BrowserProcessImpl(parsed_command_line()));
1158 } 1113 }
1159 1114
1160 // This forces the TabCloseableStateWatcher to be created and, on chromeos, 1115 // This forces the TabCloseableStateWatcher to be created and, on chromeos,
1161 // register for the notifications it needs to track the closeable state of 1116 // register for the notifications it needs to track the closeable state of
1162 // tabs. 1117 // tabs.
1163 g_browser_process->tab_closeable_state_watcher(); 1118 g_browser_process->tab_closeable_state_watcher();
1164 1119
1165 PrefService* local_state = InitializeLocalState(parsed_command_line(), 1120 PrefService* local_state = InitializeLocalState(parsed_command_line(),
1166 is_first_run); 1121 is_first_run);
1167 1122
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1209 #if defined(TOOLKIT_GTK) 1164 #if defined(TOOLKIT_GTK)
1210 g_set_application_name(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME).c_str()); 1165 g_set_application_name(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME).c_str());
1211 #endif 1166 #endif
1212 1167
1213 std::string try_chrome = 1168 std::string try_chrome =
1214 parsed_command_line().GetSwitchValueASCII(switches::kTryChromeAgain); 1169 parsed_command_line().GetSwitchValueASCII(switches::kTryChromeAgain);
1215 if (!try_chrome.empty()) { 1170 if (!try_chrome.empty()) {
1216 #if defined(OS_WIN) && !defined(USE_AURA) 1171 #if defined(OS_WIN) && !defined(USE_AURA)
1217 // Setup.exe has determined that we need to run a retention experiment 1172 // Setup.exe has determined that we need to run a retention experiment
1218 // and has lauched chrome to show the experiment UI. 1173 // and has lauched chrome to show the experiment UI.
1219 if (process_singleton.FoundOtherProcessWindow()) { 1174 if (process_singleton_->FoundOtherProcessWindow()) {
1220 // It seems that we don't need to run the experiment since chrome 1175 // It seems that we don't need to run the experiment since chrome
1221 // in the same profile is already running. 1176 // in the same profile is already running.
1222 VLOG(1) << "Retention experiment not required"; 1177 VLOG(1) << "Retention experiment not required";
1223 return TryChromeDialogView::NOT_NOW; 1178 return TryChromeDialogView::NOT_NOW;
1224 } 1179 }
1225 int try_chrome_int; 1180 int try_chrome_int;
1226 base::StringToInt(try_chrome, &try_chrome_int); 1181 base::StringToInt(try_chrome, &try_chrome_int);
1227 TryChromeDialogView::Result answer = 1182 TryChromeDialogView::Result answer =
1228 TryChromeDialogView::Show(try_chrome_int, &process_singleton); 1183 TryChromeDialogView::Show(try_chrome_int, process_singleton_.get());
1229 if (answer == TryChromeDialogView::NOT_NOW) 1184 if (answer == TryChromeDialogView::NOT_NOW)
1230 return chrome::RESULT_CODE_NORMAL_EXIT_CANCEL; 1185 return chrome::RESULT_CODE_NORMAL_EXIT_CANCEL;
1231 if (answer == TryChromeDialogView::UNINSTALL_CHROME) 1186 if (answer == TryChromeDialogView::UNINSTALL_CHROME)
1232 return chrome::RESULT_CODE_NORMAL_EXIT_EXP2; 1187 return chrome::RESULT_CODE_NORMAL_EXIT_EXP2;
1233 #else 1188 #else
1234 // We don't support retention experiments on Mac or Linux. 1189 // We don't support retention experiments on Mac or Linux.
1235 return content::RESULT_CODE_NORMAL_EXIT; 1190 return content::RESULT_CODE_NORMAL_EXIT;
1236 #endif // defined(OS_WIN) 1191 #endif // defined(OS_WIN)
1237 } 1192 }
1238 1193
(...skipping 23 matching lines...) Expand all
1262 chrome_views_delegate->default_parent_view = 1217 chrome_views_delegate->default_parent_view =
1263 views::desktop::DesktopWindowView::desktop_window_view; 1218 views::desktop::DesktopWindowView::desktop_window_view;
1264 } 1219 }
1265 #endif 1220 #endif
1266 1221
1267 BrowserInit browser_init; 1222 BrowserInit browser_init;
1268 1223
1269 // On first run, we need to process the predictor preferences before the 1224 // On first run, we need to process the predictor preferences before the
1270 // browser's profile_manager object is created, but after ResourceBundle 1225 // browser's profile_manager object is created, but after ResourceBundle
1271 // is initialized. 1226 // is initialized.
1272 FirstRun::MasterPrefs master_prefs; 1227 master_prefs_.reset(new FirstRun::MasterPrefs);
1273 bool first_run_ui_bypass = false; // True to skip first run UI. 1228 bool first_run_ui_bypass = false; // True to skip first run UI.
1274 if (is_first_run) { 1229 if (is_first_run) {
1275 first_run_ui_bypass = 1230 first_run_ui_bypass =
1276 !FirstRun::ProcessMasterPreferences(user_data_dir, &master_prefs); 1231 !FirstRun::ProcessMasterPreferences(user_data_dir, master_prefs_.get());
1277 AddFirstRunNewTabs(&browser_init, master_prefs.new_tabs); 1232 AddFirstRunNewTabs(&browser_init, master_prefs_->new_tabs);
1278 1233
1279 // If we are running in App mode, we do not want to show the importer 1234 // If we are running in App mode, we do not want to show the importer
1280 // (first run) UI. 1235 // (first run) UI.
1281 if (!first_run_ui_bypass && 1236 if (!first_run_ui_bypass &&
1282 (parsed_command_line().HasSwitch(switches::kApp) || 1237 (parsed_command_line().HasSwitch(switches::kApp) ||
1283 parsed_command_line().HasSwitch(switches::kAppId) || 1238 parsed_command_line().HasSwitch(switches::kAppId) ||
1284 parsed_command_line().HasSwitch(switches::kNoFirstRun))) 1239 parsed_command_line().HasSwitch(switches::kNoFirstRun)))
1285 first_run_ui_bypass = true; 1240 first_run_ui_bypass = true;
1286 } 1241 }
1287 1242
(...skipping 10 matching lines...) Expand all
1298 local_state->SetBoolean(prefs::kPrintingPrintPreviewEnabledOnce, true); 1253 local_state->SetBoolean(prefs::kPrintingPrintPreviewEnabledOnce, true);
1299 about_flags::SetExperimentEnabled(local_state, "print-preview", true); 1254 about_flags::SetExperimentEnabled(local_state, "print-preview", true);
1300 } 1255 }
1301 #endif 1256 #endif
1302 1257
1303 // Convert active labs into switches. Modifies the current command line. 1258 // Convert active labs into switches. Modifies the current command line.
1304 about_flags::ConvertFlagsToSwitches(local_state, 1259 about_flags::ConvertFlagsToSwitches(local_state,
1305 CommandLine::ForCurrentProcess()); 1260 CommandLine::ForCurrentProcess());
1306 1261
1307 InitializeNetworkOptions(parsed_command_line()); 1262 InitializeNetworkOptions(parsed_command_line());
1308 InitializeURLRequestThrottlerManager(browser_process->net_log()); 1263 InitializeURLRequestThrottlerManager(browser_process_->net_log());
1309 1264
1310 // Initialize histogram synchronizer system. This is a singleton and is used 1265 // Initialize histogram synchronizer system. This is a singleton and is used
1311 // for posting tasks via NewRunnableMethod. Its deleted when it goes out of 1266 // for posting tasks via NewRunnableMethod. Its deleted when it goes out of
1312 // scope. Even though NewRunnableMethod does AddRef and Release, the object 1267 // scope. Even though NewRunnableMethod does AddRef and Release, the object
1313 // will not be deleted after the Task is executed. 1268 // will not be deleted after the Task is executed.
1314 SetupHistogramSynchronizer(); 1269 histogram_synchronizer_ = new HistogramSynchronizer();
1315 1270
1316 // Now the command line has been mutated based on about:flags, we can 1271 // Now the command line has been mutated based on about:flags, we can
1317 // set up metrics and initialize field trials. 1272 // set up metrics and initialize field trials.
1318 MetricsService* metrics = SetupMetricsAndFieldTrials( 1273 MetricsService* metrics =
1319 parsed_command_line(), local_state); 1274 SetupMetricsAndFieldTrials(parsed_command_line(), local_state);
1320 1275
1321 // Now that all preferences have been registered, set the install date 1276 // Now that all preferences have been registered, set the install date
1322 // for the uninstall metrics if this is our first run. This only actually 1277 // for the uninstall metrics if this is our first run. This only actually
1323 // gets used if the user has metrics reporting enabled at uninstall time. 1278 // gets used if the user has metrics reporting enabled at uninstall time.
1324 int64 install_date = 1279 int64 install_date =
1325 local_state->GetInt64(prefs::kUninstallMetricsInstallDate); 1280 local_state->GetInt64(prefs::kUninstallMetricsInstallDate);
1326 if (install_date == 0) { 1281 if (install_date == 0) {
1327 local_state->SetInt64(prefs::kUninstallMetricsInstallDate, 1282 local_state->SetInt64(prefs::kUninstallMetricsInstallDate,
1328 base::Time::Now().ToTimeT()); 1283 base::Time::Now().ToTimeT());
1329 } 1284 }
1330 1285
1331 #if defined(OS_MACOSX) 1286 #if defined(OS_MACOSX)
1332 // Get the Keychain API to register for distributed notifications on the main 1287 // Get the Keychain API to register for distributed notifications on the main
1333 // thread, which has a proper CFRunloop, instead of later on the I/O thread, 1288 // thread, which has a proper CFRunloop, instead of later on the I/O thread,
1334 // which doesn't. This ensures those notifications will get delivered 1289 // which doesn't. This ensures those notifications will get delivered
1335 // properly. See issue 37766. 1290 // properly. See issue 37766.
1336 // (Note that the callback mask here is empty. I don't want to register for 1291 // (Note that the callback mask here is empty. I don't want to register for
1337 // any callbacks, I just want to initialize the mechanism.) 1292 // any callbacks, I just want to initialize the mechanism.)
1338 SecKeychainAddCallback(&KeychainCallback, 0, NULL); 1293 SecKeychainAddCallback(&KeychainCallback, 0, NULL);
1339 #endif 1294 #endif
1340 1295
1341 CreateChildThreads(browser_process.get()); 1296 CreateChildThreads(browser_process_.get());
1342 1297
1343 #if defined(OS_CHROMEOS) 1298 #if defined(OS_CHROMEOS)
1344 // Now that the file thread exists we can record our stats. 1299 // Now that the file thread exists we can record our stats.
1345 chromeos::BootTimesLoader::Get()->RecordChromeMainStats(); 1300 chromeos::BootTimesLoader::Get()->RecordChromeMainStats();
1346 1301
1347 // Read locale-specific GTK resource information. 1302 // Read locale-specific GTK resource information.
1348 std::string gtkrc = l10n_util::GetStringUTF8(IDS_LOCALE_GTKRC); 1303 std::string gtkrc = l10n_util::GetStringUTF8(IDS_LOCALE_GTKRC);
1349 if (!gtkrc.empty()) 1304 if (!gtkrc.empty())
1350 gtk_rc_parse_string(gtkrc.c_str()); 1305 gtk_rc_parse_string(gtkrc.c_str());
1351 1306
1352 // Trigger prefetching of ownership status. 1307 // Trigger prefetching of ownership status.
1353 chromeos::OwnershipService::GetSharedInstance()->Prewarm(); 1308 chromeos::OwnershipService::GetSharedInstance()->Prewarm();
1354 #endif 1309 #endif
1355 1310
1356 // Record last shutdown time into a histogram. 1311 // Record last shutdown time into a histogram.
1357 browser_shutdown::ReadLastShutdownInfo(); 1312 browser_shutdown::ReadLastShutdownInfo();
1358 1313
1359 #if defined(OS_WIN) 1314 #if defined(OS_WIN)
1360 // On Windows, we use our startup as an opportunity to do upgrade/uninstall 1315 // On Windows, we use our startup as an opportunity to do upgrade/uninstall
1361 // tasks. Those care whether the browser is already running. On Linux/Mac, 1316 // tasks. Those care whether the browser is already running. On Linux/Mac,
1362 // upgrade/uninstall happen separately. 1317 // upgrade/uninstall happen separately.
1363 bool already_running = browser_util::IsBrowserAlreadyRunning(); 1318 bool already_running = browser_util::IsBrowserAlreadyRunning();
1364 1319
1365 // If the command line specifies 'uninstall' then we need to work here 1320 // If the command line specifies 'uninstall' then we need to work here
1366 // unless we detect another chrome browser running. 1321 // unless we detect another chrome browser running.
1367 if (parsed_command_line().HasSwitch(switches::kUninstall)) 1322 if (parsed_command_line().HasSwitch(switches::kUninstall)) {
1368 return DoUninstallTasks(already_running); 1323 return DoUninstallTasks(already_running);
1324 }
1369 #endif 1325 #endif
1370 1326
1371 if (parsed_command_line().HasSwitch(switches::kHideIcons) || 1327 if (parsed_command_line().HasSwitch(switches::kHideIcons) ||
1372 parsed_command_line().HasSwitch(switches::kShowIcons)) 1328 parsed_command_line().HasSwitch(switches::kShowIcons)) {
1373 return HandleIconsCommands(parsed_command_line()); 1329 return HandleIconsCommands(parsed_command_line());
1330 }
1374 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) { 1331 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) {
1375 return ShellIntegration::SetAsDefaultBrowser() ? 1332 return ShellIntegration::SetAsDefaultBrowser() ?
1376 static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) : 1333 static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) :
1377 static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED); 1334 static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED);
1378 } 1335 }
1379 1336
1380 // If the command line specifies --pack-extension, attempt the pack extension 1337 // If the command line specifies --pack-extension, attempt the pack extension
1381 // startup action and exit. 1338 // startup action and exit.
1382 if (parsed_command_line().HasSwitch(switches::kPackExtension)) { 1339 if (parsed_command_line().HasSwitch(switches::kPackExtension)) {
1383 ExtensionsStartupUtil extension_startup_util; 1340 ExtensionsStartupUtil extension_startup_util;
1384 if (extension_startup_util.PackExtension(parsed_command_line())) { 1341 if (extension_startup_util.PackExtension(parsed_command_line()))
1385 return content::RESULT_CODE_NORMAL_EXIT; 1342 return content::RESULT_CODE_NORMAL_EXIT;
1386 } else { 1343 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR;
1387 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR;
1388 }
1389 } 1344 }
1390 1345
1391 #if !defined(OS_MACOSX) 1346 #if !defined(OS_MACOSX)
1392 // In environments other than Mac OS X we support import of settings 1347 // In environments other than Mac OS X we support import of settings
1393 // from other browsers. In case this process is a short-lived "import" 1348 // from other browsers. In case this process is a short-lived "import"
1394 // process that another browser runs just to import the settings, we 1349 // process that another browser runs just to import the settings, we
1395 // don't want to be checking for another browser process, by design. 1350 // don't want to be checking for another browser process, by design.
1396 if (!(parsed_command_line().HasSwitch(switches::kImport) || 1351 if (!(parsed_command_line().HasSwitch(switches::kImport) ||
1397 parsed_command_line().HasSwitch(switches::kImportFromFile))) { 1352 parsed_command_line().HasSwitch(switches::kImportFromFile))) {
1398 #endif 1353 #endif
1399 // When another process is running, use that process instead of starting a 1354 // When another process is running, use that process instead of starting a
1400 // new one. NotifyOtherProcess will currently give the other process up to 1355 // new one. NotifyOtherProcess will currently give the other process up to
1401 // 20 seconds to respond. Note that this needs to be done before we attempt 1356 // 20 seconds to respond. Note that this needs to be done before we attempt
1402 // to read the profile. 1357 // to read the profile.
1403 switch (process_singleton.NotifyOtherProcessOrCreate()) { 1358 switch (process_singleton_->NotifyOtherProcessOrCreate()) {
1404 case ProcessSingleton::PROCESS_NONE: 1359 case ProcessSingleton::PROCESS_NONE:
1405 // No process already running, fall through to starting a new one. 1360 // No process already running, fall through to starting a new one.
1406 break; 1361 break;
1407 1362
1408 case ProcessSingleton::PROCESS_NOTIFIED: 1363 case ProcessSingleton::PROCESS_NOTIFIED:
1409 #if defined(OS_POSIX) && !defined(OS_MACOSX) 1364 #if defined(OS_POSIX) && !defined(OS_MACOSX)
1410 printf("%s\n", base::SysWideToNativeMB(UTF16ToWide( 1365 printf("%s\n", base::SysWideToNativeMB(UTF16ToWide(
1411 l10n_util::GetStringUTF16(IDS_USED_EXISTING_BROWSER))).c_str()); 1366 l10n_util::GetStringUTF16(IDS_USED_EXISTING_BROWSER))).c_str());
1412 #endif 1367 #endif
1413 return content::RESULT_CODE_NORMAL_EXIT; 1368 return content::RESULT_CODE_NORMAL_EXIT;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 username); 1426 username);
1472 } 1427 }
1473 #endif 1428 #endif
1474 1429
1475 if (is_first_run) { 1430 if (is_first_run) {
1476 // Warn the ProfileManager that an import process will run, possibly 1431 // Warn the ProfileManager that an import process will run, possibly
1477 // locking the WebDataService directory of the next Profile created. 1432 // locking the WebDataService directory of the next Profile created.
1478 g_browser_process->profile_manager()->SetWillImport(); 1433 g_browser_process->profile_manager()->SetWillImport();
1479 } 1434 }
1480 1435
1481 Profile* profile = CreateProfile(parameters(), user_data_dir, 1436 profile_ = CreateProfile(parameters(), user_data_dir, parsed_command_line());
1482 parsed_command_line()); 1437 if (!profile_)
1483 if (!profile)
1484 return content::RESULT_CODE_NORMAL_EXIT; 1438 return content::RESULT_CODE_NORMAL_EXIT;
1485 1439
1486 // Post-profile init --------------------------------------------------------- 1440 // Post-profile init ---------------------------------------------------------
1487 1441
1488 #if defined(OS_CHROMEOS) 1442 #if defined(OS_CHROMEOS)
1489 // Pass the TokenService pointer to the policy connector so user policy can 1443 // Pass the TokenService pointer to the policy connector so user policy can
1490 // grab a token and register with the policy server. 1444 // grab a token and register with the policy server.
1491 // TODO(mnissler): Remove once OAuth is the only authentication mechanism. 1445 // TODO(mnissler): Remove once OAuth is the only authentication mechanism.
1492 if (parsed_command_line().HasSwitch(switches::kLoginUser) && 1446 if (parsed_command_line().HasSwitch(switches::kLoginUser) &&
1493 !parsed_command_line().HasSwitch(switches::kLoginPassword)) { 1447 !parsed_command_line().HasSwitch(switches::kLoginPassword)) {
1494 g_browser_process->browser_policy_connector()->SetUserPolicyTokenService( 1448 g_browser_process->browser_policy_connector()->SetUserPolicyTokenService(
1495 profile->GetTokenService()); 1449 profile_->GetTokenService());
1496 } 1450 }
1497 #endif 1451 #endif
1498 1452
1499 PrefService* user_prefs = profile->GetPrefs(); 1453 PrefService* user_prefs = profile_->GetPrefs();
1500 DCHECK(user_prefs); 1454 DCHECK(user_prefs);
1501 1455
1502 // Tests should be able to tune login manager before showing it. 1456 // Tests should be able to tune login manager before showing it.
1503 // Thus only show login manager in normal (non-testing) mode. 1457 // Thus only show login manager in normal (non-testing) mode.
1504 if (!parameters().ui_task) { 1458 if (!parameters().ui_task)
1505 OptionallyRunChromeOSLoginManager(parsed_command_line(), profile); 1459 OptionallyRunChromeOSLoginManager(parsed_command_line(), profile_);
1506 }
1507 1460
1508 #if !defined(OS_MACOSX) 1461 #if !defined(OS_MACOSX)
1509 // Importing other browser settings is done in a browser-like process 1462 // Importing other browser settings is done in a browser-like process
1510 // that exits when this task has finished. 1463 // that exits when this task has finished.
1511 // TODO(port): Port the Mac's IPC-based implementation to other platforms to 1464 // TODO(port): Port the Mac's IPC-based implementation to other platforms to
1512 // replace this implementation. http://crbug.com/22142 1465 // replace this implementation. http://crbug.com/22142
1513 if (parsed_command_line().HasSwitch(switches::kImport) || 1466 if (parsed_command_line().HasSwitch(switches::kImport) ||
1514 parsed_command_line().HasSwitch(switches::kImportFromFile)) { 1467 parsed_command_line().HasSwitch(switches::kImportFromFile)) {
1515 return FirstRun::ImportNow(profile, parsed_command_line()); 1468 return FirstRun::ImportNow(profile_, parsed_command_line());
1516 } 1469 }
1517 #endif 1470 #endif
1518 1471
1519 #if defined(OS_WIN) 1472 #if defined(OS_WIN)
1520 // Do the tasks if chrome has been upgraded while it was last running. 1473 // Do the tasks if chrome has been upgraded while it was last running.
1521 if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line())) 1474 if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line()))
1522 return content::RESULT_CODE_NORMAL_EXIT; 1475 return content::RESULT_CODE_NORMAL_EXIT;
1523 #endif 1476 #endif
1524 1477
1525 // Check if there is any machine level Chrome installed on the current 1478 // Check if there is any machine level Chrome installed on the current
1526 // machine. If yes and the current Chrome process is user level, we do not 1479 // machine. If yes and the current Chrome process is user level, we do not
1527 // allow the user level Chrome to run. So we notify the user and uninstall 1480 // allow the user level Chrome to run. So we notify the user and uninstall
1528 // user level Chrome. 1481 // user level Chrome.
1529 // Note this check should only happen here, after all the checks above 1482 // Note this check should only happen here, after all the checks above
1530 // (uninstall, resource bundle initialization, other chrome browser 1483 // (uninstall, resource bundle initialization, other chrome browser
1531 // processes etc). 1484 // processes etc).
1532 // Do not allow this to occur for Chrome Frame user-to-system handoffs. 1485 // Do not allow this to occur for Chrome Frame user-to-system handoffs.
1533 if (!parsed_command_line().HasSwitch(switches::kChromeFrame) && 1486 if (!parsed_command_line().HasSwitch(switches::kChromeFrame) &&
1534 CheckMachineLevelInstall()) 1487 CheckMachineLevelInstall()) {
1535 return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS; 1488 return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS;
1489 }
1536 1490
1537 // Create the TranslateManager singleton. 1491 // Create the TranslateManager singleton.
1538 TranslateManager* translate_manager = TranslateManager::GetInstance(); 1492 translate_manager_ = TranslateManager::GetInstance();
1539 DCHECK(translate_manager != NULL); 1493 DCHECK(translate_manager_ != NULL);
1540 1494
1541 #if defined(OS_MACOSX) 1495 #if defined(OS_MACOSX)
1542 if (!parsed_command_line().HasSwitch(switches::kNoFirstRun)) { 1496 if (!parsed_command_line().HasSwitch(switches::kNoFirstRun)) {
1543 // Disk image installation is sort of a first-run task, so it shares the 1497 // Disk image installation is sort of a first-run task, so it shares the
1544 // kNoFirstRun switch. 1498 // kNoFirstRun switch.
1545 if (MaybeInstallFromDiskImage()) { 1499 if (MaybeInstallFromDiskImage()) {
1546 // The application was installed and the installed copy has been 1500 // The application was installed and the installed copy has been
1547 // launched. This process is now obsolete. Exit. 1501 // launched. This process is now obsolete. Exit.
1548 return content::RESULT_CODE_NORMAL_EXIT; 1502 return content::RESULT_CODE_NORMAL_EXIT;
1549 } 1503 }
1550 } 1504 }
1551 #endif 1505 #endif
1552 1506
1553 // Show the First Run UI if this is the first time Chrome has been run on 1507 // Show the First Run UI if this is the first time Chrome has been run on
1554 // this computer, or we're being compelled to do so by a command line flag. 1508 // this computer, or we're being compelled to do so by a command line flag.
1555 // Note that this be done _after_ the PrefService is initialized and all 1509 // Note that this be done _after_ the PrefService is initialized and all
1556 // preferences are registered, since some of the code that the importer 1510 // preferences are registered, since some of the code that the importer
1557 // touches reads preferences. 1511 // touches reads preferences.
1558 if (is_first_run) { 1512 if (is_first_run) {
1559 if (!first_run_ui_bypass) { 1513 if (!first_run_ui_bypass) {
1560 FirstRun::AutoImport(profile, 1514 FirstRun::AutoImport(profile_,
1561 master_prefs.homepage_defined, 1515 master_prefs_->homepage_defined,
1562 master_prefs.do_import_items, 1516 master_prefs_->do_import_items,
1563 master_prefs.dont_import_items, 1517 master_prefs_->dont_import_items,
1564 master_prefs.run_search_engine_experiment, 1518 master_prefs_->run_search_engine_experiment,
1565 master_prefs.randomize_search_engine_experiment, 1519 master_prefs_->randomize_search_engine_experiment,
1566 master_prefs.make_chrome_default, 1520 master_prefs_->make_chrome_default,
1567 &process_singleton); 1521 process_singleton_.get());
1568 #if defined(OS_POSIX) 1522 #if defined(OS_POSIX)
1569 // On Windows, the download is tagged with enable/disable stats so there 1523 // On Windows, the download is tagged with enable/disable stats so there
1570 // is no need for this code. 1524 // is no need for this code.
1571 1525
1572 // If stats reporting was turned on by the first run dialog then toggle 1526 // If stats reporting was turned on by the first run dialog then toggle
1573 // the pref. 1527 // the pref.
1574 if (GoogleUpdateSettings::GetCollectStatsConsent()) 1528 if (GoogleUpdateSettings::GetCollectStatsConsent())
1575 local_state->SetBoolean(prefs::kMetricsReportingEnabled, true); 1529 local_state->SetBoolean(prefs::kMetricsReportingEnabled, true);
1576 #endif // OS_POSIX 1530 #endif // OS_POSIX
1577 } // if (!first_run_ui_bypass) 1531 } // if (!first_run_ui_bypass)
1578 1532
1579 Browser::SetNewHomePagePrefs(user_prefs); 1533 Browser::SetNewHomePagePrefs(user_prefs);
1580 g_browser_process->profile_manager()->OnImportFinished(profile); 1534 g_browser_process->profile_manager()->OnImportFinished(profile_);
1581 } // if (is_first_run) 1535 } // if (is_first_run)
1582 1536
1583 // Sets things up so that if we crash from this point on, a dialog will 1537 // Sets things up so that if we crash from this point on, a dialog will
1584 // popup asking the user to restart chrome. It is done this late to avoid 1538 // popup asking the user to restart chrome. It is done this late to avoid
1585 // testing against a bunch of special cases that are taken care early on. 1539 // testing against a bunch of special cases that are taken care early on.
1586 PrepareRestartOnCrashEnviroment(parsed_command_line()); 1540 PrepareRestartOnCrashEnviroment(parsed_command_line());
1587 1541
1588 #if defined(OS_WIN) 1542 #if defined(OS_WIN)
1589 // Registers Chrome with the Windows Restart Manager, which will restore the 1543 // Registers Chrome with the Windows Restart Manager, which will restore the
1590 // Chrome session when the computer is restarted after a system update. 1544 // Chrome session when the computer is restarted after a system update.
(...skipping 11 matching lines...) Expand all
1602 bool preconnect_enabled = true; // Default status (easy to change!). 1556 bool preconnect_enabled = true; // Default status (easy to change!).
1603 if (parsed_command_line().HasSwitch(switches::kDisablePreconnect)) 1557 if (parsed_command_line().HasSwitch(switches::kDisablePreconnect))
1604 preconnect_enabled = false; 1558 preconnect_enabled = false;
1605 else if (parsed_command_line().HasSwitch(switches::kEnablePreconnect)) 1559 else if (parsed_command_line().HasSwitch(switches::kEnablePreconnect))
1606 preconnect_enabled = true; 1560 preconnect_enabled = true;
1607 chrome_browser_net::PredictorInit dns_prefetch( 1561 chrome_browser_net::PredictorInit dns_prefetch(
1608 user_prefs, 1562 user_prefs,
1609 local_state, 1563 local_state,
1610 preconnect_enabled); 1564 preconnect_enabled);
1611 1565
1612 #if defined(OS_WIN) 1566 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
1613 base::win::ScopedCOMInitializer com_initializer;
1614
1615 #if defined(GOOGLE_CHROME_BUILD)
1616 // Init the RLZ library. This just binds the dll and schedules a task on the 1567 // Init the RLZ library. This just binds the dll and schedules a task on the
1617 // file thread to be run sometime later. If this is the first run we record 1568 // file thread to be run sometime later. If this is the first run we record
1618 // the installation event. 1569 // the installation event.
1619 bool google_search_default = false; 1570 bool google_search_default = false;
1620 TemplateURLService* template_url_service = 1571 TemplateURLService* template_url_service =
1621 TemplateURLServiceFactory::GetForProfile(profile); 1572 TemplateURLServiceFactory::GetForProfile(profile_);
1622 if (template_url_service) { 1573 if (template_url_service) {
1623 const TemplateURL* url_template = 1574 const TemplateURL* url_template =
1624 template_url_service->GetDefaultSearchProvider(); 1575 template_url_service->GetDefaultSearchProvider();
1625 if (url_template) { 1576 if (url_template) {
1626 const TemplateURLRef* urlref = url_template->url(); 1577 const TemplateURLRef* urlref = url_template->url();
1627 if (urlref) { 1578 if (urlref) {
1628 google_search_default = urlref->HasGoogleBaseURLs(); 1579 google_search_default = urlref->HasGoogleBaseURLs();
1629 } 1580 }
1630 } 1581 }
1631 } 1582 }
1632 1583
1633 bool google_search_homepage = false; 1584 bool google_search_homepage = false;
1634 PrefService* pref_service = profile->GetPrefs(); 1585 PrefService* pref_service = profile_->GetPrefs();
1635 if (pref_service) { 1586 if (pref_service) {
1636 std::string homepage = pref_service->GetString(prefs::kHomePage); 1587 std::string homepage = pref_service->GetString(prefs::kHomePage);
1637 google_search_homepage = 1588 google_search_homepage =
1638 homepage == GoogleURLTracker::kDefaultGoogleHomepage; 1589 homepage == GoogleURLTracker::kDefaultGoogleHomepage;
1639 } 1590 }
1640 1591
1641 RLZTracker::InitRlzDelayed(is_first_run, master_prefs.ping_delay, 1592 RLZTracker::InitRlzDelayed(is_first_run, master_prefs_->ping_delay,
1642 google_search_default, google_search_homepage); 1593 google_search_default, google_search_homepage);
1643 1594
1644 // Prime the RLZ cache for the home page access point so that its avaiable 1595 // Prime the RLZ cache for the home page access point so that its avaiable
1645 // for the startup page if needed (i.e., when the startup page is set to 1596 // for the startup page if needed (i.e., when the startup page is set to
1646 // the home page). 1597 // the home page).
1647 RLZTracker::GetAccessPointRlz(rlz_lib::CHROME_HOME_PAGE, NULL); 1598 RLZTracker::GetAccessPointRlz(rlz_lib::CHROME_HOME_PAGE, NULL);
1648 1599 #endif // GOOGLE_CHROME_BUILD && OS_WIN
1649 #endif // GOOGLE_CHROME_BUILD
1650 #endif // OS_WIN
1651 1600
1652 // Configure modules that need access to resources. 1601 // Configure modules that need access to resources.
1653 net::NetModule::SetResourceProvider(chrome_common_net::NetResourceProvider); 1602 net::NetModule::SetResourceProvider(chrome_common_net::NetResourceProvider);
1654 1603
1655 // In unittest mode, this will do nothing. In normal mode, this will create 1604 // In unittest mode, this will do nothing. In normal mode, this will create
1656 // the global GoogleURLTracker and IntranetRedirectDetector instances, which 1605 // the global GoogleURLTracker and IntranetRedirectDetector instances, which
1657 // will promptly go to sleep for five and seven seconds, respectively (to 1606 // will promptly go to sleep for five and seven seconds, respectively (to
1658 // avoid slowing startup), and wake up afterwards to see if they should do 1607 // avoid slowing startup), and wake up afterwards to see if they should do
1659 // anything else. 1608 // anything else.
1660 // 1609 //
1661 // A simpler way of doing all this would be to have some function which could 1610 // A simpler way of doing all this would be to have some function which could
1662 // give the time elapsed since startup, and simply have these objects check 1611 // give the time elapsed since startup, and simply have these objects check
1663 // that when asked to initialize themselves, but this doesn't seem to exist. 1612 // that when asked to initialize themselves, but this doesn't seem to exist.
1664 // 1613 //
1665 // These can't be created in the BrowserProcessImpl constructor because they 1614 // These can't be created in the BrowserProcessImpl constructor because they
1666 // need to read prefs that get set after that runs. 1615 // need to read prefs that get set after that runs.
1667 browser_process->google_url_tracker(); 1616 browser_process_->google_url_tracker();
1668 browser_process->intranet_redirect_detector(); 1617 browser_process_->intranet_redirect_detector();
1669 1618
1670 // Prepare for memory caching of SDCH dictionaries. 1619 // Prepare for memory caching of SDCH dictionaries.
1671 // Perform A/B test to measure global impact of SDCH support. 1620 // Perform A/B test to measure global impact of SDCH support.
1672 // Set up a field trial to see what disabling SDCH does to latency of page 1621 // Set up a field trial to see what disabling SDCH does to latency of page
1673 // layout globally. 1622 // layout globally.
1674 base::FieldTrial::Probability kSDCH_DIVISOR = 1000; 1623 base::FieldTrial::Probability kSDCH_DIVISOR = 1000;
1675 base::FieldTrial::Probability kSDCH_DISABLE_PROBABILITY = 1; // 0.1% prob. 1624 base::FieldTrial::Probability kSDCH_DISABLE_PROBABILITY = 1; // 0.1% prob.
1676 // After June 30, 2011 builds, it will always be in default group. 1625 // After June 30, 2011 builds, it will always be in default group.
1677 scoped_refptr<base::FieldTrial> sdch_trial( 1626 scoped_refptr<base::FieldTrial> sdch_trial(
1678 new base::FieldTrial("GlobalSdch", kSDCH_DIVISOR, "global_enable_sdch", 1627 new base::FieldTrial("GlobalSdch", kSDCH_DIVISOR, "global_enable_sdch",
(...skipping 28 matching lines...) Expand all
1707 1656
1708 #if defined(TOUCH_UI) 1657 #if defined(TOUCH_UI)
1709 views::TouchFactory::GetInstance()->set_keep_mouse_cursor( 1658 views::TouchFactory::GetInstance()->set_keep_mouse_cursor(
1710 CommandLine::ForCurrentProcess()->HasSwitch(switches::kKeepMouseCursor)); 1659 CommandLine::ForCurrentProcess()->HasSwitch(switches::kKeepMouseCursor));
1711 #endif 1660 #endif
1712 1661
1713 HandleTestParameters(parsed_command_line()); 1662 HandleTestParameters(parsed_command_line());
1714 RecordBreakpadStatusUMA(metrics); 1663 RecordBreakpadStatusUMA(metrics);
1715 about_flags::RecordUMAStatistics(local_state); 1664 about_flags::RecordUMAStatistics(local_state);
1716 LanguageUsageMetrics::RecordAcceptLanguages( 1665 LanguageUsageMetrics::RecordAcceptLanguages(
1717 profile->GetPrefs()->GetString(prefs::kAcceptLanguages)); 1666 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
1718 LanguageUsageMetrics::RecordApplicationLanguage( 1667 LanguageUsageMetrics::RecordApplicationLanguage(
1719 g_browser_process->GetApplicationLocale()); 1668 g_browser_process->GetApplicationLocale());
1720 1669
1721 #if defined(OS_CHROMEOS) 1670 #if defined(OS_CHROMEOS)
1722 metrics->StartExternalMetrics(); 1671 metrics->StartExternalMetrics();
1723 1672
1724 // Initialize the brightness observer so that we'll display an onscreen 1673 // Initialize the brightness observer so that we'll display an onscreen
1725 // indication of brightness changes during login. 1674 // indication of brightness changes during login.
1726 static chromeos::BrightnessObserver* brightness_observer = 1675 static chromeos::BrightnessObserver* brightness_observer =
1727 new chromeos::BrightnessObserver(); 1676 new chromeos::BrightnessObserver();
1728 chromeos::CrosLibrary::Get()->GetBrightnessLibrary()->AddObserver( 1677 chromeos::CrosLibrary::Get()->GetBrightnessLibrary()->AddObserver(
1729 brightness_observer); 1678 brightness_observer);
1730 1679
1731 // Listen for system key events so that the user will be able to adjust the 1680 // Listen for system key events so that the user will be able to adjust the
1732 // volume on the login screen. 1681 // volume on the login screen.
1733 chromeos::SystemKeyEventListener::GetInstance(); 1682 chromeos::SystemKeyEventListener::GetInstance();
1734 1683
1735 // Listen for XI_HierarchyChanged events. 1684 // Listen for XI_HierarchyChanged events.
1736 chromeos::XInputHierarchyChangedEventListener::GetInstance(); 1685 chromeos::XInputHierarchyChangedEventListener::GetInstance();
1737 #endif 1686 #endif
1738 1687
1739 // The extension service may be available at this point. If the command line 1688 // The extension service may be available at this point. If the command line
1740 // specifies --uninstall-extension, attempt the uninstall extension startup 1689 // specifies --uninstall-extension, attempt the uninstall extension startup
1741 // action. 1690 // action.
1742 if (parsed_command_line().HasSwitch(switches::kUninstallExtension)) { 1691 if (parsed_command_line().HasSwitch(switches::kUninstallExtension)) {
1743 ExtensionsStartupUtil ext_startup_util; 1692 ExtensionsStartupUtil ext_startup_util;
1744 if (ext_startup_util.UninstallExtension(parsed_command_line(), profile)) { 1693 if (ext_startup_util.UninstallExtension(parsed_command_line(), profile_))
1745 return content::RESULT_CODE_NORMAL_EXIT; 1694 return content::RESULT_CODE_NORMAL_EXIT;
1746 } else { 1695 return chrome::RESULT_CODE_UNINSTALL_EXTENSION_ERROR;
1747 return chrome::RESULT_CODE_UNINSTALL_EXTENSION_ERROR;
1748 }
1749 } 1696 }
1750 1697
1751 #if defined(OS_WIN) 1698 #if defined(OS_WIN)
1752 // We check this here because if the profile is OTR (chromeos possibility) 1699 // We check this here because if the profile is OTR (chromeos possibility)
1753 // it won't still be accessible after browser is destroyed. 1700 // it won't still be accessible after browser is destroyed.
1754 bool record_search_engine = is_first_run && !profile->IsOffTheRecord(); 1701 record_search_engine_ = is_first_run && !profile_->IsOffTheRecord();
1755 #endif 1702 #endif
1756 1703
1757 // ChildProcess:: is a misnomer unless you consider context. Use 1704 // ChildProcess:: is a misnomer unless you consider context. Use
1758 // of --wait-for-debugger only makes sense when Chrome itself is a 1705 // of --wait-for-debugger only makes sense when Chrome itself is a
1759 // child process (e.g. when launched by PyAuto). 1706 // child process (e.g. when launched by PyAuto).
1760 if (parsed_command_line().HasSwitch(switches::kWaitForDebugger)) { 1707 if (parsed_command_line().HasSwitch(switches::kWaitForDebugger)) {
1761 ChildProcess::WaitForDebugger("Browser"); 1708 ChildProcess::WaitForDebugger("Browser");
1762 } 1709 }
1763 1710
1764 #if defined(OS_CHROMEOS) 1711 #if defined(OS_CHROMEOS)
1765 // Run the Out of Memory priority manager while in this scope. Wait 1712 // Run the Out of Memory priority manager while in this scope. Wait
1766 // until here to start so that we give the most amount of time for 1713 // until here to start so that we give the most amount of time for
1767 // the other services to start up before we start adjusting the oom 1714 // the other services to start up before we start adjusting the oom
1768 // priority. In reality, it doesn't matter much where in this scope 1715 // priority. In reality, it doesn't matter much where in this scope
1769 // this is started, but it must be started in this scope so it will 1716 // this is started, but it must be started in this scope so it will
1770 // also be terminated when this scope exits. 1717 // also be terminated when this scope exits.
1771 scoped_ptr<browser::OomPriorityManager> oom_priority_manager( 1718 scoped_ptr<browser::OomPriorityManager> oom_priority_manager(
1772 new browser::OomPriorityManager); 1719 new browser::OomPriorityManager);
1773 #endif 1720 #endif
1774 1721
1775 // Create the instance of the cloud print proxy service so that it can launch 1722 // Create the instance of the cloud print proxy service so that it can launch
1776 // the service process if needed. This is needed because the service process 1723 // the service process if needed. This is needed because the service process
1777 // might have shutdown because an update was available. 1724 // might have shutdown because an update was available.
1778 // TODO(torne): this should maybe be done with 1725 // TODO(torne): this should maybe be done with
1779 // ProfileKeyedServiceFactory::ServiceIsCreatedWithProfile() instead? 1726 // ProfileKeyedServiceFactory::ServiceIsCreatedWithProfile() instead?
1780 CloudPrintProxyServiceFactory::GetForProfile(profile); 1727 CloudPrintProxyServiceFactory::GetForProfile(profile_);
1781 1728
1782 // Initialize GpuDataManager and collect preliminary gpu info on FILE thread. 1729 // Initialize GpuDataManager and collect preliminary gpu info on FILE thread.
1783 // Upon completion, it posts GpuBlacklist auto update task on UI thread. 1730 // Upon completion, it posts GpuBlacklist auto update task on UI thread.
1784 BrowserThread::PostTask( 1731 BrowserThread::PostTask(
1785 BrowserThread::FILE, FROM_HERE, 1732 BrowserThread::FILE, FROM_HERE,
1786 NewRunnableFunction(&GpuBlacklistUpdater::SetupOnFileThread)); 1733 NewRunnableFunction(&GpuBlacklistUpdater::SetupOnFileThread));
1787 1734
1788 // Start watching all browser threads for responsiveness. 1735 // Start watching all browser threads for responsiveness.
1789 ThreadWatcherList::StartWatchingAll(parsed_command_line()); 1736 ThreadWatcherList::StartWatchingAll(parsed_command_line());
1790 1737
1791 int result_code = content::RESULT_CODE_NORMAL_EXIT; 1738 int result_code = content::RESULT_CODE_NORMAL_EXIT;
1792 base::mac::ScopedNSAutoreleasePool* pool = parameters().autorelease_pool_; 1739 base::mac::ScopedNSAutoreleasePool* pool = parameters().autorelease_pool_;
1793 if (parameters().ui_task) { 1740 if (parameters().ui_task) {
1794 // We are in test mode. Run one task and enter the main message loop. 1741 // We are in test mode. Run one task and enter the main message loop.
1795 if (pool) 1742 if (pool)
1796 pool->Recycle(); 1743 pool->Recycle();
1797 parameters().ui_task->Run(); 1744 parameters().ui_task->Run();
1798 delete parameters().ui_task; 1745 delete parameters().ui_task;
1799 } else { 1746 } else {
1800 // Most general initialization is behind us, but opening a 1747 // Most general initialization is behind us, but opening a
1801 // tab and/or session restore and such is still to be done. 1748 // tab and/or session restore and such is still to be done.
1802 base::TimeTicks browser_open_start = base::TimeTicks::Now(); 1749 base::TimeTicks browser_open_start = base::TimeTicks::Now();
1803 1750
1804 // We are in regular browser boot sequence. Open initial tabs and enter the 1751 // We are in regular browser boot sequence. Open initial tabs and enter the
1805 // main message loop. 1752 // main message loop.
1806 if (browser_init.Start(parsed_command_line(), FilePath(), profile, 1753 if (browser_init.Start(parsed_command_line(), FilePath(), profile_,
1807 &result_code)) { 1754 &result_code)) {
1808 #if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 1755 #if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
1809 // Initialize autoupdate timer. Timer callback costs basically nothing 1756 // Initialize autoupdate timer. Timer callback costs basically nothing
1810 // when browser is not in persistent mode, so it's OK to let it ride on 1757 // when browser is not in persistent mode, so it's OK to let it ride on
1811 // the main thread. This needs to be done here because we don't want 1758 // the main thread. This needs to be done here because we don't want
1812 // to start the timer when Chrome is run inside a test harness. 1759 // to start the timer when Chrome is run inside a test harness.
1813 g_browser_process->StartAutoupdateTimer(); 1760 g_browser_process->StartAutoupdateTimer();
1814 #endif 1761 #endif
1815 1762
1816 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 1763 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
(...skipping 12 matching lines...) Expand all
1829 pool->Recycle(); 1776 pool->Recycle();
1830 1777
1831 RecordPreReadExperimentTime("Startup.BrowserOpenTabs", 1778 RecordPreReadExperimentTime("Startup.BrowserOpenTabs",
1832 base::TimeTicks::Now() - browser_open_start); 1779 base::TimeTicks::Now() - browser_open_start);
1833 1780
1834 // TODO(mad): Move this call in a proper place on CrOS. 1781 // TODO(mad): Move this call in a proper place on CrOS.
1835 // http://crosbug.com/17687 1782 // http://crosbug.com/17687
1836 #if !defined(OS_CHROMEOS) 1783 #if !defined(OS_CHROMEOS)
1837 // If we're running tests (ui_task is non-null), then we don't want to 1784 // If we're running tests (ui_task is non-null), then we don't want to
1838 // call FetchLanguageListFromTranslateServer 1785 // call FetchLanguageListFromTranslateServer
1839 if (parameters().ui_task == NULL && translate_manager != NULL) { 1786 if (parameters().ui_task == NULL && translate_manager_ != NULL) {
1840 // TODO(willchan): Get rid of this after TranslateManager doesn't use 1787 // TODO(willchan): Get rid of this after TranslateManager doesn't use
1841 // the default request context. http://crbug.com/89396. 1788 // the default request context. http://crbug.com/89396.
1842 // This is necessary to force |default_request_context_| to be 1789 // This is necessary to force |default_request_context_| to be
1843 // initialized. 1790 // initialized.
1844 profile->GetRequestContext(); 1791 profile_->GetRequestContext();
1845 translate_manager->FetchLanguageListFromTranslateServer(user_prefs); 1792 translate_manager_->FetchLanguageListFromTranslateServer(user_prefs);
1846 } 1793 }
1847 #endif 1794 #endif
1848 1795
1849 RunUIMessageLoop(browser_process.get()); 1796 run_message_loop_ = true;
1850 } 1797 }
1851 } 1798 }
1852 1799
1800 return result_code;
1801 }
1802
1803 void ChromeBrowserMainParts::MainMessageLoopRun() {
1804 if (!run_message_loop_)
1805 return;
1806
1807 // This should be invoked as close to the start of the browser's
1808 // UI thread message loop as possible to get a stable measurement
1809 // across versions.
1810 RecordBrowserStartupTime();
1811
1812 #if defined(TOOLKIT_VIEWS)
1813 views::AcceleratorHandler accelerator_handler;
1814 MessageLoopForUI::current()->Run(&accelerator_handler);
1815 #elif defined(USE_X11)
1816 MessageLoopForUI::current()->Run(NULL);
1817 #elif defined(OS_POSIX)
1818 MessageLoopForUI::current()->Run();
1819 #endif
1820 #if defined(OS_CHROMEOS)
1821 chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded",
1822 true);
1823 #endif
1824 }
1825
1826 void ChromeBrowserMainParts::PostMainMessageLoopRun() {
1853 // Start watching for jank during shutdown. It gets disarmed when 1827 // Start watching for jank during shutdown. It gets disarmed when
1854 // |shutdown_watcher_| object is destructed. 1828 // |shutdown_watcher_| object is destructed.
1855 shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(45)); 1829 shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(45));
1856 1830
1857 #if defined(OS_WIN) 1831 #if defined(OS_WIN)
1858 // If it's the first run, log the search engine chosen. We wait until 1832 // If it's the first run, log the search engine chosen. We wait until
1859 // shutdown because otherwise we can't be sure the user has finished 1833 // shutdown because otherwise we can't be sure the user has finished
1860 // selecting a search engine through the dialog reached from the first run 1834 // selecting a search engine through the dialog reached from the first run
1861 // bubble link. 1835 // bubble link.
1862 if (record_search_engine) { 1836 if (record_search_engine_) {
1863 TemplateURLService* url_service = 1837 TemplateURLService* url_service =
1864 TemplateURLServiceFactory::GetForProfile(profile); 1838 TemplateURLServiceFactory::GetForProfile(profile_);
1865 const TemplateURL* default_search_engine = 1839 const TemplateURL* default_search_engine =
1866 url_service->GetDefaultSearchProvider(); 1840 url_service->GetDefaultSearchProvider();
1867 // The default engine can be NULL if the administrator has disabled 1841 // The default engine can be NULL if the administrator has disabled
1868 // default search. 1842 // default search.
1869 SearchEngineType search_engine_type = 1843 SearchEngineType search_engine_type =
1870 default_search_engine ? default_search_engine->search_engine_type() : 1844 default_search_engine ? default_search_engine->search_engine_type() :
1871 SEARCH_ENGINE_OTHER; 1845 SEARCH_ENGINE_OTHER;
1872 // Record the search engine chosen. 1846 // Record the search engine chosen.
1873 if (master_prefs.run_search_engine_experiment) { 1847 if (master_prefs_->run_search_engine_experiment) {
1874 UMA_HISTOGRAM_ENUMERATION( 1848 UMA_HISTOGRAM_ENUMERATION(
1875 "Chrome.SearchSelectExperiment", 1849 "Chrome.SearchSelectExperiment",
1876 search_engine_type, 1850 search_engine_type,
1877 SEARCH_ENGINE_MAX); 1851 SEARCH_ENGINE_MAX);
1878 // If the selection has been randomized, also record the winner by slot. 1852 // If the selection has been randomized, also record the winner by slot.
1879 if (master_prefs.randomize_search_engine_experiment) { 1853 if (master_prefs_->randomize_search_engine_experiment) {
1880 size_t engine_pos = url_service->GetSearchEngineDialogSlot(); 1854 size_t engine_pos = url_service->GetSearchEngineDialogSlot();
1881 if (engine_pos < 4) { 1855 if (engine_pos < 4) {
1882 std::string experiment_type = "Chrome.SearchSelectExperimentSlot"; 1856 std::string experiment_type = "Chrome.SearchSelectExperimentSlot";
1883 // Nicer in UMA if slots are 1-based. 1857 // Nicer in UMA if slots are 1-based.
1884 experiment_type.push_back('1' + engine_pos); 1858 experiment_type.push_back('1' + engine_pos);
1885 UMA_HISTOGRAM_ENUMERATION( 1859 UMA_HISTOGRAM_ENUMERATION(
1886 experiment_type, 1860 experiment_type,
1887 search_engine_type, 1861 search_engine_type,
1888 SEARCH_ENGINE_MAX); 1862 SEARCH_ENGINE_MAX);
1889 } else { 1863 } else {
1890 NOTREACHED() << "Invalid search engine selection slot."; 1864 NOTREACHED() << "Invalid search engine selection slot.";
1891 } 1865 }
1892 } 1866 }
1893 } else { 1867 } else {
1894 UMA_HISTOGRAM_ENUMERATION( 1868 UMA_HISTOGRAM_ENUMERATION(
1895 "Chrome.SearchSelectExempt", 1869 "Chrome.SearchSelectExempt",
1896 search_engine_type, 1870 search_engine_type,
1897 SEARCH_ENGINE_MAX); 1871 SEARCH_ENGINE_MAX);
1898 } 1872 }
1899 } 1873 }
1900 #endif 1874 #endif
1901 1875
1902 // Some tests don't set parameters.ui_task, so they started translate 1876 // Some tests don't set parameters.ui_task, so they started translate
1903 // language fetch that was never completed so we need to cleanup here 1877 // language fetch that was never completed so we need to cleanup here
1904 // otherwise it will be done by the destructor in a wrong thread. 1878 // otherwise it will be done by the destructor in a wrong thread.
1905 if (parameters().ui_task == NULL && translate_manager != NULL) 1879 if (parameters().ui_task == NULL && translate_manager_ != NULL)
1906 translate_manager->CleanupPendingUlrFetcher(); 1880 translate_manager_->CleanupPendingUlrFetcher();
1907 1881
1908 1882 process_singleton_->Cleanup();
1909 process_singleton.Cleanup();
1910 1883
1911 // Stop all tasks that might run on WatchDogThread. 1884 // Stop all tasks that might run on WatchDogThread.
1912 ThreadWatcherList::StopWatchingAll(); 1885 ThreadWatcherList::StopWatchingAll();
1913 1886
1914 metrics->Stop(); 1887 g_browser_process->metrics_service()->Stop();
1915 1888
1916 // browser_shutdown takes care of deleting browser_process, so we need to 1889 // browser_shutdown takes care of deleting browser_process, so we need to
1917 // release it. 1890 // release it.
1918 ignore_result(browser_process.release()); 1891 ignore_result(browser_process_.release());
1919 browser_shutdown::Shutdown(); 1892 browser_shutdown::Shutdown();
1893 master_prefs_.reset();
1894 process_singleton_.reset();
1895 }
1920 1896
1921 return result_code; 1897 void ChromeBrowserMainParts::ToolkitInitialized() {
1898 #if defined(TOOLKIT_VIEWS)
1899 // The delegate needs to be set before any UI is created so that windows
1900 // display the correct icon.
1901 if (!views::ViewsDelegate::views_delegate)
1902 views::ViewsDelegate::views_delegate = new ChromeViewsDelegate;
1903
1904 // TODO(beng): Move to WidgetImpl and implement on Windows too!
1905 if (parameters().command_line_.HasSwitch(switches::kDebugViewsPaint))
1906 views::Widget::SetDebugPaintEnabled(true);
1907 #endif
1908
1909 #if defined(OS_WIN)
1910 gfx::PlatformFontWin::adjust_font_callback = &AdjustUIFont;
1911 gfx::PlatformFontWin::get_minimum_font_size_callback = &GetMinimumFontSize;
1912 #endif
1922 } 1913 }
1923 1914
1924 // This code is specific to the Windows-only PreReadExperiment field-trial. 1915 // This code is specific to the Windows-only PreReadExperiment field-trial.
1925 void RecordPreReadExperimentTime(const char* name, base::TimeDelta time) { 1916 void RecordPreReadExperimentTime(const char* name, base::TimeDelta time) {
1926 DCHECK(name != NULL); 1917 DCHECK(name != NULL);
1927 1918
1928 // This gets called with different histogram names, so we don't want to use 1919 // This gets called with different histogram names, so we don't want to use
1929 // the UMA_HISTOGRAM_CUSTOM_TIMES macro--it uses a static variable, and the 1920 // the UMA_HISTOGRAM_CUSTOM_TIMES macro--it uses a static variable, and the
1930 // first call wins. 1921 // first call wins.
1931 AddPreReadHistogramTime(name, time); 1922 AddPreReadHistogramTime(name, time);
1932 1923
1933 #if defined(OS_WIN) 1924 #if defined(OS_WIN)
1934 #if defined(GOOGLE_CHROME_BUILD) 1925 #if defined(GOOGLE_CHROME_BUILD)
1935 // The pre-read experiment is Windows and Google Chrome specific. 1926 // The pre-read experiment is Windows and Google Chrome specific.
1936 scoped_ptr<base::Environment> env(base::Environment::Create()); 1927 scoped_ptr<base::Environment> env(base::Environment::Create());
1937 1928
1938 // Only record the sub-histogram result if the experiment is running 1929 // Only record the sub-histogram result if the experiment is running
1939 // (environment variable is set, and valid). 1930 // (environment variable is set, and valid).
1940 std::string pre_read; 1931 std::string pre_read;
1941 if (env->GetVar(chrome::kPreReadEnvironmentVariable, &pre_read) && 1932 if (env->GetVar(chrome::kPreReadEnvironmentVariable, &pre_read) &&
1942 (pre_read == "0" || pre_read == "1")) { 1933 (pre_read == "0" || pre_read == "1")) {
1943 std::string uma_name(name); 1934 std::string uma_name(name);
1944 uma_name += "_PreRead"; 1935 uma_name += "_PreRead";
1945 uma_name += pre_read == "1" ? "Enabled" : "Disabled"; 1936 uma_name += pre_read == "1" ? "Enabled" : "Disabled";
1946 AddPreReadHistogramTime(uma_name.c_str(), time); 1937 AddPreReadHistogramTime(uma_name.c_str(), time);
1947 } 1938 }
1948 #endif 1939 #endif
1949 #endif 1940 #endif
1950 } 1941 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_main.h ('k') | chrome/browser/browser_main_gtk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698