Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #if defined(TOOLKIT_GTK) | 7 #if defined(TOOLKIT_GTK) |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| 11 #include <limits.h> | |
|
gab
2013/03/28 03:06:06
C-headers come after C++ headers and are usually i
erikwright (departed)
2013/04/18 17:43:04
You so crazy :)
C first.
http://google-styleguid
gab
2013/04/19 14:37:47
You know who I learnt to code-review from ;)!
| |
| 11 #include <string> | 12 #include <string> |
| 12 #include <vector> | 13 #include <vector> |
| 13 | 14 |
| 14 #include "base/at_exit.h" | 15 #include "base/at_exit.h" |
| 15 #include "base/bind.h" | 16 #include "base/bind.h" |
| 16 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 17 #include "base/cpu.h" | 18 #include "base/cpu.h" |
| 18 #include "base/debug/trace_event.h" | 19 #include "base/debug/trace_event.h" |
| 19 #include "base/file_util.h" | 20 #include "base/file_util.h" |
| 20 #include "base/files/file_path.h" | 21 #include "base/files/file_path.h" |
| 22 #include "base/memory/ref_counted.h" | |
| 21 #include "base/metrics/field_trial.h" | 23 #include "base/metrics/field_trial.h" |
| 22 #include "base/metrics/histogram.h" | 24 #include "base/metrics/histogram.h" |
| 23 #include "base/path_service.h" | 25 #include "base/path_service.h" |
| 24 #include "base/prefs/json_pref_store.h" | 26 #include "base/prefs/json_pref_store.h" |
| 25 #include "base/prefs/pref_registry_simple.h" | 27 #include "base/prefs/pref_registry_simple.h" |
| 26 #include "base/prefs/pref_service.h" | 28 #include "base/prefs/pref_service.h" |
| 27 #include "base/prefs/pref_value_store.h" | 29 #include "base/prefs/pref_value_store.h" |
| 28 #include "base/process_info.h" | 30 #include "base/process_info.h" |
| 29 #include "base/process_util.h" | 31 #include "base/process_util.h" |
| 30 #include "base/run_loop.h" | 32 #include "base/run_loop.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 #include "chrome/browser/metrics/metrics_log.h" | 67 #include "chrome/browser/metrics/metrics_log.h" |
| 66 #include "chrome/browser/metrics/metrics_service.h" | 68 #include "chrome/browser/metrics/metrics_service.h" |
| 67 #include "chrome/browser/metrics/thread_watcher.h" | 69 #include "chrome/browser/metrics/thread_watcher.h" |
| 68 #include "chrome/browser/metrics/tracking_synchronizer.h" | 70 #include "chrome/browser/metrics/tracking_synchronizer.h" |
| 69 #include "chrome/browser/metrics/variations/variations_service.h" | 71 #include "chrome/browser/metrics/variations/variations_service.h" |
| 70 #include "chrome/browser/nacl_host/nacl_process_host.h" | 72 #include "chrome/browser/nacl_host/nacl_process_host.h" |
| 71 #include "chrome/browser/net/chrome_net_log.h" | 73 #include "chrome/browser/net/chrome_net_log.h" |
| 72 #include "chrome/browser/net/crl_set_fetcher.h" | 74 #include "chrome/browser/net/crl_set_fetcher.h" |
| 73 #include "chrome/browser/notifications/desktop_notification_service.h" | 75 #include "chrome/browser/notifications/desktop_notification_service.h" |
| 74 #include "chrome/browser/notifications/desktop_notification_service_factory.h" | 76 #include "chrome/browser/notifications/desktop_notification_service_factory.h" |
| 77 #include "chrome/browser/operation_output.h" | |
| 75 #include "chrome/browser/page_cycler/page_cycler.h" | 78 #include "chrome/browser/page_cycler/page_cycler.h" |
| 76 #include "chrome/browser/performance_monitor/performance_monitor.h" | 79 #include "chrome/browser/performance_monitor/performance_monitor.h" |
| 77 #include "chrome/browser/performance_monitor/startup_timer.h" | 80 #include "chrome/browser/performance_monitor/startup_timer.h" |
| 78 #include "chrome/browser/plugins/plugin_prefs.h" | 81 #include "chrome/browser/plugins/plugin_prefs.h" |
| 79 #include "chrome/browser/policy/policy_service.h" | 82 #include "chrome/browser/policy/policy_service.h" |
| 80 #include "chrome/browser/prefs/chrome_pref_service_factory.h" | 83 #include "chrome/browser/prefs/chrome_pref_service_factory.h" |
| 81 #include "chrome/browser/prefs/command_line_pref_store.h" | 84 #include "chrome/browser/prefs/command_line_pref_store.h" |
| 82 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 85 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 83 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" | 86 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" |
| 84 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory. h" | 87 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory. h" |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 // network. | 491 // network. |
| 489 if (!command_line.HasSwitch(switches::kDisableCRLSets)) | 492 if (!command_line.HasSwitch(switches::kDisableCRLSets)) |
| 490 g_browser_process->crl_set_fetcher()->StartInitialLoad(cus); | 493 g_browser_process->crl_set_fetcher()->StartInitialLoad(cus); |
| 491 | 494 |
| 492 RegisterPnaclComponent(cus, command_line); | 495 RegisterPnaclComponent(cus, command_line); |
| 493 | 496 |
| 494 cus->Start(); | 497 cus->Start(); |
| 495 } | 498 } |
| 496 | 499 |
| 497 #if !defined(OS_ANDROID) | 500 #if !defined(OS_ANDROID) |
| 498 bool ProcessSingletonNotificationCallback( | 501 bool ProcessSingletonOperationCallback( |
| 499 const CommandLine& command_line, | 502 const CommandLine& command_line, |
| 500 const base::FilePath& current_directory) { | 503 const base::FilePath& current_directory, |
| 504 scoped_ptr<OperationOutput> operation_output) { | |
| 501 // Drop the request if the browser process is already in shutdown path. | 505 // Drop the request if the browser process is already in shutdown path. |
| 502 if (!g_browser_process || g_browser_process->IsShuttingDown()) | 506 if (!g_browser_process || g_browser_process->IsShuttingDown()) |
| 503 return false; | 507 return false; |
| 504 | 508 |
| 505 g_browser_process->PlatformSpecificCommandLineProcessing(command_line); | 509 g_browser_process->PlatformSpecificCommandLineProcessing(command_line); |
| 506 | 510 |
| 507 // TODO(erikwright): Consider removing this - AFAIK it is no longer used. | 511 // TODO(erikwright): Consider removing this - AFAIK it is no longer used. |
| 508 // Handle the --uninstall-extension startup action. This needs to done here in | 512 // Handle the --uninstall-extension startup action. This needs to done here in |
| 509 // the process that is running with the target profile, otherwise the | 513 // the process that is running with the target profile, otherwise the |
| 510 // uninstall will fail to unload and remove all components. | 514 // uninstall will fail to unload and remove all components. |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 524 extension_startup_helper.UninstallExtension(command_line, profile); | 528 extension_startup_helper.UninstallExtension(command_line, profile); |
| 525 return true; | 529 return true; |
| 526 } | 530 } |
| 527 | 531 |
| 528 base::FilePath user_data_dir = | 532 base::FilePath user_data_dir = |
| 529 g_browser_process->profile_manager()->user_data_dir(); | 533 g_browser_process->profile_manager()->user_data_dir(); |
| 530 base::FilePath startup_profile_dir = | 534 base::FilePath startup_profile_dir = |
| 531 GetStartupProfilePath(user_data_dir, command_line); | 535 GetStartupProfilePath(user_data_dir, command_line); |
| 532 | 536 |
| 533 StartupBrowserCreator::ProcessCommandLineAlreadyRunning( | 537 StartupBrowserCreator::ProcessCommandLineAlreadyRunning( |
| 534 command_line, current_directory, startup_profile_dir); | 538 command_line, |
| 539 current_directory, | |
| 540 startup_profile_dir, | |
| 541 operation_output.Pass()); | |
| 535 return true; | 542 return true; |
| 536 } | 543 } |
| 537 #endif | 544 #endif |
| 538 | 545 |
| 539 void LaunchDevToolsHandlerIfNeeded(Profile* profile, | 546 void LaunchDevToolsHandlerIfNeeded(Profile* profile, |
| 540 const CommandLine& command_line) { | 547 const CommandLine& command_line) { |
| 541 if (command_line.HasSwitch(::switches::kRemoteDebuggingPort)) { | 548 if (command_line.HasSwitch(::switches::kRemoteDebuggingPort)) { |
| 542 std::string port_str = | 549 std::string port_str = |
| 543 command_line.GetSwitchValueASCII(::switches::kRemoteDebuggingPort); | 550 command_line.GetSwitchValueASCII(::switches::kRemoteDebuggingPort); |
| 544 int port; | 551 int port; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 605 const content::MainFunctionParams& parameters) | 612 const content::MainFunctionParams& parameters) |
| 606 : parameters_(parameters), | 613 : parameters_(parameters), |
| 607 parsed_command_line_(parameters.command_line), | 614 parsed_command_line_(parameters.command_line), |
| 608 result_code_(content::RESULT_CODE_NORMAL_EXIT), | 615 result_code_(content::RESULT_CODE_NORMAL_EXIT), |
| 609 startup_watcher_(new StartupTimeBomb()), | 616 startup_watcher_(new StartupTimeBomb()), |
| 610 shutdown_watcher_(new ShutdownWatcherHelper()), | 617 shutdown_watcher_(new ShutdownWatcherHelper()), |
| 611 startup_timer_(new performance_monitor::StartupTimer()), | 618 startup_timer_(new performance_monitor::StartupTimer()), |
| 612 browser_field_trials_(parameters.command_line), | 619 browser_field_trials_(parameters.command_line), |
| 613 #if !defined(OS_ANDROID) | 620 #if !defined(OS_ANDROID) |
| 614 process_singleton_lock_( | 621 process_singleton_lock_( |
| 615 base::Bind(&ProcessSingletonNotificationCallback)), | 622 base::Bind(&ProcessSingletonOperationCallback)), |
| 616 modal_dialog_lock_(process_singleton_lock_.AsNotificationCallback()), | 623 modal_dialog_lock_(process_singleton_lock_.AsNotificationCallback()), |
| 617 #endif | 624 #endif |
| 618 record_search_engine_(false), | 625 record_search_engine_(false), |
| 619 translate_manager_(NULL), | 626 translate_manager_(NULL), |
| 620 profile_(NULL), | 627 profile_(NULL), |
| 621 run_message_loop_(true), | 628 run_message_loop_(true), |
| 622 notify_result_(ProcessSingleton::PROCESS_NONE), | 629 notify_result_(ProcessSingleton::PROCESS_NONE), |
| 623 do_first_run_tasks_(false), | 630 do_first_run_tasks_(false), |
| 624 local_state_(NULL), | 631 local_state_(NULL), |
| 625 restart_last_session_(false) { | 632 restart_last_session_(false) { |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1072 #endif | 1079 #endif |
| 1073 | 1080 |
| 1074 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) | 1081 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
| 1075 chrome_extra_parts_[i]->PostBrowserStart(); | 1082 chrome_extra_parts_[i]->PostBrowserStart(); |
| 1076 #if !defined(OS_ANDROID) | 1083 #if !defined(OS_ANDROID) |
| 1077 // Allow ProcessSingleton to process messages. | 1084 // Allow ProcessSingleton to process messages. |
| 1078 process_singleton_lock_.Unlock(); | 1085 process_singleton_lock_.Unlock(); |
| 1079 #endif | 1086 #endif |
| 1080 } | 1087 } |
| 1081 | 1088 |
| 1089 class CaptureOperationOutput { | |
| 1090 public: | |
| 1091 CaptureOperationOutput() | |
| 1092 : exit_code_(new base::RefCountedData<int>(INT_MAX)) {} | |
| 1093 | |
| 1094 int exit_code() { return exit_code_->data; } | |
| 1095 | |
| 1096 scoped_ptr<OperationOutput> Wrap(scoped_ptr<OperationOutput> wrapped) { | |
| 1097 return scoped_ptr<OperationOutput>(new Wrapper(wrapped.Pass(), exit_code_)); | |
| 1098 } | |
| 1099 | |
| 1100 private: | |
| 1101 class Wrapper : public OperationOutput { | |
| 1102 public: | |
| 1103 Wrapper(scoped_ptr<OperationOutput> wrapped, | |
| 1104 const scoped_refptr<base::RefCountedData<int> >& exit_code) | |
| 1105 : wrapped_(wrapped.Pass()), | |
| 1106 exit_code_(exit_code) { | |
| 1107 } | |
| 1108 | |
| 1109 // OperationOutput implementation. | |
| 1110 virtual bool Write(const char* data, unsigned int length) OVERRIDE { | |
| 1111 if (wrapped_) | |
| 1112 return wrapped_->Write(data, length); | |
| 1113 return true; | |
| 1114 } | |
| 1115 | |
| 1116 private: | |
| 1117 virtual bool SetExitCode(unsigned int exit_code) OVERRIDE { | |
| 1118 bool success = true; | |
| 1119 if (wrapped_) | |
| 1120 success = OperationOutput::Complete(wrapped_.Pass(), exit_code); | |
| 1121 if (success) | |
| 1122 exit_code_->data = exit_code; | |
| 1123 return success; | |
| 1124 } | |
| 1125 scoped_ptr<OperationOutput> wrapped_; | |
| 1126 scoped_refptr<base::RefCountedData<int> > exit_code_; | |
| 1127 | |
| 1128 DISALLOW_COPY_AND_ASSIGN(Wrapper); | |
| 1129 }; | |
| 1130 | |
| 1131 scoped_refptr<base::RefCountedData<int> > exit_code_; | |
| 1132 | |
| 1133 DISALLOW_COPY_AND_ASSIGN(CaptureOperationOutput); | |
| 1134 }; | |
| 1135 | |
| 1082 #if !defined(OS_ANDROID) | 1136 #if !defined(OS_ANDROID) |
| 1083 void ChromeBrowserMainParts::RunPageCycler() { | 1137 void ChromeBrowserMainParts::RunPageCycler() { |
| 1084 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 1138 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 1085 // We assume a native desktop for tests, but we will need to find a way to | 1139 // We assume a native desktop for tests, but we will need to find a way to |
| 1086 // get the proper host desktop type once we start running these tests in ASH. | 1140 // get the proper host desktop type once we start running these tests in ASH. |
| 1087 Browser* browser = chrome::FindBrowserWithProfile( | 1141 Browser* browser = chrome::FindBrowserWithProfile( |
| 1088 profile_, chrome::HOST_DESKTOP_TYPE_NATIVE); | 1142 profile_, chrome::HOST_DESKTOP_TYPE_NATIVE); |
| 1089 DCHECK(browser); | 1143 DCHECK(browser); |
| 1090 PageCycler* page_cycler = NULL; | 1144 PageCycler* page_cycler = NULL; |
| 1091 base::FilePath input_file = | 1145 base::FilePath input_file = |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1535 #endif | 1589 #endif |
| 1536 | 1590 |
| 1537 PreBrowserStart(); | 1591 PreBrowserStart(); |
| 1538 | 1592 |
| 1539 // Instantiate the notification UI manager, as this triggers a perf timer | 1593 // Instantiate the notification UI manager, as this triggers a perf timer |
| 1540 // used to measure startup time. TODO(stevenjb): Figure out what is actually | 1594 // used to measure startup time. TODO(stevenjb): Figure out what is actually |
| 1541 // triggering the timer and call that explicitly in the approprate place. | 1595 // triggering the timer and call that explicitly in the approprate place. |
| 1542 // http://crbug.com/105065. | 1596 // http://crbug.com/105065. |
| 1543 browser_process_->notification_ui_manager(); | 1597 browser_process_->notification_ui_manager(); |
| 1544 | 1598 |
| 1599 CaptureOperationOutput capture_output; | |
| 1600 | |
| 1545 #if !defined(OS_ANDROID) | 1601 #if !defined(OS_ANDROID) |
| 1546 // Most general initialization is behind us, but opening a | 1602 // Most general initialization is behind us, but opening a |
| 1547 // tab and/or session restore and such is still to be done. | 1603 // tab and/or session restore and such is still to be done. |
| 1548 base::TimeTicks browser_open_start = base::TimeTicks::Now(); | 1604 base::TimeTicks browser_open_start = base::TimeTicks::Now(); |
| 1549 | 1605 |
| 1550 // We are in regular browser boot sequence. Open initial tabs and enter the | 1606 // We are in regular browser boot sequence. Open initial tabs and enter the |
| 1551 // main message loop. | 1607 // main message loop. |
| 1552 int result_code; | 1608 |
| 1553 #if defined(OS_CHROMEOS) | 1609 #if defined(OS_CHROMEOS) |
| 1554 // On ChromeOS multiple profiles doesn't apply, and will break if we load | 1610 // On ChromeOS multiple profiles doesn't apply, and will break if we load |
| 1555 // them this early as the cryptohome hasn't yet been mounted (which happens | 1611 // them this early as the cryptohome hasn't yet been mounted (which happens |
| 1556 // only once we log in. | 1612 // only once we log in. |
| 1557 std::vector<Profile*> last_opened_profiles; | 1613 std::vector<Profile*> last_opened_profiles; |
| 1558 #else | 1614 #else |
| 1559 std::vector<Profile*> last_opened_profiles = | 1615 std::vector<Profile*> last_opened_profiles = |
| 1560 g_browser_process->profile_manager()->GetLastOpenedProfiles(); | 1616 g_browser_process->profile_manager()->GetLastOpenedProfiles(); |
| 1561 #endif | 1617 #endif |
| 1562 | 1618 |
| 1563 if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) | 1619 if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) |
| 1564 RegisterComponentsForUpdate(parsed_command_line()); | 1620 RegisterComponentsForUpdate(parsed_command_line()); |
| 1565 | 1621 |
| 1566 if (browser_creator_->Start(parsed_command_line(), base::FilePath(), | 1622 if (browser_creator_->Start( |
| 1567 profile_, last_opened_profiles, &result_code)) { | 1623 parsed_command_line(), base::FilePath(), |
| 1624 profile_, last_opened_profiles, | |
| 1625 capture_output.Wrap( | |
| 1626 OperationOutput::Create(parsed_command_line())))) { | |
| 1568 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) | 1627 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) |
| 1569 // Initialize autoupdate timer. Timer callback costs basically nothing | 1628 // Initialize autoupdate timer. Timer callback costs basically nothing |
| 1570 // when browser is not in persistent mode, so it's OK to let it ride on | 1629 // when browser is not in persistent mode, so it's OK to let it ride on |
| 1571 // the main thread. This needs to be done here because we don't want | 1630 // the main thread. This needs to be done here because we don't want |
| 1572 // to start the timer when Chrome is run inside a test harness. | 1631 // to start the timer when Chrome is run inside a test harness. |
| 1573 browser_process_->StartAutoupdateTimer(); | 1632 browser_process_->StartAutoupdateTimer(); |
| 1574 #endif | 1633 #endif |
| 1575 | 1634 |
| 1576 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | 1635 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 1577 // On Linux, the running exe will be updated if an upgrade becomes | 1636 // On Linux, the running exe will be updated if an upgrade becomes |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1633 if (parameters().ui_task) { | 1692 if (parameters().ui_task) { |
| 1634 // We end the startup timer here if we have parameters to run, because we | 1693 // We end the startup timer here if we have parameters to run, because we |
| 1635 // never start to run the main loop (where we normally stop the timer). | 1694 // never start to run the main loop (where we normally stop the timer). |
| 1636 startup_timer_->SignalStartupComplete( | 1695 startup_timer_->SignalStartupComplete( |
| 1637 performance_monitor::StartupTimer::STARTUP_TEST); | 1696 performance_monitor::StartupTimer::STARTUP_TEST); |
| 1638 parameters().ui_task->Run(); | 1697 parameters().ui_task->Run(); |
| 1639 delete parameters().ui_task; | 1698 delete parameters().ui_task; |
| 1640 run_message_loop_ = false; | 1699 run_message_loop_ = false; |
| 1641 } | 1700 } |
| 1642 | 1701 |
| 1643 return result_code_; | 1702 return capture_output.exit_code(); |
| 1644 } | 1703 } |
| 1645 | 1704 |
| 1646 bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { | 1705 bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { |
| 1647 #if defined(OS_ANDROID) | 1706 #if defined(OS_ANDROID) |
| 1648 // Chrome on Android does not use default MessageLoop. It has its own | 1707 // Chrome on Android does not use default MessageLoop. It has its own |
| 1649 // Android specific MessageLoop | 1708 // Android specific MessageLoop |
| 1650 NOTREACHED(); | 1709 NOTREACHED(); |
| 1651 return true; | 1710 return true; |
| 1652 #else | 1711 #else |
| 1653 // Set the result code set in PreMainMessageLoopRun or set above. | 1712 // Set the result code set in PreMainMessageLoopRun or set above. |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1823 if (base::win::GetVersion() <= base::win::VERSION_XP) | 1882 if (base::win::GetVersion() <= base::win::VERSION_XP) |
| 1824 uma_name += "_XP"; | 1883 uma_name += "_XP"; |
| 1825 | 1884 |
| 1826 uma_name += "_PreRead_"; | 1885 uma_name += "_PreRead_"; |
| 1827 uma_name += pre_read_percentage; | 1886 uma_name += pre_read_percentage; |
| 1828 AddPreReadHistogramTime(uma_name.c_str(), time); | 1887 AddPreReadHistogramTime(uma_name.c_str(), time); |
| 1829 } | 1888 } |
| 1830 #endif | 1889 #endif |
| 1831 #endif | 1890 #endif |
| 1832 } | 1891 } |
| OLD | NEW |