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 CONTENT_BROWSER_BROWSER_MAIN_LOOP_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_BROWSER_MAIN_LOOP_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/timer/timer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_process_sub_thread.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/public/browser/browser_main_runner.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FilePath; 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass HighResolutionTimerManager; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PowerMonitor; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SystemMonitor; 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace debug { 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochclass TraceMemoryController; 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class TraceEventSystemStatsMonitor; 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace debug 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace base 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioManager; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MidiManager; 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class UserInputMonitor; 33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace media 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkChangeNotifier; 37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} // namespace net 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserMainParts; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserOnlineStateObserver; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserShutdownImpl; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserThreadImpl; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamManager; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceDispatcherHostImpl; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SpeechRecognitionManagerImpl; 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class StartupTaskRunner; 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass TimeZoneMonitor; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MainFunctionParams; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeviceMonitorLinux; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeviceMonitorMac; 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#elif defined(OS_WIN) 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass SystemMessageWindowWin; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements the main browser loop stages called from BrowserMainRunner. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comments in browser_main_parts.h for additional info. 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CONTENT_EXPORT BrowserMainLoop { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the current instance. This is used to get access to the getters 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // that return objects which are owned by this class. 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static BrowserMainLoop* GetInstance(); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BrowserMainLoop(const MainFunctionParams& parameters); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserMainLoop(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EarlyInitialization(); 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Initializes the toolkit. Returns whether the toolkit initialization was 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // successful or not. 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool InitializeToolkit(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MainMessageLoopStart(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Create and start running the tasks we need to complete startup. Note that 79424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // this can be called more than once (currently only on Android) if we get a 80424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // request for synchronous startup while the tasks created by asynchronous 81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // startup are still running. 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateStartupTasks(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Perform the default message loop run logic. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunMainMessageLoopParts(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Performs the shutdown sequence, starting with PostMainMessageLoopRun 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // through stopping threads to PostDestroyThreads. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutdownThreadsAndCleanUp(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetResultCode() const { return result_code_; } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch media::AudioManager* audio_manager() const { return audio_manager_.get(); } 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaStreamManager* media_stream_manager() const { 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return media_stream_manager_.get(); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) media::UserInputMonitor* user_input_monitor() const { 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return user_input_monitor_.get(); 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::MidiManager* midi_manager() const { return midi_manager_.get(); } 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Thread* indexed_db_thread() const { return indexed_db_thread_.get(); } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_tracing_startup() const { return is_tracing_startup_; } 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& startup_trace_file() const { 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return startup_trace_file_; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void StopStartupTracingTimer(); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DeviceMonitorMac* device_monitor_mac() const { 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return device_monitor_mac_.get(); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class MemoryObserver; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For ShutdownThreadsAndCleanUp. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class BrowserShutdownImpl; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeMainThread(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Called just before creating the threads 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int PreCreateThreads(); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Create all secondary threads. 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int CreateThreads(); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called right after the browser threads have been started. 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int BrowserThreadsStarted(); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int PreMainMessageLoopRun(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MainMessageLoopRun(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath GetStartupTraceFileName( 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::CommandLine& command_line) const; 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void InitStartupTracing(const base::CommandLine& command_line); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void EndStartupTracing(); 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized on construction --------------------------------------- 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MainFunctionParams& parameters_; 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::CommandLine& parsed_command_line_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_code_; 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // True if the non-UI threads were created. 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool created_threads_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized in |MainMessageLoopStart()| --------------------------- 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::MessageLoop> main_message_loop_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::SystemMonitor> system_monitor_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::PowerMonitor> power_monitor_; 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::HighResolutionTimerManager> hi_res_timer_manager_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // user_input_monitor_ has to outlive audio_manager_, so declared first. 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<media::UserInputMonitor> user_input_monitor_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<media::AudioManager> audio_manager_; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<media::MidiManager> midi_manager_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MediaStreamManager> media_stream_manager_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Per-process listener for online state changes. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserOnlineStateObserver> online_state_observer_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SystemMessageWindowWin> system_message_window_; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(USE_UDEV) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeviceMonitorLinux> device_monitor_linux_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) && !defined(OS_IOS) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeviceMonitorMac> device_monitor_mac_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The startup task runner is created by CreateStartupTasks() 170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<StartupTaskRunner> startup_task_runner_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy parts_ before main_message_loop_ (required) and before other 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // classes constructed in content (but after main_thread_). 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserMainParts> parts_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized in |InitializeMainThread()| --------------------------- 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must get destroyed before other threads that are created in parts_. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserThreadImpl> main_thread_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized in |BrowserThreadsStarted()| -------------------------- 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ResourceDispatcherHostImpl> resource_dispatcher_host_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SpeechRecognitionManagerImpl> speech_recognition_manager_; 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<TimeZoneMonitor> time_zone_monitor_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Members initialized in |RunMainMessageLoopParts()| ------------------------ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> db_thread_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> file_user_blocking_thread_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> file_thread_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> process_launcher_thread_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> cache_thread_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BrowserProcessSubThread> io_thread_; 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Thread> indexed_db_thread_; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<MemoryObserver> memory_observer_; 194bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch scoped_ptr<base::debug::TraceMemoryController> trace_memory_controller_; 195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<base::debug::TraceEventSystemStatsMonitor> system_stats_monitor_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool is_tracing_startup_; 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath startup_trace_file_; 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This timer initiates trace file saving. 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::OneShotTimer<BrowserMainLoop> startup_trace_timer_; 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserMainLoop); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_BROWSER_MAIN_LOOP_H_ 209