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