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

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

Issue 8670001: Move chromeos specific code to ChromeBrowserMainPartsChromeos (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 9 years 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/chrome_browser_main.h ('k') | chrome/browser/chrome_browser_main_extra_parts.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/chrome_browser_main.h" 5 #include "chrome/browser/chrome_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
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 #include "chrome/browser/profiles/profile.h" 69 #include "chrome/browser/profiles/profile.h"
70 #include "chrome/browser/profiles/profile_manager.h" 70 #include "chrome/browser/profiles/profile_manager.h"
71 #include "chrome/browser/search_engines/search_engine_type.h" 71 #include "chrome/browser/search_engines/search_engine_type.h"
72 #include "chrome/browser/search_engines/template_url.h" 72 #include "chrome/browser/search_engines/template_url.h"
73 #include "chrome/browser/search_engines/template_url_service.h" 73 #include "chrome/browser/search_engines/template_url_service.h"
74 #include "chrome/browser/search_engines/template_url_service_factory.h" 74 #include "chrome/browser/search_engines/template_url_service_factory.h"
75 #include "chrome/browser/service/service_process_control.h" 75 #include "chrome/browser/service/service_process_control.h"
76 #include "chrome/browser/shell_integration.h" 76 #include "chrome/browser/shell_integration.h"
77 #include "chrome/browser/translate/translate_manager.h" 77 #include "chrome/browser/translate/translate_manager.h"
78 #include "chrome/browser/ui/browser.h" 78 #include "chrome/browser/ui/browser.h"
79 #include "chrome/browser/ui/browser_init.h"
79 #include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h" 80 #include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h"
80 #include "chrome/browser/web_resource/gpu_blacklist_updater.h" 81 #include "chrome/browser/web_resource/gpu_blacklist_updater.h"
81 #include "chrome/common/child_process_logging.h" 82 #include "chrome/common/child_process_logging.h"
82 #include "chrome/common/chrome_constants.h" 83 #include "chrome/common/chrome_constants.h"
83 #include "chrome/common/chrome_paths.h" 84 #include "chrome/common/chrome_paths.h"
84 #include "chrome/common/chrome_result_codes.h" 85 #include "chrome/common/chrome_result_codes.h"
85 #include "chrome/common/chrome_switches.h" 86 #include "chrome/common/chrome_switches.h"
86 #include "chrome/common/chrome_version_info.h" 87 #include "chrome/common/chrome_version_info.h"
87 #include "chrome/common/env_vars.h" 88 #include "chrome/common/env_vars.h"
88 #include "chrome/common/json_pref_store.h" 89 #include "chrome/common/json_pref_store.h"
(...skipping 30 matching lines...) Expand all
119 #if defined(USE_LINUX_BREAKPAD) 120 #if defined(USE_LINUX_BREAKPAD)
120 #include "base/linux_util.h" 121 #include "base/linux_util.h"
121 #include "chrome/app/breakpad_linux.h" 122 #include "chrome/app/breakpad_linux.h"
122 #endif 123 #endif
123 124
124 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) 125 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
125 #include "chrome/browser/first_run/upgrade_util_linux.h" 126 #include "chrome/browser/first_run/upgrade_util_linux.h"
126 #endif 127 #endif
127 128
128 #if defined(OS_CHROMEOS) 129 #if defined(OS_CHROMEOS)
129 #include "chrome/browser/chromeos/audio_handler.h"
130 #include "chrome/browser/chromeos/boot_times_loader.h"
131 #include "chrome/browser/chromeos/cros/cros_library.h" 130 #include "chrome/browser/chromeos/cros/cros_library.h"
132 #include "chrome/browser/chromeos/cros_settings.h" 131 #include "chrome/browser/chromeos/cros_settings.h"
133 #include "chrome/browser/chromeos/cros_settings_names.h" 132 #include "chrome/browser/chromeos/cros_settings_names.h"
134 #include "chrome/browser/chromeos/customization_document.h"
135 #include "chrome/browser/chromeos/dbus/dbus_thread_manager.h"
136 #include "chrome/browser/chromeos/external_metrics.h"
137 #include "chrome/browser/chromeos/login/authenticator.h"
138 #include "chrome/browser/chromeos/login/login_utils.h"
139 #include "chrome/browser/chromeos/login/ownership_service.h"
140 #include "chrome/browser/chromeos/login/screen_locker.h"
141 #include "chrome/browser/chromeos/login/user_manager.h"
142 #include "chrome/browser/chromeos/status/status_area_view_chromeos.h"
143 #include "chrome/browser/chromeos/system/runtime_environment.h"
144 #include "chrome/browser/chromeos/system_key_event_listener.h"
145 #include "chrome/browser/chromeos/xinput_hierarchy_changed_event_listener.h"
146 #include "chrome/browser/oom_priority_manager.h"
147 #include "chrome/browser/ui/views/browser_dialogs.h"
148 #endif 133 #endif
149 134
150 // TODO(port): several win-only methods have been pulled out of this, but 135 // 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 136 // 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 137 // 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. 138 // progress and should not be taken as an indication of a real refactoring.
154 139
155 #if defined(OS_WIN) 140 #if defined(OS_WIN)
156 #include "base/environment.h" // For PreRead experiment. 141 #include "base/environment.h" // For PreRead experiment.
157 #include "base/win/windows_version.h" 142 #include "base/win/windows_version.h"
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 #else 423 #else
439 // TODO(port): fix this. See comments near the definition of 424 // TODO(port): fix this. See comments near the definition of
440 // user_data_dir. It is better to CHECK-fail here than it is to 425 // user_data_dir. It is better to CHECK-fail here than it is to
441 // silently exit because of missing code in the above test. 426 // silently exit because of missing code in the above test.
442 CHECK(profile) << "Cannot get default profile."; 427 CHECK(profile) << "Cannot get default profile.";
443 #endif 428 #endif
444 429
445 return NULL; 430 return NULL;
446 } 431 }
447 432
448 #if defined(OS_CHROMEOS)
449
450 // Class is used to login using passed username and password.
451 // The instance will be deleted upon success or failure.
452 class StubLogin : public chromeos::LoginStatusConsumer,
453 public chromeos::LoginUtils::Delegate {
454 public:
455 StubLogin(std::string username, std::string password)
456 : pending_requests_(false),
457 profile_prepared_(false) {
458 authenticator_ = chromeos::LoginUtils::Get()->CreateAuthenticator(this);
459 authenticator_.get()->AuthenticateToLogin(
460 g_browser_process->profile_manager()->GetDefaultProfile(),
461 username,
462 password,
463 std::string(),
464 std::string());
465 }
466
467 ~StubLogin() {
468 chromeos::LoginUtils::Get()->DelegateDeleted(this);
469 }
470
471 void OnLoginFailure(const chromeos::LoginFailure& error) {
472 LOG(ERROR) << "Login Failure: " << error.GetErrorString();
473 delete this;
474 }
475
476 void OnLoginSuccess(const std::string& username,
477 const std::string& password,
478 const GaiaAuthConsumer::ClientLoginResult& credentials,
479 bool pending_requests,
480 bool using_oauth) {
481 pending_requests_ = pending_requests;
482 if (!profile_prepared_) {
483 // Will call OnProfilePrepared in the end.
484 chromeos::LoginUtils::Get()->PrepareProfile(username,
485 password,
486 credentials,
487 pending_requests,
488 using_oauth,
489 false,
490 this);
491 } else if (!pending_requests) {
492 delete this;
493 }
494 }
495
496 // LoginUtils::Delegate implementation:
497 virtual void OnProfilePrepared(Profile* profile) {
498 profile_prepared_ = true;
499 chromeos::LoginUtils::DoBrowserLaunch(profile, NULL);
500 if (!pending_requests_)
501 delete this;
502 }
503
504 scoped_refptr<chromeos::Authenticator> authenticator_;
505 bool pending_requests_;
506 bool profile_prepared_;
507 };
508
509 void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line,
510 Profile* profile) {
511 if (parsed_command_line.HasSwitch(switches::kLoginManager)) {
512 std::string first_screen =
513 parsed_command_line.GetSwitchValueASCII(switches::kLoginScreen);
514 std::string size_arg =
515 parsed_command_line.GetSwitchValueASCII(
516 switches::kLoginScreenSize);
517 gfx::Size size(0, 0);
518 // Allow the size of the login window to be set explicitly. If not set,
519 // default to the entire screen. This is mostly useful for testing.
520 if (size_arg.size()) {
521 std::vector<std::string> dimensions;
522 base::SplitString(size_arg, ',', &dimensions);
523 if (dimensions.size() == 2) {
524 int width, height;
525 if (base::StringToInt(dimensions[0], &width) &&
526 base::StringToInt(dimensions[1], &height))
527 size.SetSize(width, height);
528 }
529 }
530 browser::ShowLoginWizard(first_screen, size);
531 } else if (parsed_command_line.HasSwitch(switches::kLoginUser) &&
532 parsed_command_line.HasSwitch(switches::kLoginPassword)) {
533 chromeos::BootTimesLoader::Get()->RecordLoginAttempted();
534 new StubLogin(
535 parsed_command_line.GetSwitchValueASCII(switches::kLoginUser),
536 parsed_command_line.GetSwitchValueASCII(switches::kLoginPassword));
537 } else {
538 if (!parsed_command_line.HasSwitch(switches::kTestName)) {
539 // We did not log in (we crashed or are debugging), so we need to
540 // set the user name for sync.
541 chromeos::LoginUtils::Get()->RestoreAuthenticationSession(
542 chromeos::UserManager::Get()->logged_in_user().email(), profile);
543 }
544 }
545 }
546
547 #endif // defined(OS_CHROMEOS)
548
549 #if defined(OS_MACOSX) 433 #if defined(OS_MACOSX)
550 OSStatus KeychainCallback(SecKeychainEvent keychain_event, 434 OSStatus KeychainCallback(SecKeychainEvent keychain_event,
551 SecKeychainCallbackInfo *info, void *context) { 435 SecKeychainCallbackInfo *info, void *context) {
552 return noErr; 436 return noErr;
553 } 437 }
554 #endif 438 #endif
555 439
556 #if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK) 440 #if defined(OS_CHROMEOS) && defined(TOOLKIT_USES_GTK)
557 void RegisterTranslateableItems(void) { 441 void RegisterTranslateableItems(void) {
558 struct { 442 struct {
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 SpdyFieldTrial(); 1013 SpdyFieldTrial();
1130 ConnectBackupJobsFieldTrial(); 1014 ConnectBackupJobsFieldTrial();
1131 WarmConnectionFieldTrial(); 1015 WarmConnectionFieldTrial();
1132 PredictorFieldTrial(); 1016 PredictorFieldTrial();
1133 DefaultAppsFieldTrial(); 1017 DefaultAppsFieldTrial();
1134 } 1018 }
1135 1019
1136 // ----------------------------------------------------------------------------- 1020 // -----------------------------------------------------------------------------
1137 // TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts. 1021 // TODO(viettrungluu): move more/rest of BrowserMain() into BrowserMainParts.
1138 1022
1139 #if defined(OS_CHROMEOS)
1140 // Allows authenticator to be invoked without adding refcounting. The instances
1141 // will delete themselves upon completion.
1142 DISABLE_RUNNABLE_METHOD_REFCOUNT(StubLogin);
1143 #endif
1144
1145 #if defined(OS_WIN) 1023 #if defined(OS_WIN)
1146 #define DLLEXPORT __declspec(dllexport) 1024 #define DLLEXPORT __declspec(dllexport)
1147 1025
1148 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling. 1026 // We use extern C for the prototype DLLEXPORT to avoid C++ name mangling.
1149 extern "C" { 1027 extern "C" {
1150 DLLEXPORT void __cdecl RelaunchChromeBrowserWithNewCommandLineIfNeeded(); 1028 DLLEXPORT void __cdecl RelaunchChromeBrowserWithNewCommandLineIfNeeded();
1151 } 1029 }
1152 1030
1153 DLLEXPORT void __cdecl RelaunchChromeBrowserWithNewCommandLineIfNeeded() { 1031 DLLEXPORT void __cdecl RelaunchChromeBrowserWithNewCommandLineIfNeeded() {
1154 // Need an instance of AtExitManager to handle singleton creations and 1032 // Need an instance of AtExitManager to handle singleton creations and
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 } 1294 }
1417 } 1295 }
1418 1296
1419 void ChromeBrowserMainParts::PreMainMessageLoopRun() { 1297 void ChromeBrowserMainParts::PreMainMessageLoopRun() {
1420 result_code_ = PreMainMessageLoopRunImpl(); 1298 result_code_ = PreMainMessageLoopRunImpl();
1421 1299
1422 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1300 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1423 chrome_extra_parts_[i]->PreMainMessageLoopRun(); 1301 chrome_extra_parts_[i]->PreMainMessageLoopRun();
1424 } 1302 }
1425 1303
1304 // PreMainMessageLoopRun calls these extra stages in the following order:
1305 // PreMainMessageLoopRunImpl()
1306 // ... initial setup, including browser_process_ setup.
1307 // PreProfileInit()
1308 // ... additional setup, including CreateProfile()
1309 // PostProfileInit()
1310 // ... additional setup
1311 // PreBrowserStart()
1312 // ... browser_init_->Start (OR parameters().ui_task->Run())
1313 // PostBrowserStart()
1314
1315 void ChromeBrowserMainParts::PreProfileInit() {
1316 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1317 chrome_extra_parts_[i]->PreProfileInit();
1318 }
1319
1320 void ChromeBrowserMainParts::PostProfileInit() {
1321 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1322 chrome_extra_parts_[i]->PostProfileInit();
1323 }
1324
1325 void ChromeBrowserMainParts::PreBrowserStart() {
1326 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1327 chrome_extra_parts_[i]->PreBrowserStart();
1328 }
1329
1330 void ChromeBrowserMainParts::PostBrowserStart() {
1331 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i)
1332 chrome_extra_parts_[i]->PostBrowserStart();
1333 }
1334
1426 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { 1335 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
1427 // Create watchdog thread after creating all other threads because it will 1336 // Create watchdog thread after creating all other threads because it will
1428 // watch the other threads and they must be running. 1337 // watch the other threads and they must be running.
1429 browser_process_->watchdog_thread(); 1338 browser_process_->watchdog_thread();
1430 1339
1431 #if defined(USE_WEBKIT_COMPOSITOR) 1340 #if defined(USE_WEBKIT_COMPOSITOR)
1432 // We need to ensure WebKit has been initialized before we start the WebKit 1341 // We need to ensure WebKit has been initialized before we start the WebKit
1433 // compositor. This is done by the ResourceDispatcherHost on creation. 1342 // compositor. This is done by the ResourceDispatcherHost on creation.
1434 browser_process_->resource_dispatcher_host(); 1343 browser_process_->resource_dispatcher_host();
1435 #endif 1344 #endif
1436 1345
1437 #if defined(OS_CHROMEOS)
1438 // Now that the file thread exists we can record our stats.
1439 chromeos::BootTimesLoader::Get()->RecordChromeMainStats();
1440
1441 #if defined(TOOLKIT_USES_GTK)
1442 // Read locale-specific GTK resource information.
1443 std::string gtkrc = l10n_util::GetStringUTF8(IDS_LOCALE_GTKRC);
1444 if (!gtkrc.empty())
1445 gtk_rc_parse_string(gtkrc.c_str());
1446 #else
1447 // TODO(saintlou): Need to provide an Aura equivalent.
1448 NOTIMPLEMENTED();
1449 #endif
1450
1451 // Trigger prefetching of ownership status.
1452 chromeos::OwnershipService::GetSharedInstance()->Prewarm();
1453 #endif
1454
1455 // Record last shutdown time into a histogram. 1346 // Record last shutdown time into a histogram.
1456 browser_shutdown::ReadLastShutdownInfo(); 1347 browser_shutdown::ReadLastShutdownInfo();
1457 1348
1458 #if defined(OS_WIN) 1349 #if defined(OS_WIN)
1459 // On Windows, we use our startup as an opportunity to do upgrade/uninstall 1350 // On Windows, we use our startup as an opportunity to do upgrade/uninstall
1460 // tasks. Those care whether the browser is already running. On Linux/Mac, 1351 // tasks. Those care whether the browser is already running. On Linux/Mac,
1461 // upgrade/uninstall happen separately. 1352 // upgrade/uninstall happen separately.
1462 bool already_running = browser_util::IsBrowserAlreadyRunning(); 1353 bool already_running = browser_util::IsBrowserAlreadyRunning();
1463 1354
1464 // If the command line specifies 'uninstall' then we need to work here 1355 // If the command line specifies 'uninstall' then we need to work here
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 } 1421 }
1531 #if !defined(OS_MACOSX) // closing brace for if 1422 #if !defined(OS_MACOSX) // closing brace for if
1532 } 1423 }
1533 #endif 1424 #endif
1534 1425
1535 #if defined(USE_X11) 1426 #if defined(USE_X11)
1536 SetBrowserX11ErrorHandlers(); 1427 SetBrowserX11ErrorHandlers();
1537 #endif 1428 #endif
1538 1429
1539 // Desktop construction occurs here, (required before profile creation). 1430 // Desktop construction occurs here, (required before profile creation).
1540 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1431 PreProfileInit();
1541 chrome_extra_parts_[i]->PostBrowserProcessInit();
1542 1432
1543 // Profile creation ---------------------------------------------------------- 1433 // Profile creation ----------------------------------------------------------
1544 1434
1545 #if defined(OS_CHROMEOS)
1546 // This forces the ProfileManager to be created and register for the
1547 // notification it needs to track the logged in user.
1548 g_browser_process->profile_manager();
1549
1550 // TODO(abarth): Should this move to InitializeNetworkOptions()?
1551 // Allow access to file:// on ChromeOS for tests.
1552 if (parsed_command_line().HasSwitch(switches::kAllowFileAccess))
1553 net::URLRequest::AllowFileAccess();
1554
1555 // There are two use cases for kLoginUser:
1556 // 1) if passed in tandem with kLoginPassword, to drive a "StubLogin"
1557 // 2) if passed alone, to signal that the indicated user has already
1558 // logged in and we should behave accordingly.
1559 // This handles case 2.
1560 if (parsed_command_line().HasSwitch(switches::kLoginUser) &&
1561 !parsed_command_line().HasSwitch(switches::kLoginPassword)) {
1562 std::string username =
1563 parsed_command_line().GetSwitchValueASCII(switches::kLoginUser);
1564 VLOG(1) << "Relaunching browser for user: " << username;
1565 chromeos::UserManager::Get()->UserLoggedIn(username);
1566
1567 // Redirects Chrome logging to the user data dir.
1568 logging::RedirectChromeLogging(parsed_command_line());
1569
1570 // Initialize user policy before creating the profile so the profile
1571 // initialization code sees policy settings.
1572 g_browser_process->browser_policy_connector()->InitializeUserPolicy(
1573 username, false /* wait_for_policy_fetch */);
1574 } else if (parsed_command_line().HasSwitch(switches::kLoginManager)) {
1575 // Initialize status area mode early on.
1576 chromeos::StatusAreaViewChromeos::
1577 SetScreenMode(chromeos::StatusAreaViewChromeos::LOGIN_MODE_WEBUI);
1578 }
1579 #endif
1580
1581 if (is_first_run_) { 1435 if (is_first_run_) {
1582 // Warn the ProfileManager that an import process will run, possibly 1436 // Warn the ProfileManager that an import process will run, possibly
1583 // locking the WebDataService directory of the next Profile created. 1437 // locking the WebDataService directory of the next Profile created.
1584 g_browser_process->profile_manager()->SetWillImport(); 1438 g_browser_process->profile_manager()->SetWillImport();
1585 } 1439 }
1586 1440
1587 profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line()); 1441 profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line());
1588 if (!profile_) 1442 if (!profile_)
1589 return content::RESULT_CODE_NORMAL_EXIT; 1443 return content::RESULT_CODE_NORMAL_EXIT;
1590 1444
1591 // Autoload any profiles which are running background apps. 1445 // Autoload any profiles which are running background apps.
1592 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075. 1446 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075.
1593 if (!BackgroundModeManager::IsBackgroundModePermanentlyDisabled( 1447 if (!BackgroundModeManager::IsBackgroundModePermanentlyDisabled(
1594 &parsed_command_line())) { 1448 &parsed_command_line())) {
1595 g_browser_process->profile_manager()->AutoloadProfiles(); 1449 g_browser_process->profile_manager()->AutoloadProfiles();
1596 } 1450 }
1597 // Post-profile init --------------------------------------------------------- 1451 // Post-profile init ---------------------------------------------------------
1598 1452
1599 #if defined(OS_CHROMEOS)
1600 // Pass the TokenService pointer to the policy connector so user policy can
1601 // grab a token and register with the policy server.
1602 // TODO(mnissler): Remove once OAuth is the only authentication mechanism.
1603 if (parsed_command_line().HasSwitch(switches::kLoginUser) &&
1604 !parsed_command_line().HasSwitch(switches::kLoginPassword)) {
1605 g_browser_process->browser_policy_connector()->SetUserPolicyTokenService(
1606 profile_->GetTokenService());
1607 }
1608
1609 // Tests should be able to tune login manager before showing it.
1610 // Thus only show login manager in normal (non-testing) mode.
1611 if (!parameters().ui_task)
1612 OptionallyRunChromeOSLoginManager(parsed_command_line(), profile_);
1613 #endif
1614
1615 #if !defined(OS_MACOSX) 1453 #if !defined(OS_MACOSX)
1616 // Importing other browser settings is done in a browser-like process 1454 // Importing other browser settings is done in a browser-like process
1617 // that exits when this task has finished. 1455 // that exits when this task has finished.
1618 // TODO(port): Port the Mac's IPC-based implementation to other platforms to 1456 // TODO(port): Port the Mac's IPC-based implementation to other platforms to
1619 // replace this implementation. http://crbug.com/22142 1457 // replace this implementation. http://crbug.com/22142
1620 if (parsed_command_line().HasSwitch(switches::kImport) || 1458 if (parsed_command_line().HasSwitch(switches::kImport) ||
1621 parsed_command_line().HasSwitch(switches::kImportFromFile)) { 1459 parsed_command_line().HasSwitch(switches::kImportFromFile)) {
1622 return FirstRun::ImportNow(profile_, parsed_command_line()); 1460 return FirstRun::ImportNow(profile_, parsed_command_line());
1623 } 1461 }
1624 #endif 1462 #endif
(...skipping 26 matching lines...) Expand all
1651 // Disk image installation is sort of a first-run task, so it shares the 1489 // Disk image installation is sort of a first-run task, so it shares the
1652 // kNoFirstRun switch. 1490 // kNoFirstRun switch.
1653 if (MaybeInstallFromDiskImage()) { 1491 if (MaybeInstallFromDiskImage()) {
1654 // The application was installed and the installed copy has been 1492 // The application was installed and the installed copy has been
1655 // launched. This process is now obsolete. Exit. 1493 // launched. This process is now obsolete. Exit.
1656 return content::RESULT_CODE_NORMAL_EXIT; 1494 return content::RESULT_CODE_NORMAL_EXIT;
1657 } 1495 }
1658 } 1496 }
1659 #endif 1497 #endif
1660 1498
1661 // TODO(stevenjb): Move ChromeOS login code into PostProfileInitialized(). 1499 // TODO(stevenjb): Move WIN and MACOSX specific code to apprpriate Parts.
1662 // (Requires making ChromeBrowserMainPartsChromeos a non "main" Parts). 1500 // (requires supporting early exit).
1663 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) 1501 PostProfileInit();
1664 chrome_extra_parts_[i]->PostProfileInitialized();
1665 1502
1666 // Show the First Run UI if this is the first time Chrome has been run on 1503 // Show the First Run UI if this is the first time Chrome has been run on
1667 // this computer, or we're being compelled to do so by a command line flag. 1504 // this computer, or we're being compelled to do so by a command line flag.
1668 // Note that this be done _after_ the PrefService is initialized and all 1505 // Note that this be done _after_ the PrefService is initialized and all
1669 // preferences are registered, since some of the code that the importer 1506 // preferences are registered, since some of the code that the importer
1670 // touches reads preferences. 1507 // touches reads preferences.
1671 if (is_first_run_) { 1508 if (is_first_run_) {
1672 if (!first_run_ui_bypass_) { 1509 if (!first_run_ui_bypass_) {
1673 FirstRun::AutoImport(profile_, 1510 FirstRun::AutoImport(profile_,
1674 master_prefs_->homepage_defined, 1511 master_prefs_->homepage_defined,
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 about_flags::RecordUMAStatistics(local_state_); 1643 about_flags::RecordUMAStatistics(local_state_);
1807 LanguageUsageMetrics::RecordAcceptLanguages( 1644 LanguageUsageMetrics::RecordAcceptLanguages(
1808 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 1645 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages));
1809 LanguageUsageMetrics::RecordApplicationLanguage( 1646 LanguageUsageMetrics::RecordApplicationLanguage(
1810 g_browser_process->GetApplicationLocale()); 1647 g_browser_process->GetApplicationLocale());
1811 1648
1812 #if defined(OS_WIN) 1649 #if defined(OS_WIN)
1813 fragmentation_checker::RecordFragmentationMetricForCurrentModule(); 1650 fragmentation_checker::RecordFragmentationMetricForCurrentModule();
1814 #endif 1651 #endif
1815 1652
1816 #if defined(OS_CHROMEOS)
1817 metrics_->StartExternalMetrics();
1818
1819 // Initialize the audio handler on ChromeOS.
1820 chromeos::AudioHandler::Initialize();
1821
1822 // Listen for system key events so that the user will be able to adjust the
1823 // volume on the login screen, if Chrome is running on Chrome OS
1824 // (i.e. not Linux desktop), and in non-test mode.
1825 if (chromeos::system::runtime_environment::IsRunningOnChromeOS() &&
1826 !parameters().ui_task) { // ui_task is non-NULL when running tests.
1827 chromeos::SystemKeyEventListener::Initialize();
1828 }
1829
1830 // Listen for XI_HierarchyChanged events.
1831 chromeos::XInputHierarchyChangedEventListener::GetInstance();
1832 #endif
1833
1834 // The extension service may be available at this point. If the command line 1653 // The extension service may be available at this point. If the command line
1835 // specifies --uninstall-extension, attempt the uninstall extension startup 1654 // specifies --uninstall-extension, attempt the uninstall extension startup
1836 // action. 1655 // action.
1837 if (parsed_command_line().HasSwitch(switches::kUninstallExtension)) { 1656 if (parsed_command_line().HasSwitch(switches::kUninstallExtension)) {
1838 ExtensionsStartupUtil ext_startup_util; 1657 ExtensionsStartupUtil ext_startup_util;
1839 if (ext_startup_util.UninstallExtension(parsed_command_line(), profile_)) 1658 if (ext_startup_util.UninstallExtension(parsed_command_line(), profile_))
1840 return content::RESULT_CODE_NORMAL_EXIT; 1659 return content::RESULT_CODE_NORMAL_EXIT;
1841 return chrome::RESULT_CODE_UNINSTALL_EXTENSION_ERROR; 1660 return chrome::RESULT_CODE_UNINSTALL_EXTENSION_ERROR;
1842 } 1661 }
1843 1662
1844 // Start watching for hangs during startup. We disarm this hang detector when 1663 // Start watching for hangs during startup. We disarm this hang detector when
1845 // ThreadWatcher takes over or when browser is shutdown or when 1664 // ThreadWatcher takes over or when browser is shutdown or when
1846 // startup_watcher_ is deleted. 1665 // startup_watcher_ is deleted.
1847 startup_watcher_->Arm(base::TimeDelta::FromSeconds(300)); 1666 startup_watcher_->Arm(base::TimeDelta::FromSeconds(300));
1848 1667
1849 // Start watching for a hang. 1668 // Start watching for a hang.
1850 MetricsService::LogNeedForCleanShutdown(); 1669 MetricsService::LogNeedForCleanShutdown();
1851 1670
1852 #if defined(OS_WIN) 1671 #if defined(OS_WIN)
1853 // We check this here because if the profile is OTR (chromeos possibility) 1672 // We check this here because if the profile is OTR (chromeos possibility)
1854 // it won't still be accessible after browser is destroyed. 1673 // it won't still be accessible after browser is destroyed.
1855 record_search_engine_ = is_first_run_ && !profile_->IsOffTheRecord(); 1674 record_search_engine_ = is_first_run_ && !profile_->IsOffTheRecord();
1856 #endif 1675 #endif
1857 1676
1858 #if defined(OS_CHROMEOS)
1859 // Wait until here to start the out-of-memory priority manager so that
1860 // we give the most amount of time for the other services to start up
1861 // before we start adjusting the oom priority.
1862 g_browser_process->oom_priority_manager()->Start();
1863 #endif
1864
1865 // Create the instance of the cloud print proxy service so that it can launch 1677 // Create the instance of the cloud print proxy service so that it can launch
1866 // the service process if needed. This is needed because the service process 1678 // the service process if needed. This is needed because the service process
1867 // might have shutdown because an update was available. 1679 // might have shutdown because an update was available.
1868 // TODO(torne): this should maybe be done with 1680 // TODO(torne): this should maybe be done with
1869 // ProfileKeyedServiceFactory::ServiceIsCreatedWithProfile() instead? 1681 // ProfileKeyedServiceFactory::ServiceIsCreatedWithProfile() instead?
1870 CloudPrintProxyServiceFactory::GetForProfile(profile_); 1682 CloudPrintProxyServiceFactory::GetForProfile(profile_);
1871 1683
1872 // Initialize GpuDataManager and collect preliminary gpu info. 1684 // Initialize GpuDataManager and collect preliminary gpu info.
1873 GpuBlacklistUpdater::Setup(); 1685 GpuBlacklistUpdater::Setup();
1874 1686
1875 // Start watching all browser threads for responsiveness. 1687 // Start watching all browser threads for responsiveness.
1876 ThreadWatcherList::StartWatchingAll(parsed_command_line()); 1688 ThreadWatcherList::StartWatchingAll(parsed_command_line());
1877 1689
1878 #if !defined(DISABLE_NACL) 1690 #if !defined(DISABLE_NACL)
1879 NaClProcessHost::EarlyStartup(); 1691 NaClProcessHost::EarlyStartup();
1880 #endif 1692 #endif
1881 1693
1694 PreBrowserStart();
1695
1882 // Instantiate the notification UI manager, as this triggers a perf timer 1696 // Instantiate the notification UI manager, as this triggers a perf timer
1883 // used to measure startup time. TODO(stevenjb): Figure out what is actually 1697 // used to measure startup time. TODO(stevenjb): Figure out what is actually
1884 // triggering the timer and call that explicitly in the approprate place. 1698 // triggering the timer and call that explicitly in the approprate place.
1885 // http://crbug.com/105065. 1699 // http://crbug.com/105065.
1886 g_browser_process->notification_ui_manager(); 1700 g_browser_process->notification_ui_manager();
1887 1701
1888 if (parameters().ui_task) { 1702 if (parameters().ui_task) {
1889 // We are in test mode. Run one task and enter the main message loop. 1703 // We are in test mode. Run one task and enter the main message loop.
1890 #if defined(OS_MACOSX) 1704 #if defined(OS_MACOSX)
1891 if (parameters().autorelease_pool) 1705 if (parameters().autorelease_pool)
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1948 profile_->GetPrefs()); 1762 profile_->GetPrefs());
1949 } 1763 }
1950 #endif 1764 #endif
1951 1765
1952 run_message_loop_ = true; 1766 run_message_loop_ = true;
1953 } else { 1767 } else {
1954 run_message_loop_ = false; 1768 run_message_loop_ = false;
1955 } 1769 }
1956 } 1770 }
1957 browser_init_.reset(); 1771 browser_init_.reset();
1772
1773 PostBrowserStart();
1774
1958 return result_code_; 1775 return result_code_;
1959 } 1776 }
1960 1777
1961 bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { 1778 bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) {
1962 // Set the result code set in PreMainMessageLoopRun or set above. 1779 // Set the result code set in PreMainMessageLoopRun or set above.
1963 *result_code = result_code_; 1780 *result_code = result_code_;
1964 1781
1965 if (!run_message_loop_) 1782 if (!run_message_loop_)
1966 return true; // Don't run the default message loop. 1783 return true; // Don't run the default message loop.
1967 1784
1968 // This should be invoked as close to the start of the browser's 1785 // This should be invoked as close to the start of the browser's
1969 // UI thread message loop as possible to get a stable measurement 1786 // UI thread message loop as possible to get a stable measurement
1970 // across versions. 1787 // across versions.
1971 RecordBrowserStartupTime(); 1788 RecordBrowserStartupTime();
1972 1789
1973 #if defined(USE_AURA) 1790 #if defined(USE_AURA)
1974 aura::Desktop::GetInstance()->Run(); 1791 aura::Desktop::GetInstance()->Run();
1975 #elif defined(TOOLKIT_VIEWS) 1792 #elif defined(TOOLKIT_VIEWS)
1976 views::AcceleratorHandler accelerator_handler; 1793 views::AcceleratorHandler accelerator_handler;
1977 MessageLoopForUI::current()->RunWithDispatcher(&accelerator_handler); 1794 MessageLoopForUI::current()->RunWithDispatcher(&accelerator_handler);
1978 #elif defined(USE_X11) 1795 #elif defined(USE_X11)
1979 MessageLoopForUI::current()->RunWithDispatcher(NULL); 1796 MessageLoopForUI::current()->RunWithDispatcher(NULL);
1980 #elif defined(OS_POSIX) 1797 #elif defined(OS_POSIX)
1981 MessageLoopForUI::current()->Run(); 1798 MessageLoopForUI::current()->Run();
1982 #endif 1799 #endif
1983 #if defined(OS_CHROMEOS)
1984 chromeos::BootTimesLoader::Get()->AddLogoutTimeMarker("UIMessageLoopEnded",
1985 true);
1986 #endif
1987 1800
1988 return true; 1801 return true;
1989 } 1802 }
1990 1803
1991 void ChromeBrowserMainParts::PostMainMessageLoopRun() { 1804 void ChromeBrowserMainParts::PostMainMessageLoopRun() {
1992 // Start watching for jank during shutdown. It gets disarmed when 1805 // Start watching for jank during shutdown. It gets disarmed when
1993 // |shutdown_watcher_| object is destructed. 1806 // |shutdown_watcher_| object is destructed.
1994 shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(90)); 1807 shutdown_watcher_->Arm(base::TimeDelta::FromSeconds(90));
1995 1808
1996 // Disarm the startup hang detector time bomb if it is still Arm'ed. 1809 // Disarm the startup hang detector time bomb if it is still Arm'ed.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2034 } 1847 }
2035 } else { 1848 } else {
2036 UMA_HISTOGRAM_ENUMERATION( 1849 UMA_HISTOGRAM_ENUMERATION(
2037 "Chrome.SearchSelectExempt", 1850 "Chrome.SearchSelectExempt",
2038 search_engine_type, 1851 search_engine_type,
2039 SEARCH_ENGINE_MAX); 1852 SEARCH_ENGINE_MAX);
2040 } 1853 }
2041 } 1854 }
2042 #endif 1855 #endif
2043 1856
2044 #if defined(OS_CHROMEOS)
2045 g_browser_process->oom_priority_manager()->Stop();
2046 #endif
2047
2048 // Some tests don't set parameters.ui_task, so they started translate 1857 // Some tests don't set parameters.ui_task, so they started translate
2049 // language fetch that was never completed so we need to cleanup here 1858 // language fetch that was never completed so we need to cleanup here
2050 // otherwise it will be done by the destructor in a wrong thread. 1859 // otherwise it will be done by the destructor in a wrong thread.
2051 if (parameters().ui_task == NULL && translate_manager_ != NULL) 1860 if (parameters().ui_task == NULL && translate_manager_ != NULL)
2052 translate_manager_->CleanupPendingUlrFetcher(); 1861 translate_manager_->CleanupPendingUlrFetcher();
2053 1862
2054 if (notify_result_ == ProcessSingleton::PROCESS_NONE) 1863 if (notify_result_ == ProcessSingleton::PROCESS_NONE)
2055 process_singleton_->Cleanup(); 1864 process_singleton_->Cleanup();
2056 1865
2057 // Stop all tasks that might run on WatchDogThread. 1866 // Stop all tasks that might run on WatchDogThread.
2058 ThreadWatcherList::StopWatchingAll(); 1867 ThreadWatcherList::StopWatchingAll();
2059 1868
2060 g_browser_process->metrics_service()->Stop(); 1869 g_browser_process->metrics_service()->Stop();
2061 1870
2062 #if defined(OS_CHROMEOS)
2063 // The XInput2 event listener needs to be shut down earlier than when
2064 // Singletons are finally destroyed in AtExitManager.
2065 chromeos::XInputHierarchyChangedEventListener::GetInstance()->Stop();
2066
2067 // chromeos::SystemKeyEventListener::Shutdown() is always safe to call,
2068 // even if Initialize() wasn't called.
2069 chromeos::SystemKeyEventListener::Shutdown();
2070 chromeos::AudioHandler::Shutdown();
2071 #endif
2072
2073 restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop(); 1871 restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop();
2074 browser_process_->StartTearDown(); 1872 browser_process_->StartTearDown();
2075 } 1873 }
2076 1874
2077 void ChromeBrowserMainParts::PreStopThread(BrowserThread::ID identifier) { 1875 void ChromeBrowserMainParts::PreStopThread(BrowserThread::ID identifier) {
2078 browser_process_->PreStopThread(identifier); 1876 browser_process_->PreStopThread(identifier);
2079 } 1877 }
2080 1878
2081 void ChromeBrowserMainParts::PostStopThread(BrowserThread::ID identifier) { 1879 void ChromeBrowserMainParts::PostStopThread(BrowserThread::ID identifier) {
2082 browser_process_->PostStopThread(identifier); 1880 browser_process_->PostStopThread(identifier);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 if (env->GetVar(chrome::kPreReadEnvironmentVariable, &pre_read) && 1927 if (env->GetVar(chrome::kPreReadEnvironmentVariable, &pre_read) &&
2130 (pre_read == "0" || pre_read == "1")) { 1928 (pre_read == "0" || pre_read == "1")) {
2131 std::string uma_name(name); 1929 std::string uma_name(name);
2132 uma_name += "_PreRead"; 1930 uma_name += "_PreRead";
2133 uma_name += pre_read == "1" ? "Enabled" : "Disabled"; 1931 uma_name += pre_read == "1" ? "Enabled" : "Disabled";
2134 AddPreReadHistogramTime(uma_name.c_str(), time); 1932 AddPreReadHistogramTime(uma_name.c_str(), time);
2135 } 1933 }
2136 #endif 1934 #endif
2137 #endif 1935 #endif
2138 } 1936 }
OLDNEW
« no previous file with comments | « chrome/browser/chrome_browser_main.h ('k') | chrome/browser/chrome_browser_main_extra_parts.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698