• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 class ActiveTabTracker;
22 class BrowserProcessImpl;
23 class ChromeBrowserMainExtraParts;
24 class FieldTrialSynchronizer;
25 class MetricsService;
26 class PrefService;
27 class Profile;
28 class StartupBrowserCreator;
29 class StartupTimeBomb;
30 class ShutdownWatcherHelper;
31 class ThreeDAPIObserver;
32 class TranslateManager;
33 
34 namespace chrome_browser {
35 // For use by ShowMissingLocaleMessageBox.
36 extern const char kMissingLocaleDataTitle[];
37 extern const char kMissingLocaleDataMessage[];
38 }
39 
40 namespace chrome_browser_metrics {
41 class TrackingSynchronizer;
42 }
43 
44 namespace performance_monitor {
45 class StartupTimer;
46 }
47 
48 class 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 
parameters()84   const content::MainFunctionParams& parameters() const {
85     return parameters_;
86   }
parsed_command_line()87   const CommandLine& parsed_command_line() const {
88     return parsed_command_line_;
89   }
90 
profile()91   Profile* profile() { return profile_; }
92 
local_state()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