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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROME_BROWSER_MAIN_H_
6#define CHROME_BROWSER_CHROME_BROWSER_MAIN_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/metrics/field_trial.h"
11#include "base/tracked_objects.h"
12#include "chrome/browser/chrome_browser_field_trials.h"
13#include "chrome/browser/chrome_process_singleton.h"
14#include "chrome/browser/first_run/first_run.h"
15#include "chrome/browser/process_singleton.h"
16#include "chrome/browser/task_profiler/auto_tracking.h"
17#include "chrome/browser/ui/startup/startup_browser_creator.h"
18#include "content/public/browser/browser_main_parts.h"
19#include "content/public/common/main_function_params.h"
20
21class ActiveTabTracker;
22class BrowserProcessImpl;
23class ChromeBrowserMainExtraParts;
24class FieldTrialSynchronizer;
25class MetricsService;
26class PrefService;
27class Profile;
28class StartupBrowserCreator;
29class StartupTimeBomb;
30class ShutdownWatcherHelper;
31class ThreeDAPIObserver;
32class TranslateManager;
33
34namespace chrome_browser {
35// For use by ShowMissingLocaleMessageBox.
36extern const char kMissingLocaleDataTitle[];
37extern const char kMissingLocaleDataMessage[];
38}
39
40namespace chrome_browser_metrics {
41class TrackingSynchronizer;
42}
43
44namespace performance_monitor {
45class StartupTimer;
46}
47
48class ChromeBrowserMainParts : public content::BrowserMainParts {
49 public:
50  virtual ~ChromeBrowserMainParts();
51
52  // Add additional ChromeBrowserMainExtraParts.
53  virtual void AddParts(ChromeBrowserMainExtraParts* parts);
54
55 protected:
56  explicit ChromeBrowserMainParts(
57      const content::MainFunctionParams& parameters);
58
59  // content::BrowserMainParts overrides.
60  // These are called in-order by content::BrowserMainLoop.
61  // Each stage calls the same stages in any ChromeBrowserMainExtraParts added
62  // with AddParts() from ChromeContentBrowserClient::CreateBrowserMainParts.
63  virtual void PreEarlyInitialization() OVERRIDE;
64  virtual void PostEarlyInitialization() OVERRIDE;
65  virtual void ToolkitInitialized() OVERRIDE;
66  virtual void PreMainMessageLoopStart() OVERRIDE;
67  virtual void PostMainMessageLoopStart() OVERRIDE;
68  virtual int PreCreateThreads() OVERRIDE;
69  virtual void PreMainMessageLoopRun() OVERRIDE;
70  virtual bool MainMessageLoopRun(int* result_code) OVERRIDE;
71  virtual void PostMainMessageLoopRun() OVERRIDE;
72  virtual void PostDestroyThreads() OVERRIDE;
73
74  // Additional stages for ChromeBrowserMainExtraParts. These stages are called
75  // in order from PreMainMessageLoopRun(). See implementation for details.
76  virtual void PreProfileInit();
77  virtual void PostProfileInit();
78  virtual void PreBrowserStart();
79  virtual void PostBrowserStart();
80
81  // Displays a warning message that we can't find any locale data files.
82  virtual void ShowMissingLocaleMessageBox() = 0;
83
84  const content::MainFunctionParams& parameters() const {
85    return parameters_;
86  }
87  const CommandLine& parsed_command_line() const {
88    return parsed_command_line_;
89  }
90
91  Profile* profile() { return profile_; }
92
93  const PrefService* local_state() const { return local_state_; }
94
95 private:
96  // Methods for |SetupMetricsAndFieldTrials()| --------------------------------
97
98  // Constructs metrics service and does related initialization, including
99  // creation of field trials. Call only after labs have been converted to
100  // switches.
101  void SetupMetricsAndFieldTrials();
102
103  // Starts recording of metrics. This can only be called after we have a file
104  // thread.
105  void StartMetricsRecording();
106
107  // Returns true if the user opted in to sending metric reports.
108  bool IsMetricsReportingEnabled();
109
110  // Record time from process startup to present time in an UMA histogram.
111  void RecordBrowserStartupTime();
112
113  // Records a time value to an UMA histogram in the context of the
114  // PreReadExperiment field-trial. This also reports to the appropriate
115  // sub-histogram (_PreRead(Enabled|Disabled)).
116  void RecordPreReadExperimentTime(const char* name, base::TimeDelta time);
117
118  // Methods for Main Message Loop -------------------------------------------
119
120  int PreCreateThreadsImpl();
121  int PreMainMessageLoopRunImpl();
122
123  // Members initialized on construction ---------------------------------------
124
125  const content::MainFunctionParams parameters_;
126  const CommandLine& parsed_command_line_;
127  int result_code_;
128
129  // Create StartupTimeBomb object for watching jank during startup.
130  scoped_ptr<StartupTimeBomb> startup_watcher_;
131
132  // Create ShutdownWatcherHelper object for watching jank during shutdown.
133  // Please keep |shutdown_watcher| as the first object constructed, and hence
134  // it is destroyed last.
135  scoped_ptr<ShutdownWatcherHelper> shutdown_watcher_;
136
137  // A timer to hold data regarding startup and session restore times for
138  // PerformanceMonitor so that we don't have to start the entire
139  // PerformanceMonitor at browser startup.
140  scoped_ptr<performance_monitor::StartupTimer> startup_timer_;
141
142  // Creating this object starts tracking the creation and deletion of Task
143  // instance. This MUST be done before main_message_loop, so that it is
144  // destroyed after the main_message_loop.
145  task_profiler::AutoTracking tracking_objects_;
146
147  // Statistical testing infrastructure for the entire browser. NULL until
148  // SetupMetricsAndFieldTrials is called.
149  scoped_ptr<base::FieldTrialList> field_trial_list_;
150
151  ChromeBrowserFieldTrials browser_field_trials_;
152
153  // Vector of additional ChromeBrowserMainExtraParts.
154  // Parts are deleted in the inverse order they are added.
155  std::vector<ChromeBrowserMainExtraParts*> chrome_extra_parts_;
156
157  // Members initialized after / released before main_message_loop_ ------------
158
159  scoped_ptr<BrowserProcessImpl> browser_process_;
160  scoped_refptr<chrome_browser_metrics::TrackingSynchronizer>
161      tracking_synchronizer_;
162#if !defined(OS_ANDROID)
163  // Browser creation happens on the Java side in Android.
164  scoped_ptr<StartupBrowserCreator> browser_creator_;
165
166  // Android doesn't support multiple browser processes, so it doesn't implement
167  // ProcessSingleton.
168  scoped_ptr<ChromeProcessSingleton> process_singleton_;
169
170  // Android's first run is done in Java instead of native.
171  scoped_ptr<first_run::MasterPrefs> master_prefs_;
172#endif
173  TranslateManager* translate_manager_;
174  Profile* profile_;
175  bool run_message_loop_;
176  ProcessSingleton::NotifyResult notify_result_;
177  scoped_ptr<ThreeDAPIObserver> three_d_observer_;
178
179  // Initialized in SetupMetricsAndFieldTrials.
180  scoped_refptr<FieldTrialSynchronizer> field_trial_synchronizer_;
181
182  // Members initialized in PreMainMessageLoopRun, needed in
183  // PreMainMessageLoopRunThreadsCreated.
184  PrefService* local_state_;
185  base::FilePath user_data_dir_;
186
187#if !defined(OS_ANDROID)
188  scoped_ptr<ActiveTabTracker> active_tab_tracker_;
189#endif
190
191  // Members needed across shutdown methods.
192  bool restart_last_session_;
193
194  // Tests can set this to true to disable restricting cookie access in the
195  // network stack, as this can only be done once.
196  static bool disable_enforcing_cookie_policies_for_tests_;
197
198  DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainParts);
199};
200
201#endif  // CHROME_BROWSER_CHROME_BROWSER_MAIN_H_
202