blob: 4c02bd8cecd0c75944d3fbffa4ad84c902ef9e09 [file] [log] [blame]
[email protected]d15b7ca2012-01-04 01:42:581// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]1152b7e2009-09-14 03:26:032// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]e6b5bc22011-09-08 22:01:565#ifndef CHROME_BROWSER_CHROME_BROWSER_MAIN_H_
6#define CHROME_BROWSER_CHROME_BROWSER_MAIN_H_
[email protected]1152b7e2009-09-14 03:26:037
dcheng4af48582016-04-19 00:29:358#include <memory>
9
avie4d7b6f2015-12-26 00:59:1810#include "base/macros.h"
[email protected]835d7c82010-10-14 04:38:3811#include "base/metrics/field_trial.h"
wittman863f8412015-08-24 00:42:5112#include "base/profiler/stack_sampling_profiler.h"
[email protected]f8abf722010-07-07 19:46:2413#include "base/tracked_objects.h"
avie4d7b6f2015-12-26 00:59:1814#include "build/build_config.h"
[email protected]ae9e12a2012-07-31 17:48:1215#include "chrome/browser/chrome_browser_field_trials.h"
[email protected]9a47c432013-04-19 20:33:5516#include "chrome/browser/chrome_process_singleton.h"
[email protected]c1702d712011-09-08 19:41:4317#include "chrome/browser/first_run/first_run.h"
[email protected]66013922011-09-13 18:53:4218#include "chrome/browser/process_singleton.h"
wittman7b501a12015-09-14 05:13:0719#include "chrome/browser/stack_sampling_configuration.h"
[email protected]fe7c4872012-05-10 20:06:0320#include "chrome/browser/ui/startup/startup_browser_creator.h"
[email protected]b48c9182011-10-26 18:03:3021#include "content/public/browser/browser_main_parts.h"
[email protected]57624ab2013-08-01 16:01:5122#include "content/public/common/main_function_params.h"
[email protected]f8abf722010-07-07 19:46:2423
[email protected]c1702d712011-09-08 19:41:4324class BrowserProcessImpl;
[email protected]50462bf02011-11-21 19:13:3125class ChromeBrowserMainExtraParts;
[email protected]edafd4c2011-05-10 17:18:5326class FieldTrialSynchronizer;
[email protected]1152b7e2009-09-14 03:26:0327class MetricsService;
[email protected]edafd4c2011-05-10 17:18:5328class PrefService;
dhnishi3cf1d2aa2014-08-26 22:25:0729class ProcessPowerCollector;
[email protected]c1702d712011-09-08 19:41:4330class Profile;
[email protected]fe7c4872012-05-10 20:06:0331class StartupBrowserCreator;
[email protected]08f1c5e2011-12-01 01:54:3432class StartupTimeBomb;
[email protected]f967b722011-09-07 00:58:0433class ShutdownWatcherHelper;
[email protected]44327692013-02-26 21:21:2234class ThreeDAPIObserver;
[email protected]5f988b92011-05-18 07:14:0835
[email protected]cbce47242011-08-12 21:40:5936namespace chrome_browser {
37// For use by ShowMissingLocaleMessageBox.
[email protected]49aa5a32014-02-03 10:00:4438#if defined(OS_WIN)
[email protected]cbce47242011-08-12 21:40:5939extern const char kMissingLocaleDataTitle[];
[email protected]49aa5a32014-02-03 10:00:4440#endif
41
[email protected]893124a22014-04-15 00:45:2842#if defined(OS_WIN)
[email protected]cbce47242011-08-12 21:40:5943extern const char kMissingLocaleDataMessage[];
[email protected]49aa5a32014-02-03 10:00:4444#endif
[email protected]cbce47242011-08-12 21:40:5945}
46
gunsch840bc412014-09-18 19:38:0647namespace metrics {
[email protected]10fe40c2011-11-05 03:27:4648class TrackingSynchronizer;
49}
50
juncai1b1152562015-09-04 02:36:0851namespace webusb {
52class WebUsbBrowserClient;
53class WebUsbDetector;
54}
55
[email protected]f967b722011-09-07 00:58:0456class ChromeBrowserMainParts : public content::BrowserMainParts {
[email protected]f8abf722010-07-07 19:46:2457 public:
Daniel Chenga542fca2014-10-21 09:51:2958 ~ChromeBrowserMainParts() override;
[email protected]f8abf722010-07-07 19:46:2459
[email protected]50462bf02011-11-21 19:13:3160 // Add additional ChromeBrowserMainExtraParts.
61 virtual void AddParts(ChromeBrowserMainExtraParts* parts);
[email protected]069cd9952011-10-01 16:34:4562
[email protected]f8abf722010-07-07 19:46:2463 protected:
[email protected]4573fbd2011-10-31 20:25:1864 explicit ChromeBrowserMainParts(
65 const content::MainFunctionParams& parameters);
[email protected]f8abf722010-07-07 19:46:2466
[email protected]50462bf02011-11-21 19:13:3167 // content::BrowserMainParts overrides.
[email protected]97ef83f2011-12-19 19:26:3668 // These are called in-order by content::BrowserMainLoop.
69 // Each stage calls the same stages in any ChromeBrowserMainExtraParts added
70 // with AddParts() from ChromeContentBrowserClient::CreateBrowserMainParts.
Daniel Chenga542fca2014-10-21 09:51:2971 void PreEarlyInitialization() override;
72 void PostEarlyInitialization() override;
73 void ToolkitInitialized() override;
74 void PreMainMessageLoopStart() override;
75 void PostMainMessageLoopStart() override;
76 int PreCreateThreads() override;
77 void PreMainMessageLoopRun() override;
78 bool MainMessageLoopRun(int* result_code) override;
79 void PostMainMessageLoopRun() override;
80 void PostDestroyThreads() override;
[email protected]b48c9182011-10-26 18:03:3081
[email protected]97ef83f2011-12-19 19:26:3682 // Additional stages for ChromeBrowserMainExtraParts. These stages are called
[email protected]278a34d2012-06-07 00:34:5883 // in order from PreMainMessageLoopRun(). See implementation for details.
[email protected]97ef83f2011-12-19 19:26:3684 virtual void PreProfileInit();
85 virtual void PostProfileInit();
86 virtual void PreBrowserStart();
87 virtual void PostBrowserStart();
88
[email protected]b48c9182011-10-26 18:03:3089 // Displays a warning message that we can't find any locale data files.
90 virtual void ShowMissingLocaleMessageBox() = 0;
[email protected]f8abf722010-07-07 19:46:2491
[email protected]50462bf02011-11-21 19:13:3192 const content::MainFunctionParams& parameters() const {
93 return parameters_;
94 }
[email protected]2f3b1cc2014-03-17 23:07:1595 const base::CommandLine& parsed_command_line() const {
[email protected]50462bf02011-11-21 19:13:3196 return parsed_command_line_;
97 }
mlermana312cec2015-01-28 21:13:3398 const base::FilePath& user_data_dir() const {
99 return user_data_dir_;
100 }
[email protected]50462bf02011-11-21 19:13:31101
102 Profile* profile() { return profile_; }
103
[email protected]a5e8c6d2012-04-09 20:22:01104 const PrefService* local_state() const { return local_state_; }
105
[email protected]1fec64352010-07-27 13:55:21106 private:
[email protected]069cd9952011-10-01 16:34:45107 // Methods for |SetupMetricsAndFieldTrials()| --------------------------------
108
[email protected]50462bf02011-11-21 19:13:31109 // Constructs metrics service and does related initialization, including
110 // creation of field trials. Call only after labs have been converted to
111 // switches.
[email protected]5281db1d2012-01-11 22:51:54112 void SetupMetricsAndFieldTrials();
[email protected]edafd4c2011-05-10 17:18:53113
[email protected]5281db1d2012-01-11 22:51:54114 // Starts recording of metrics. This can only be called after we have a file
115 // thread.
116 void StartMetricsRecording();
117
[email protected]e8b6ca02013-07-10 18:00:51118 // Record time from process startup to present time in an UMA histogram.
[email protected]69e90692013-07-31 02:13:29119 void RecordBrowserStartupTime();
[email protected]e8b6ca02013-07-10 18:00:51120
[email protected]b48c9182011-10-26 18:03:30121 // Methods for Main Message Loop -------------------------------------------
122
[email protected]2e5b60a22011-11-28 15:56:41123 int PreCreateThreadsImpl();
[email protected]b48c9182011-10-26 18:03:30124 int PreMainMessageLoopRunImpl();
125
[email protected]f8abf722010-07-07 19:46:24126 // Members initialized on construction ---------------------------------------
127
[email protected]57624ab2013-08-01 16:01:51128 const content::MainFunctionParams parameters_;
[email protected]2f3b1cc2014-03-17 23:07:15129 const base::CommandLine& parsed_command_line_;
[email protected]b48c9182011-10-26 18:03:30130 int result_code_;
131
[email protected]08f1c5e2011-12-01 01:54:34132 // Create StartupTimeBomb object for watching jank during startup.
dcheng4af48582016-04-19 00:29:35133 std::unique_ptr<StartupTimeBomb> startup_watcher_;
[email protected]08f1c5e2011-12-01 01:54:34134
[email protected]f967b722011-09-07 00:58:04135 // Create ShutdownWatcherHelper object for watching jank during shutdown.
136 // Please keep |shutdown_watcher| as the first object constructed, and hence
137 // it is destroyed last.
dcheng4af48582016-04-19 00:29:35138 std::unique_ptr<ShutdownWatcherHelper> shutdown_watcher_;
[email protected]f8abf722010-07-07 19:46:24139
[email protected]edafd4c2011-05-10 17:18:53140 // Statistical testing infrastructure for the entire browser. NULL until
141 // SetupMetricsAndFieldTrials is called.
dcheng4af48582016-04-19 00:29:35142 std::unique_ptr<base::FieldTrialList> field_trial_list_;
[email protected]f8abf722010-07-07 19:46:24143
[email protected]ae9e12a2012-07-31 17:48:12144 ChromeBrowserFieldTrials browser_field_trials_;
145
dhnishi3cf1d2aa2014-08-26 22:25:07146#if !defined(OS_ANDROID) && !defined(OS_IOS)
147 // A monitor for attributing power consumption to origins.
dcheng4af48582016-04-19 00:29:35148 std::unique_ptr<ProcessPowerCollector> process_power_collector_;
juncai1b1152562015-09-04 02:36:08149
dcheng4af48582016-04-19 00:29:35150 std::unique_ptr<webusb::WebUsbBrowserClient> webusb_browser_client_;
151 std::unique_ptr<webusb::WebUsbDetector> webusb_detector_;
dhnishi3cf1d2aa2014-08-26 22:25:07152#endif
153
[email protected]50462bf02011-11-21 19:13:31154 // Vector of additional ChromeBrowserMainExtraParts.
155 // Parts are deleted in the inverse order they are added.
156 std::vector<ChromeBrowserMainExtraParts*> chrome_extra_parts_;
157
wittman7b501a12015-09-14 05:13:07158 // The configuration to use for the stack sampling profiler below.
159 StackSamplingConfiguration sampling_profiler_config_;
160
wittman863f8412015-08-24 00:42:51161 // A profiler that periodically samples stack traces. Used to sample startup
162 // behavior.
163 base::StackSamplingProfiler sampling_profiler_;
164
[email protected]0f247aea82011-09-03 03:05:51165 // Members initialized after / released before main_message_loop_ ------------
166
dcheng4af48582016-04-19 00:29:35167 std::unique_ptr<BrowserProcessImpl> browser_process_;
gunsch840bc412014-09-18 19:38:06168 scoped_refptr<metrics::TrackingSynchronizer> tracking_synchronizer_;
pkasting28ae5792016-05-20 21:39:14169
bshe0d948072016-01-05 19:06:20170#if !defined(OS_ANDROID)
[email protected]81054f812012-08-30 00:47:09171 // Browser creation happens on the Java side in Android.
dcheng4af48582016-04-19 00:29:35172 std::unique_ptr<StartupBrowserCreator> browser_creator_;
[email protected]81054f812012-08-30 00:47:09173
174 // Android doesn't support multiple browser processes, so it doesn't implement
175 // ProcessSingleton.
dcheng4af48582016-04-19 00:29:35176 std::unique_ptr<ChromeProcessSingleton> process_singleton_;
[email protected]d29f4e312013-08-07 05:28:31177
178 // Android's first run is done in Java instead of native.
dcheng4af48582016-04-19 00:29:35179 std::unique_ptr<first_run::MasterPrefs> master_prefs_;
pkasting28ae5792016-05-20 21:39:14180
181 ProcessSingleton::NotifyResult notify_result_ =
182 ProcessSingleton::PROCESS_NONE;
183
184 // Members needed across shutdown methods.
185 bool restart_last_session_ = false;
bshe0d948072016-01-05 19:06:20186#endif
pkasting28ae5792016-05-20 21:39:14187
[email protected]c1702d712011-09-08 19:41:43188 Profile* profile_;
189 bool run_message_loop_;
dcheng4af48582016-04-19 00:29:35190 std::unique_ptr<ThreeDAPIObserver> three_d_observer_;
[email protected]0f247aea82011-09-03 03:05:51191
[email protected]edafd4c2011-05-10 17:18:53192 // Initialized in SetupMetricsAndFieldTrials.
193 scoped_refptr<FieldTrialSynchronizer> field_trial_synchronizer_;
194
[email protected]2e5b60a22011-11-28 15:56:41195 // Members initialized in PreMainMessageLoopRun, needed in
196 // PreMainMessageLoopRunThreadsCreated.
[email protected]2e5b60a22011-11-28 15:56:41197 PrefService* local_state_;
[email protected]650b2d52013-02-10 03:41:45198 base::FilePath user_data_dir_;
[email protected]2e5b60a22011-11-28 15:56:41199
[email protected]f967b722011-09-07 00:58:04200 DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainParts);
[email protected]f8abf722010-07-07 19:46:24201};
202
[email protected]e6b5bc22011-09-08 22:01:56203#endif // CHROME_BROWSER_CHROME_BROWSER_MAIN_H_