15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROME_BROWSER_MAIN_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROME_BROWSER_MAIN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/field_trial.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_field_trials.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_process_singleton.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/process_singleton.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/task_profiler/auto_tracking.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_main_parts.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/common/main_function_params.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserProcessImpl; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeBrowserMainExtraParts; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FieldTrialSynchronizer; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MetricsService; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProcessPowerCollector; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupBrowserCreator; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StartupTimeBomb; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShutdownWatcherHelper; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreeDAPIObserver; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For use by ShowMissingLocaleMessageBox. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_WIN) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kMissingLocaleDataTitle[]; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_WIN) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kMissingLocaleDataMessage[]; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace metrics { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TrackingSynchronizer; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeBrowserMainParts : public content::BrowserMainParts { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ChromeBrowserMainParts(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add additional ChromeBrowserMainExtraParts. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddParts(ChromeBrowserMainExtraParts* parts); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ChromeBrowserMainParts( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::BrowserMainParts overrides. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are called in-order by content::BrowserMainLoop. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each stage calls the same stages in any ChromeBrowserMainExtraParts added 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with AddParts() from ChromeContentBrowserClient::CreateBrowserMainParts. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreEarlyInitialization() OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostEarlyInitialization() OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ToolkitInitialized() OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreMainMessageLoopStart() OVERRIDE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostMainMessageLoopStart() OVERRIDE; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int PreCreateThreads() OVERRIDE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreMainMessageLoopRun() OVERRIDE; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool MainMessageLoopRun(int* result_code) OVERRIDE; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostMainMessageLoopRun() OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostDestroyThreads() OVERRIDE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Additional stages for ChromeBrowserMainExtraParts. These stages are called 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in order from PreMainMessageLoopRun(). See implementation for details. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreProfileInit(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostProfileInit(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PreBrowserStart(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PostBrowserStart(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Displays a warning message that we can't find any locale data files. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowMissingLocaleMessageBox() = 0; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters() const { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parameters_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::CommandLine& parsed_command_line() const { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parsed_command_line_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile() { return profile_; } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrefService* local_state() const { return local_state_; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for |SetupMetricsAndFieldTrials()| -------------------------------- 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs metrics service and does related initialization, including 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // creation of field trials. Call only after labs have been converted to 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // switches. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetupMetricsAndFieldTrials(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts recording of metrics. This can only be called after we have a file 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartMetricsRecording(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Record time from process startup to present time in an UMA histogram. 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void RecordBrowserStartupTime(); 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Records a time value to an UMA histogram in the context of the 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // PreReadExperiment field-trial. This also reports to the appropriate 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // sub-histogram (_PreRead(Enabled|Disabled)). 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void RecordPreReadExperimentTime(const char* name, base::TimeDelta time); 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for Main Message Loop ------------------------------------------- 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int PreCreateThreadsImpl(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int PreMainMessageLoopRunImpl(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized on construction --------------------------------------- 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const content::MainFunctionParams parameters_; 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::CommandLine& parsed_command_line_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_code_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create StartupTimeBomb object for watching jank during startup. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<StartupTimeBomb> startup_watcher_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create ShutdownWatcherHelper object for watching jank during shutdown. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please keep |shutdown_watcher| as the first object constructed, and hence 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is destroyed last. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ShutdownWatcherHelper> shutdown_watcher_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creating this object starts tracking the creation and deletion of Task 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance. This MUST be done before main_message_loop, so that it is 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed after the main_message_loop. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task_profiler::AutoTracking tracking_objects_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Statistical testing infrastructure for the entire browser. NULL until 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetupMetricsAndFieldTrials is called. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::FieldTrialList> field_trial_list_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBrowserFieldTrials browser_field_trials_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_ANDROID) && !defined(OS_IOS) 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A monitor for attributing power consumption to origins. 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ProcessPowerCollector> process_power_collector_; 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vector of additional ChromeBrowserMainExtraParts. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parts are deleted in the inverse order they are added. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ChromeBrowserMainExtraParts*> chrome_extra_parts_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized after / released before main_message_loop_ ------------ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessImpl> browser_process_; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<metrics::TrackingSynchronizer> tracking_synchronizer_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Browser creation happens on the Java side in Android. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<StartupBrowserCreator> browser_creator_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Android doesn't support multiple browser processes, so it doesn't implement 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProcessSingleton. 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ChromeProcessSingleton> process_singleton_; 1653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 1663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Android's first run is done in Java instead of native. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<first_run::MasterPrefs> master_prefs_; 1683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#endif 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool run_message_loop_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessSingleton::NotifyResult notify_result_; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ThreeDAPIObserver> three_d_observer_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialized in SetupMetricsAndFieldTrials. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<FieldTrialSynchronizer> field_trial_synchronizer_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized in PreMainMessageLoopRun, needed in 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PreMainMessageLoopRunThreadsCreated. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* local_state_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members needed across shutdown methods. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restart_last_session_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tests can set this to true to disable restricting cookie access in the 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network stack, as this can only be done once. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool disable_enforcing_cookie_policies_for_tests_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainParts); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_CHROME_BROWSER_MAIN_H_ 193