Home | History | Annotate | Download | only in browser
      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 
     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