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 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 | 671 |
| 672 void ChromeBrowserMainParts::PostMainMessageLoopStart() { | 672 void ChromeBrowserMainParts::PostMainMessageLoopStart() { |
| 673 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) | 673 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
| 674 chrome_extra_parts_[i]->PostMainMessageLoopStart(); | 674 chrome_extra_parts_[i]->PostMainMessageLoopStart(); |
| 675 } | 675 } |
| 676 | 676 |
| 677 int ChromeBrowserMainParts::PreCreateThreads() { | 677 int ChromeBrowserMainParts::PreCreateThreads() { |
| 678 result_code_ = PreCreateThreadsImpl(); | 678 result_code_ = PreCreateThreadsImpl(); |
| 679 // These members must be initialized before returning from this function. | 679 // These members must be initialized before returning from this function. |
| 680 DCHECK(master_prefs_.get()); | 680 DCHECK(master_prefs_.get()); |
| 681 #if !defined(OS_ANDROID) | |
| 681 DCHECK(browser_creator_.get()); | 682 DCHECK(browser_creator_.get()); |
| 683 #endif | |
| 682 return result_code_; | 684 return result_code_; |
| 683 } | 685 } |
| 684 | 686 |
| 685 int ChromeBrowserMainParts::PreCreateThreadsImpl() { | 687 int ChromeBrowserMainParts::PreCreateThreadsImpl() { |
| 686 run_message_loop_ = false; | 688 run_message_loop_ = false; |
| 687 #if defined(OS_WIN) | 689 #if defined(OS_WIN) |
| 688 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_); | 690 PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_); |
| 689 #else | 691 #else |
| 690 // Getting the user data dir can fail if the directory isn't | 692 // Getting the user data dir can fail if the directory isn't |
| 691 // creatable, for example; on Windows in code below we bring up a | 693 // creatable, for example; on Windows in code below we bring up a |
| 692 // dialog prompting the user to pick a different directory. | 694 // dialog prompting the user to pick a different directory. |
| 693 // However, ProcessSingleton needs a real user_data_dir on Mac/Linux, | 695 // However, ProcessSingleton needs a real user_data_dir on Mac/Linux, |
| 694 // so it's better to fail here than fail mysteriously elsewhere. | 696 // so it's better to fail here than fail mysteriously elsewhere. |
| 695 CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_)) | 697 CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir_)) |
| 696 << "Must be able to get user data directory!"; | 698 << "Must be able to get user data directory!"; |
| 697 #endif | 699 #endif |
| 698 | 700 |
| 701 // Android's first run is done in Java instead of native. | |
| 702 #if !defined(OS_ANDROID) | |
| 699 process_singleton_.reset(new ProcessSingleton(user_data_dir_)); | 703 process_singleton_.reset(new ProcessSingleton(user_data_dir_)); |
| 700 // Ensure ProcessSingleton won't process messages too early. It will be | 704 // Ensure ProcessSingleton won't process messages too early. It will be |
| 701 // unlocked in PostBrowserStart(). | 705 // unlocked in PostBrowserStart(). |
| 702 process_singleton_->Lock(NULL); | 706 process_singleton_->Lock(NULL); |
| 703 | 707 |
| 704 is_first_run_ = | 708 is_first_run_ = |
| 705 (first_run::IsChromeFirstRun() || | 709 (first_run::IsChromeFirstRun() || |
| 706 parsed_command_line().HasSwitch(switches::kFirstRun)) && | 710 parsed_command_line().HasSwitch(switches::kFirstRun)) && |
| 707 !HasImportSwitch(parsed_command_line()); | 711 !HasImportSwitch(parsed_command_line()); |
| 712 #endif | |
| 708 browser_process_.reset(new BrowserProcessImpl(parsed_command_line())); | 713 browser_process_.reset(new BrowserProcessImpl(parsed_command_line())); |
| 709 | 714 |
| 710 if (parsed_command_line().HasSwitch(switches::kEnableProfiling)) { | 715 if (parsed_command_line().HasSwitch(switches::kEnableProfiling)) { |
| 711 // User wants to override default tracking status. | 716 // User wants to override default tracking status. |
| 712 std::string flag = | 717 std::string flag = |
| 713 parsed_command_line().GetSwitchValueASCII(switches::kEnableProfiling); | 718 parsed_command_line().GetSwitchValueASCII(switches::kEnableProfiling); |
| 714 // Default to basic profiling (no parent child support). | 719 // Default to basic profiling (no parent child support). |
| 715 tracked_objects::ThreadData::Status status = | 720 tracked_objects::ThreadData::Status status = |
| 716 tracked_objects::ThreadData::PROFILING_ACTIVE; | 721 tracked_objects::ThreadData::PROFILING_ACTIVE; |
| 717 if (flag.compare("0") != 0) | 722 if (flag.compare("0") != 0) |
| 718 status = tracked_objects::ThreadData::DEACTIVATED; | 723 status = tracked_objects::ThreadData::DEACTIVATED; |
| 719 else if (flag.compare("child") != 0) | 724 else if (flag.compare("child") != 0) |
| 720 status = tracked_objects::ThreadData::PROFILING_CHILDREN_ACTIVE; | 725 status = tracked_objects::ThreadData::PROFILING_CHILDREN_ACTIVE; |
| 721 tracked_objects::ThreadData::InitializeAndSetTrackingStatus(status); | 726 tracked_objects::ThreadData::InitializeAndSetTrackingStatus(status); |
| 722 } | 727 } |
| 723 | 728 |
| 724 if (parsed_command_line().HasSwitch(switches::kProfilingOutputFile)) { | 729 if (parsed_command_line().HasSwitch(switches::kProfilingOutputFile)) { |
| 725 tracking_objects_.set_output_file_path( | 730 tracking_objects_.set_output_file_path( |
| 726 parsed_command_line().GetSwitchValuePath( | 731 parsed_command_line().GetSwitchValuePath( |
| 727 switches::kProfilingOutputFile)); | 732 switches::kProfilingOutputFile)); |
| 728 } | 733 } |
| 729 | 734 |
| 730 local_state_ = InitializeLocalState(parsed_command_line(), is_first_run_); | 735 local_state_ = InitializeLocalState(parsed_command_line(), is_first_run_); |
| 731 | 736 |
| 732 // These members must be initialized before returning from this function. | 737 // These members must be initialized before returning from this function. |
| 733 master_prefs_.reset(new first_run::MasterPrefs); | 738 master_prefs_.reset(new first_run::MasterPrefs); |
| 739 | |
| 740 #if !defined(OS_ANDROID) | |
| 741 // Android doesn't use StartupBrowserCreator. | |
| 734 browser_creator_.reset(new StartupBrowserCreator); | 742 browser_creator_.reset(new StartupBrowserCreator); |
| 743 // TODO(yfriedman): Refactor Android to re-use UMABrowsingActivityObserver | |
| 735 chrome::UMABrowsingActivityObserver::Init(); | 744 chrome::UMABrowsingActivityObserver::Init(); |
| 745 #endif | |
| 736 | 746 |
| 737 // Convert active labs into switches. This needs to be done before | 747 // Convert active labs into switches. This needs to be done before |
| 738 // ResourceBundle::InitSharedInstanceWithLocale as some loaded resources are | 748 // ResourceBundle::InitSharedInstanceWithLocale as some loaded resources are |
| 739 // affected by experiment flags (--touch-optimized-ui in particular). Not | 749 // affected by experiment flags (--touch-optimized-ui in particular). Not |
| 740 // needed on Android as there aren't experimental flags. | 750 // needed on Android as there aren't experimental flags. |
| 741 about_flags::ConvertFlagsToSwitches(local_state_, | 751 about_flags::ConvertFlagsToSwitches(local_state_, |
| 742 CommandLine::ForCurrentProcess()); | 752 CommandLine::ForCurrentProcess()); |
| 743 local_state_->UpdateCommandLinePrefStore(CommandLine::ForCurrentProcess()); | 753 local_state_->UpdateCommandLinePrefStore(CommandLine::ForCurrentProcess()); |
| 744 | 754 |
| 745 // Reset the command line in the crash report details, since we may have | 755 // Reset the command line in the crash report details, since we may have |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 808 if (ShellIntegration::CanSetAsDefaultBrowser() == | 818 if (ShellIntegration::CanSetAsDefaultBrowser() == |
| 809 ShellIntegration::SET_DEFAULT_UNATTENDED) | 819 ShellIntegration::SET_DEFAULT_UNATTENDED) |
| 810 ShellIntegration::SetAsDefaultBrowser(); | 820 ShellIntegration::SetAsDefaultBrowser(); |
| 811 } | 821 } |
| 812 #else | 822 #else |
| 813 // We don't support retention experiments on Mac or Linux. | 823 // We don't support retention experiments on Mac or Linux. |
| 814 return content::RESULT_CODE_NORMAL_EXIT; | 824 return content::RESULT_CODE_NORMAL_EXIT; |
| 815 #endif // defined(OS_WIN) | 825 #endif // defined(OS_WIN) |
| 816 } | 826 } |
| 817 | 827 |
| 828 // Android does first run in Java instead of native. | |
| 829 #if !defined(OS_ANDROID) | |
| 818 // On first run, we need to process the predictor preferences before the | 830 // On first run, we need to process the predictor preferences before the |
| 819 // browser's profile_manager object is created, but after ResourceBundle | 831 // browser's profile_manager object is created, but after ResourceBundle |
| 820 // is initialized. | 832 // is initialized. |
| 821 first_run_ui_bypass_ = false; // True to skip first run UI. | 833 first_run_ui_bypass_ = false; // True to skip first run UI. |
| 822 if (is_first_run_) { | 834 if (is_first_run_) { |
| 823 first_run_ui_bypass_ = !first_run::ProcessMasterPreferences( | 835 first_run_ui_bypass_ = !first_run::ProcessMasterPreferences( |
| 824 user_data_dir_, master_prefs_.get()); | 836 user_data_dir_, master_prefs_.get()); |
| 825 AddFirstRunNewTabs(browser_creator_.get(), master_prefs_->new_tabs); | 837 AddFirstRunNewTabs(browser_creator_.get(), master_prefs_->new_tabs); |
| 826 | 838 |
| 827 // If we are running in App mode, we do not want to show the importer | 839 // If we are running in App mode, we do not want to show the importer |
| 828 // (first run) UI. | 840 // (first run) UI. |
| 829 if (!first_run_ui_bypass_ && | 841 if (!first_run_ui_bypass_ && |
| 830 (parsed_command_line().HasSwitch(switches::kApp) || | 842 (parsed_command_line().HasSwitch(switches::kApp) || |
| 831 parsed_command_line().HasSwitch(switches::kAppId) || | 843 parsed_command_line().HasSwitch(switches::kAppId) || |
| 832 parsed_command_line().HasSwitch(switches::kNoFirstRun))) | 844 parsed_command_line().HasSwitch(switches::kNoFirstRun))) |
| 833 first_run_ui_bypass_ = true; | 845 first_run_ui_bypass_ = true; |
| 834 | 846 |
| 835 // Create Sentinel if no-first-run argument is passed in. | 847 // Create Sentinel if no-first-run argument is passed in. |
| 836 if (parsed_command_line().HasSwitch(switches::kNoFirstRun)) | 848 if (parsed_command_line().HasSwitch(switches::kNoFirstRun)) |
| 837 first_run::CreateSentinel(); | 849 first_run::CreateSentinel(); |
| 838 } | 850 } |
| 851 #endif | |
| 839 | 852 |
| 840 // TODO(viettrungluu): why don't we run this earlier? | 853 // TODO(viettrungluu): why don't we run this earlier? |
| 841 if (!parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) | 854 if (!parsed_command_line().HasSwitch(switches::kNoErrorDialogs)) |
| 842 WarnAboutMinimumSystemRequirements(); | 855 WarnAboutMinimumSystemRequirements(); |
| 843 | 856 |
| 844 #if defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_MACOSX) | 857 #if defined(OS_LINUX) || defined(OS_OPENBSD) || defined(OS_MACOSX) |
| 845 // Set the product channel for crash reports. | 858 // Set the product channel for crash reports. |
| 846 child_process_logging::SetChannel( | 859 child_process_logging::SetChannel( |
| 847 chrome::VersionInfo::GetVersionStringModifier()); | 860 chrome::VersionInfo::GetVersionStringModifier()); |
| 848 #endif | 861 #endif |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 915 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) | 928 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
| 916 chrome_extra_parts_[i]->PreBrowserStart(); | 929 chrome_extra_parts_[i]->PreBrowserStart(); |
| 917 } | 930 } |
| 918 | 931 |
| 919 void ChromeBrowserMainParts::PostBrowserStart() { | 932 void ChromeBrowserMainParts::PostBrowserStart() { |
| 920 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kVisitURLs)) | 933 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kVisitURLs)) |
| 921 RunPageCycler(); | 934 RunPageCycler(); |
| 922 | 935 |
| 923 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) | 936 for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) |
| 924 chrome_extra_parts_[i]->PostBrowserStart(); | 937 chrome_extra_parts_[i]->PostBrowserStart(); |
| 938 #if !defined(OS_ANDROID) | |
| 925 // Allow ProcessSingleton to process messages. | 939 // Allow ProcessSingleton to process messages. |
| 926 process_singleton_->Unlock(); | 940 process_singleton_->Unlock(); |
| 941 #endif | |
| 927 } | 942 } |
| 928 | 943 |
| 929 void ChromeBrowserMainParts::RunPageCycler() { | 944 void ChromeBrowserMainParts::RunPageCycler() { |
|
Lei Zhang
2012/08/29 19:23:57
#ifdef out the method definition as well? Then you
Yaron
2012/08/29 20:48:33
Was trying to minimize if-defs but sure it's more
| |
| 945 #if !defined(OS_ANDROID) | |
| 930 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 946 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 931 // We assume a native desktop for tests, but we will need to find a way to | 947 // We assume a native desktop for tests, but we will need to find a way to |
| 932 // get the proper host desktop type once we start running these tests in ASH. | 948 // get the proper host desktop type once we start running these tests in ASH. |
| 933 Browser* browser = browser::FindBrowserWithProfile( | 949 Browser* browser = browser::FindBrowserWithProfile( |
| 934 profile_, chrome::HOST_DESKTOP_TYPE_NATIVE); | 950 profile_, chrome::HOST_DESKTOP_TYPE_NATIVE); |
| 935 DCHECK(browser); | 951 DCHECK(browser); |
| 936 PageCycler* page_cycler = NULL; | 952 PageCycler* page_cycler = NULL; |
| 937 FilePath input_file = | 953 FilePath input_file = |
| 938 command_line->GetSwitchValuePath(switches::kVisitURLs); | 954 command_line->GetSwitchValuePath(switches::kVisitURLs); |
| 939 page_cycler = new PageCycler(browser, input_file); | 955 page_cycler = new PageCycler(browser, input_file); |
| 940 page_cycler->set_errors_file( | 956 page_cycler->set_errors_file( |
| 941 input_file.AddExtension(FILE_PATH_LITERAL(".errors"))); | 957 input_file.AddExtension(FILE_PATH_LITERAL(".errors"))); |
| 942 if (command_line->HasSwitch(switches::kRecordStats)) { | 958 if (command_line->HasSwitch(switches::kRecordStats)) { |
| 943 page_cycler->set_stats_file( | 959 page_cycler->set_stats_file( |
| 944 command_line->GetSwitchValuePath(switches::kRecordStats)); | 960 command_line->GetSwitchValuePath(switches::kRecordStats)); |
| 945 } | 961 } |
| 946 page_cycler->Run(); | 962 page_cycler->Run(); |
| 963 #endif // !defined(OS_ANDROID) | |
| 947 } | 964 } |
| 948 | 965 |
| 949 void ChromeBrowserMainParts::SetupPlatformFieldTrials() { | 966 void ChromeBrowserMainParts::SetupPlatformFieldTrials() { |
| 950 // Base class implementation of this does nothing. | 967 // Base class implementation of this does nothing. |
| 951 } | 968 } |
| 952 | 969 |
| 953 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { | 970 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| 971 // Android updates the metrics service dynamically depending on whether the | |
| 972 // application is in the foreground or not. Do not start here. | |
| 973 #if !defined(OS_ANDROID) | |
| 954 // Now that the file thread has been started, start recording. | 974 // Now that the file thread has been started, start recording. |
| 955 StartMetricsRecording(); | 975 StartMetricsRecording(); |
| 976 #endif | |
| 956 | 977 |
| 957 // Create watchdog thread after creating all other threads because it will | 978 // Create watchdog thread after creating all other threads because it will |
| 958 // watch the other threads and they must be running. | 979 // watch the other threads and they must be running. |
| 959 browser_process_->watchdog_thread(); | 980 browser_process_->watchdog_thread(); |
| 960 | 981 |
| 961 // Do any initializating in the browser process that requires all threads | 982 // Do any initializating in the browser process that requires all threads |
| 962 // running. | 983 // running. |
| 963 browser_process_->PreMainMessageLoopRun(); | 984 browser_process_->PreMainMessageLoopRun(); |
| 964 | 985 |
| 965 // Record last shutdown time into a histogram. | 986 // Record last shutdown time into a histogram. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 983 parsed_command_line_); | 1004 parsed_command_line_); |
| 984 } | 1005 } |
| 985 #endif | 1006 #endif |
| 986 | 1007 |
| 987 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) { | 1008 if (parsed_command_line().HasSwitch(switches::kMakeDefaultBrowser)) { |
| 988 return ShellIntegration::SetAsDefaultBrowser() ? | 1009 return ShellIntegration::SetAsDefaultBrowser() ? |
| 989 static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) : | 1010 static_cast<int>(content::RESULT_CODE_NORMAL_EXIT) : |
| 990 static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED); | 1011 static_cast<int>(chrome::RESULT_CODE_SHELL_INTEGRATION_FAILED); |
| 991 } | 1012 } |
| 992 | 1013 |
| 1014 // Android doesn't support extensions and doesn't implement ProcessSingleton. | |
| 1015 #if !defined(OS_ANDROID) | |
| 993 // If the command line specifies --pack-extension, attempt the pack extension | 1016 // If the command line specifies --pack-extension, attempt the pack extension |
| 994 // startup action and exit. | 1017 // startup action and exit. |
| 995 if (parsed_command_line().HasSwitch(switches::kPackExtension)) { | 1018 if (parsed_command_line().HasSwitch(switches::kPackExtension)) { |
| 996 extensions::StartupHelper extension_startup_helper; | 1019 extensions::StartupHelper extension_startup_helper; |
| 997 if (extension_startup_helper.PackExtension(parsed_command_line())) | 1020 if (extension_startup_helper.PackExtension(parsed_command_line())) |
| 998 return content::RESULT_CODE_NORMAL_EXIT; | 1021 return content::RESULT_CODE_NORMAL_EXIT; |
| 999 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR; | 1022 return chrome::RESULT_CODE_PACK_EXTENSION_ERROR; |
| 1000 } | 1023 } |
| 1001 | 1024 |
| 1002 bool pass_command_line = true; | 1025 bool pass_command_line = true; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1041 "directory. This means that running multiple instances " | 1064 "directory. This means that running multiple instances " |
| 1042 "would start multiple browser processes rather than " | 1065 "would start multiple browser processes rather than " |
| 1043 "opening a new window in the existing process. Aborting " | 1066 "opening a new window in the existing process. Aborting " |
| 1044 "now to avoid profile corruption."; | 1067 "now to avoid profile corruption."; |
| 1045 return chrome::RESULT_CODE_PROFILE_IN_USE; | 1068 return chrome::RESULT_CODE_PROFILE_IN_USE; |
| 1046 | 1069 |
| 1047 default: | 1070 default: |
| 1048 NOTREACHED(); | 1071 NOTREACHED(); |
| 1049 } | 1072 } |
| 1050 } | 1073 } |
| 1074 #endif // !defined(OS_ANDROID) | |
| 1051 | 1075 |
| 1052 #if defined(USE_X11) | 1076 #if defined(USE_X11) |
| 1053 SetBrowserX11ErrorHandlers(); | 1077 SetBrowserX11ErrorHandlers(); |
| 1054 #endif | 1078 #endif |
| 1055 | 1079 |
| 1056 // Desktop construction occurs here, (required before profile creation). | 1080 // Desktop construction occurs here, (required before profile creation). |
| 1057 PreProfileInit(); | 1081 PreProfileInit(); |
| 1058 | 1082 |
| 1059 // Profile creation ---------------------------------------------------------- | 1083 // Profile creation ---------------------------------------------------------- |
| 1060 | 1084 |
| 1061 if (is_first_run_) { | 1085 if (is_first_run_) { |
| 1062 // Warn the ProfileManager that an import process will run, possibly | 1086 // Warn the ProfileManager that an import process will run, possibly |
| 1063 // locking the WebDataService directory of the next Profile created. | 1087 // locking the WebDataService directory of the next Profile created. |
| 1064 browser_process_->profile_manager()->SetWillImport(); | 1088 browser_process_->profile_manager()->SetWillImport(); |
| 1065 } | 1089 } |
| 1066 | 1090 |
| 1067 profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line()); | 1091 profile_ = CreateProfile(parameters(), user_data_dir_, parsed_command_line()); |
| 1068 if (!profile_) | 1092 if (!profile_) |
| 1069 return content::RESULT_CODE_NORMAL_EXIT; | 1093 return content::RESULT_CODE_NORMAL_EXIT; |
| 1070 | 1094 |
| 1095 #if defined(ENABLE_BACKGROUND) | |
| 1071 // Autoload any profiles which are running background apps. | 1096 // Autoload any profiles which are running background apps. |
| 1072 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075. | 1097 // TODO(rlp): Do this on a separate thread. See http://crbug.com/99075. |
| 1073 browser_process_->profile_manager()->AutoloadProfiles(); | 1098 browser_process_->profile_manager()->AutoloadProfiles(); |
| 1074 | 1099 #endif |
| 1075 // Post-profile init --------------------------------------------------------- | 1100 // Post-profile init --------------------------------------------------------- |
| 1076 | 1101 |
| 1077 #if !defined(OS_MACOSX) | 1102 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 1078 // Importing other browser settings is done in a browser-like process | 1103 // Importing other browser settings is done in a browser-like process |
| 1079 // that exits when this task has finished. | 1104 // that exits when this task has finished. |
| 1080 // TODO(port): Port the Mac's IPC-based implementation to other platforms to | 1105 // TODO(port): Port the Mac's IPC-based implementation to other platforms to |
| 1081 // replace this implementation. http://crbug.com/22142 | 1106 // replace this implementation. http://crbug.com/22142 |
| 1082 if (HasImportSwitch(parsed_command_line())) { | 1107 if (HasImportSwitch(parsed_command_line())) { |
| 1083 return first_run::ImportNow(profile_, parsed_command_line()); | 1108 return first_run::ImportNow(profile_, parsed_command_line()); |
| 1084 } | 1109 } |
| 1085 #endif | 1110 #endif |
| 1086 | 1111 |
| 1087 #if defined(OS_WIN) | 1112 #if defined(OS_WIN) |
| 1088 // Do the tasks if chrome has been upgraded while it was last running. | 1113 // Do the tasks if chrome has been upgraded while it was last running. |
| 1089 if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line())) | 1114 if (!already_running && upgrade_util::DoUpgradeTasks(parsed_command_line())) |
| 1090 return content::RESULT_CODE_NORMAL_EXIT; | 1115 return content::RESULT_CODE_NORMAL_EXIT; |
| 1091 | 1116 |
| 1092 // Check if there is any machine level Chrome installed on the current | 1117 // Check if there is any machine level Chrome installed on the current |
| 1093 // machine. If yes and the current Chrome process is user level, we do not | 1118 // machine. If yes and the current Chrome process is user level, we do not |
| 1094 // allow the user level Chrome to run. So we notify the user and uninstall | 1119 // allow the user level Chrome to run. So we notify the user and uninstall |
| 1095 // user level Chrome. | 1120 // user level Chrome. |
| 1096 // Note this check should only happen here, after all the checks above | 1121 // Note this check should only happen here, after all the checks above |
| 1097 // (uninstall, resource bundle initialization, other chrome browser | 1122 // (uninstall, resource bundle initialization, other chrome browser |
| 1098 // processes etc). | 1123 // processes etc). |
| 1099 // Do not allow this to occur for Chrome Frame user-to-system handoffs. | 1124 // Do not allow this to occur for Chrome Frame user-to-system handoffs. |
| 1100 if (!parsed_command_line().HasSwitch(switches::kChromeFrame) && | 1125 if (!parsed_command_line().HasSwitch(switches::kChromeFrame) && |
| 1101 ChromeBrowserMainPartsWin::CheckMachineLevelInstall()) { | 1126 ChromeBrowserMainPartsWin::CheckMachineLevelInstall()) { |
| 1102 return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS; | 1127 return chrome::RESULT_CODE_MACHINE_LEVEL_INSTALL_EXISTS; |
| 1103 } | 1128 } |
| 1104 #endif | 1129 #endif |
| 1105 | 1130 |
| 1131 #if !defined(OS_ANDROID) | |
| 1106 // Create the TranslateManager singleton. | 1132 // Create the TranslateManager singleton. |
| 1107 translate_manager_ = TranslateManager::GetInstance(); | 1133 translate_manager_ = TranslateManager::GetInstance(); |
| 1108 DCHECK(translate_manager_ != NULL); | 1134 DCHECK(translate_manager_ != NULL); |
| 1109 | 1135 |
| 1110 // Initialize Managed Mode. | 1136 // Initialize Managed Mode. |
| 1111 ManagedMode::Init(profile_); | 1137 ManagedMode::Init(profile_); |
| 1138 #endif | |
| 1112 | 1139 |
| 1113 // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts. | 1140 // TODO(stevenjb): Move WIN and MACOSX specific code to appropriate Parts. |
| 1114 // (requires supporting early exit). | 1141 // (requires supporting early exit). |
| 1115 PostProfileInit(); | 1142 PostProfileInit(); |
| 1116 | 1143 |
| 1144 #if !defined(OS_ANDROID) | |
| 1117 // Show the First Run UI if this is the first time Chrome has been run on | 1145 // Show the First Run UI if this is the first time Chrome has been run on |
| 1118 // this computer, or we're being compelled to do so by a command line flag. | 1146 // this computer, or we're being compelled to do so by a command line flag. |
| 1119 // Note that this be done _after_ the PrefService is initialized and all | 1147 // Note that this be done _after_ the PrefService is initialized and all |
| 1120 // preferences are registered, since some of the code that the importer | 1148 // preferences are registered, since some of the code that the importer |
| 1121 // touches reads preferences. | 1149 // touches reads preferences. |
| 1122 if (is_first_run_) { | 1150 if (is_first_run_) { |
| 1123 if (!first_run_ui_bypass_) { | 1151 if (!first_run_ui_bypass_) { |
| 1124 first_run::AutoImport(profile_, | 1152 first_run::AutoImport(profile_, |
| 1125 master_prefs_->homepage_defined, | 1153 master_prefs_->homepage_defined, |
| 1126 master_prefs_->do_import_items, | 1154 master_prefs_->do_import_items, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1141 chrome::SetNewHomePagePrefs(profile_->GetPrefs()); | 1169 chrome::SetNewHomePagePrefs(profile_->GetPrefs()); |
| 1142 browser_process_->profile_manager()->OnImportFinished(profile_); | 1170 browser_process_->profile_manager()->OnImportFinished(profile_); |
| 1143 | 1171 |
| 1144 if (!master_prefs_->suppress_first_run_default_browser_prompt) { | 1172 if (!master_prefs_->suppress_first_run_default_browser_prompt) { |
| 1145 browser_creator_->set_show_main_browser_window( | 1173 browser_creator_->set_show_main_browser_window( |
| 1146 !chrome::ShowFirstRunDefaultBrowserPrompt(profile_)); | 1174 !chrome::ShowFirstRunDefaultBrowserPrompt(profile_)); |
| 1147 } else { | 1175 } else { |
| 1148 browser_creator_->set_is_default_browser_dialog_suppressed(true); | 1176 browser_creator_->set_is_default_browser_dialog_suppressed(true); |
| 1149 } | 1177 } |
| 1150 } // if (is_first_run_) | 1178 } // if (is_first_run_) |
| 1179 #endif // !defined(OS_ANDROID) | |
| 1151 | 1180 |
| 1152 #if defined(OS_WIN) | 1181 #if defined(OS_WIN) |
| 1153 // Sets things up so that if we crash from this point on, a dialog will | 1182 // Sets things up so that if we crash from this point on, a dialog will |
| 1154 // popup asking the user to restart chrome. It is done this late to avoid | 1183 // popup asking the user to restart chrome. It is done this late to avoid |
| 1155 // testing against a bunch of special cases that are taken care early on. | 1184 // testing against a bunch of special cases that are taken care early on. |
| 1156 ChromeBrowserMainPartsWin::PrepareRestartOnCrashEnviroment( | 1185 ChromeBrowserMainPartsWin::PrepareRestartOnCrashEnviroment( |
| 1157 parsed_command_line()); | 1186 parsed_command_line()); |
| 1158 | 1187 |
| 1159 // Registers Chrome with the Windows Restart Manager, which will restore the | 1188 // Registers Chrome with the Windows Restart Manager, which will restore the |
| 1160 // Chrome session when the computer is restarted after a system update. | 1189 // Chrome session when the computer is restarted after a system update. |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1315 #endif | 1344 #endif |
| 1316 | 1345 |
| 1317 PreBrowserStart(); | 1346 PreBrowserStart(); |
| 1318 | 1347 |
| 1319 // Instantiate the notification UI manager, as this triggers a perf timer | 1348 // Instantiate the notification UI manager, as this triggers a perf timer |
| 1320 // used to measure startup time. TODO(stevenjb): Figure out what is actually | 1349 // used to measure startup time. TODO(stevenjb): Figure out what is actually |
| 1321 // triggering the timer and call that explicitly in the approprate place. | 1350 // triggering the timer and call that explicitly in the approprate place. |
| 1322 // http://crbug.com/105065. | 1351 // http://crbug.com/105065. |
| 1323 browser_process_->notification_ui_manager(); | 1352 browser_process_->notification_ui_manager(); |
| 1324 | 1353 |
| 1354 #if !defined(OS_ANDROID) | |
| 1325 // Most general initialization is behind us, but opening a | 1355 // Most general initialization is behind us, but opening a |
| 1326 // tab and/or session restore and such is still to be done. | 1356 // tab and/or session restore and such is still to be done. |
| 1327 base::TimeTicks browser_open_start = base::TimeTicks::Now(); | 1357 base::TimeTicks browser_open_start = base::TimeTicks::Now(); |
| 1328 | 1358 |
| 1329 // We are in regular browser boot sequence. Open initial tabs and enter the | 1359 // We are in regular browser boot sequence. Open initial tabs and enter the |
| 1330 // main message loop. | 1360 // main message loop. |
| 1331 int result_code; | 1361 int result_code; |
| 1332 #if defined(OS_CHROMEOS) | 1362 #if defined(OS_CHROMEOS) |
| 1333 // On ChromeOS multiple profiles doesn't apply, and will break if we load | 1363 // On ChromeOS multiple profiles doesn't apply, and will break if we load |
| 1334 // them this early as the cryptohome hasn't yet been mounted (which happens | 1364 // them this early as the cryptohome hasn't yet been mounted (which happens |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1385 profile_->GetPrefs()); | 1415 profile_->GetPrefs()); |
| 1386 } | 1416 } |
| 1387 } | 1417 } |
| 1388 #endif | 1418 #endif |
| 1389 | 1419 |
| 1390 run_message_loop_ = true; | 1420 run_message_loop_ = true; |
| 1391 } else { | 1421 } else { |
| 1392 run_message_loop_ = false; | 1422 run_message_loop_ = false; |
| 1393 } | 1423 } |
| 1394 browser_creator_.reset(); | 1424 browser_creator_.reset(); |
| 1425 #endif // !defined(OS_ANDROID) | |
| 1395 | 1426 |
| 1396 PostBrowserStart(); | 1427 PostBrowserStart(); |
| 1397 | 1428 |
| 1398 if (parameters().ui_task) { | 1429 if (parameters().ui_task) { |
| 1399 // We end the startup timer here if we have parameters to run, because we | 1430 // We end the startup timer here if we have parameters to run, because we |
| 1400 // never start to run the main loop (where we normally stop the timer). | 1431 // never start to run the main loop (where we normally stop the timer). |
| 1401 startup_timer_->SignalStartupComplete( | 1432 startup_timer_->SignalStartupComplete( |
| 1402 performance_monitor::StartupTimer::STARTUP_TEST); | 1433 performance_monitor::StartupTimer::STARTUP_TEST); |
| 1403 parameters().ui_task->Run(); | 1434 parameters().ui_task->Run(); |
| 1404 delete parameters().ui_task; | 1435 delete parameters().ui_task; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1494 ThreadWatcherList::StopWatchingAll(); | 1525 ThreadWatcherList::StopWatchingAll(); |
| 1495 | 1526 |
| 1496 browser_process_->metrics_service()->Stop(); | 1527 browser_process_->metrics_service()->Stop(); |
| 1497 | 1528 |
| 1498 restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop(); | 1529 restart_last_session_ = browser_shutdown::ShutdownPreThreadsStop(); |
| 1499 browser_process_->StartTearDown(); | 1530 browser_process_->StartTearDown(); |
| 1500 #endif | 1531 #endif |
| 1501 } | 1532 } |
| 1502 | 1533 |
| 1503 void ChromeBrowserMainParts::PostDestroyThreads() { | 1534 void ChromeBrowserMainParts::PostDestroyThreads() { |
| 1535 #if defined(OS_ANDROID) | |
| 1536 // On Android, there is no quit/exit. So the browser's main message loop will | |
| 1537 // not finish. | |
| 1538 NOTREACHED(); | |
| 1539 #else | |
| 1504 browser_process_->PostDestroyThreads(); | 1540 browser_process_->PostDestroyThreads(); |
| 1505 // browser_shutdown takes care of deleting browser_process, so we need to | 1541 // browser_shutdown takes care of deleting browser_process, so we need to |
| 1506 // release it. | 1542 // release it. |
| 1507 ignore_result(browser_process_.release()); | 1543 ignore_result(browser_process_.release()); |
| 1508 browser_shutdown::ShutdownPostThreadsStop(restart_last_session_); | 1544 browser_shutdown::ShutdownPostThreadsStop(restart_last_session_); |
| 1509 master_prefs_.reset(); | 1545 master_prefs_.reset(); |
| 1510 process_singleton_.reset(); | 1546 process_singleton_.reset(); |
| 1511 | 1547 |
| 1512 // We need to do this check as late as possible, but due to modularity, this | 1548 // We need to do this check as late as possible, but due to modularity, this |
| 1513 // may be the last point in Chrome. This would be more effective if done at | 1549 // may be the last point in Chrome. This would be more effective if done at |
| 1514 // a higher level on the stack, so that it is impossible for an early return | 1550 // a higher level on the stack, so that it is impossible for an early return |
| 1515 // to bypass this code. Perhaps we need a *final* hook that is called on all | 1551 // to bypass this code. Perhaps we need a *final* hook that is called on all |
| 1516 // paths from content/browser/browser_main. | 1552 // paths from content/browser/browser_main. |
| 1517 CHECK(MetricsService::UmaMetricsProperlyShutdown()); | 1553 CHECK(MetricsService::UmaMetricsProperlyShutdown()); |
| 1554 #endif | |
| 1518 } | 1555 } |
| 1519 | 1556 |
| 1520 // Public members: | 1557 // Public members: |
| 1521 | 1558 |
| 1522 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) { | 1559 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) { |
| 1523 chrome_extra_parts_.push_back(parts); | 1560 chrome_extra_parts_.push_back(parts); |
| 1524 } | 1561 } |
| 1525 | 1562 |
| 1526 // Misc ------------------------------------------------------------------------ | 1563 // Misc ------------------------------------------------------------------------ |
| 1527 | 1564 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1563 if (base::win::GetVersion() <= base::win::VERSION_XP) | 1600 if (base::win::GetVersion() <= base::win::VERSION_XP) |
| 1564 uma_name += "_XP"; | 1601 uma_name += "_XP"; |
| 1565 | 1602 |
| 1566 uma_name += "_PreRead_"; | 1603 uma_name += "_PreRead_"; |
| 1567 uma_name += pre_read_percentage; | 1604 uma_name += pre_read_percentage; |
| 1568 AddPreReadHistogramTime(uma_name.c_str(), time); | 1605 AddPreReadHistogramTime(uma_name.c_str(), time); |
| 1569 } | 1606 } |
| 1570 #endif | 1607 #endif |
| 1571 #endif | 1608 #endif |
| 1572 } | 1609 } |
| OLD | NEW |