1// Copyright (c) 2011 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// When each service is created, we set a flag indicating this. At this point,
6// the service initialization could fail or succeed. This allows us to remember
7// if we tried to create a service, and not try creating it over and over if
8// the creation failed.
9
10#ifndef CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_
11#define CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_
12#pragma once
13
14#include <string>
15
16#include "base/basictypes.h"
17#include "base/memory/scoped_ptr.h"
18#include "base/message_loop.h"
19#include "base/threading/non_thread_safe.h"
20#include "base/timer.h"
21#include "chrome/browser/browser_process.h"
22#include "chrome/browser/download/download_status_updater.h"
23#include "chrome/browser/prefs/pref_change_registrar.h"
24#include "chrome/browser/prefs/pref_member.h"
25#include "chrome/browser/tab_contents/thumbnail_generator.h"
26#include "content/common/notification_observer.h"
27#include "content/common/notification_registrar.h"
28#include "ipc/ipc_message.h"
29
30class ChromeNetLog;
31class CommandLine;
32class DevToolsHttpProtocolHandler;
33class DevToolsProtocolHandler;
34class FilePath;
35class NotificationService;
36class PluginDataRemover;
37class TabCloseableStateWatcher;
38
39// Real implementation of BrowserProcess that creates and returns the services.
40class BrowserProcessImpl : public BrowserProcess,
41                           public base::NonThreadSafe,
42                           public NotificationObserver {
43 public:
44  explicit BrowserProcessImpl(const CommandLine& command_line);
45  virtual ~BrowserProcessImpl();
46
47  virtual void EndSession();
48
49  // BrowserProcess methods
50  virtual ResourceDispatcherHost* resource_dispatcher_host();
51  virtual MetricsService* metrics_service();
52  virtual IOThread* io_thread();
53  virtual base::Thread* file_thread();
54  virtual base::Thread* db_thread();
55  virtual base::Thread* process_launcher_thread();
56  virtual base::Thread* cache_thread();
57  virtual base::Thread* gpu_thread();
58#if defined(USE_X11)
59  virtual base::Thread* background_x11_thread();
60#endif
61  virtual WatchDogThread* watchdog_thread();
62  virtual ProfileManager* profile_manager();
63  virtual PrefService* local_state();
64  virtual DevToolsManager* devtools_manager();
65  virtual SidebarManager* sidebar_manager();
66  virtual ui::Clipboard* clipboard();
67  virtual net::URLRequestContextGetter* system_request_context();
68#if defined(OS_CHROMEOS)
69  virtual chromeos::ProxyConfigServiceImpl*
70      chromeos_proxy_config_service_impl();
71#endif  // defined(OS_CHROMEOS)
72  virtual ExtensionEventRouterForwarder* extension_event_router_forwarder();
73  virtual NotificationUIManager* notification_ui_manager();
74  virtual policy::BrowserPolicyConnector* browser_policy_connector();
75  virtual IconManager* icon_manager();
76  virtual ThumbnailGenerator* GetThumbnailGenerator();
77  virtual AutomationProviderList* InitAutomationProviderList();
78  virtual void InitDevToolsHttpProtocolHandler(
79      const std::string& ip,
80      int port,
81      const std::string& frontend_url);
82  virtual void InitDevToolsLegacyProtocolHandler(int port);
83  virtual unsigned int AddRefModule();
84  virtual unsigned int ReleaseModule();
85  virtual bool IsShuttingDown();
86  virtual printing::PrintJobManager* print_job_manager();
87  virtual printing::PrintPreviewTabController* print_preview_tab_controller();
88  virtual GoogleURLTracker* google_url_tracker();
89  virtual IntranetRedirectDetector* intranet_redirect_detector();
90  virtual const std::string& GetApplicationLocale();
91  virtual void SetApplicationLocale(const std::string& locale);
92  virtual DownloadStatusUpdater* download_status_updater();
93  virtual base::WaitableEvent* shutdown_event();
94  virtual TabCloseableStateWatcher* tab_closeable_state_watcher();
95  virtual safe_browsing::ClientSideDetectionService*
96      safe_browsing_detection_service();
97  virtual bool plugin_finder_disabled() const;
98
99  // NotificationObserver methods
100  virtual void Observe(NotificationType type,
101                       const NotificationSource& source,
102                       const NotificationDetails& details);
103
104#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
105  virtual void StartAutoupdateTimer();
106#endif
107
108  virtual ChromeNetLog* net_log();
109
110#if defined(IPC_MESSAGE_LOG_ENABLED)
111  virtual void SetIPCLoggingEnabled(bool enable);
112#endif
113
114 private:
115  void ClearLocalState(const FilePath& profile_path);
116  bool ShouldClearLocalState(FilePath* profile_path);
117
118  void CreateResourceDispatcherHost();
119  void CreateMetricsService();
120
121  void CreateIOThread();
122  static void CleanupOnIOThread();
123
124  void WaitForPluginDataRemoverToFinish();
125
126  void CreateFileThread();
127  void CreateDBThread();
128  void CreateProcessLauncherThread();
129  void CreateCacheThread();
130  void CreateGpuThread();
131  void CreateWatchdogThread();
132  void CreateTemplateURLModel();
133  void CreateProfileManager();
134  void CreateWebDataService();
135  void CreateLocalState();
136  void CreateViewedPageTracker();
137  void CreateIconManager();
138  void CreateDevToolsManager();
139  void CreateSidebarManager();
140  void CreateGoogleURLTracker();
141  void CreateIntranetRedirectDetector();
142  void CreateNotificationUIManager();
143  void CreateStatusTrayManager();
144  void CreateTabCloseableStateWatcher();
145  void CreatePrintPreviewTabController();
146  void CreateSafeBrowsingDetectionService();
147
148  bool IsSafeBrowsingDetectionServiceEnabled();
149
150  void ApplyDisabledSchemesPolicy();
151
152#if defined(IPC_MESSAGE_LOG_ENABLED)
153  void SetIPCLoggingEnabledForChildProcesses(bool enabled);
154#endif
155
156  bool created_resource_dispatcher_host_;
157  scoped_ptr<ResourceDispatcherHost> resource_dispatcher_host_;
158
159  bool created_metrics_service_;
160  scoped_ptr<MetricsService> metrics_service_;
161
162  bool created_io_thread_;
163  scoped_ptr<IOThread> io_thread_;
164#if defined(USE_X11)
165  // This shares a created flag with the IO thread.
166  scoped_ptr<base::Thread> background_x11_thread_;
167#endif
168
169  bool created_file_thread_;
170  scoped_ptr<base::Thread> file_thread_;
171
172  bool created_db_thread_;
173  scoped_ptr<base::Thread> db_thread_;
174
175  bool created_process_launcher_thread_;
176  scoped_ptr<base::Thread> process_launcher_thread_;
177
178  bool created_cache_thread_;
179  scoped_ptr<base::Thread> cache_thread_;
180
181  bool created_gpu_thread_;
182  scoped_ptr<base::Thread> gpu_thread_;
183
184  bool created_watchdog_thread_;
185  scoped_ptr<WatchDogThread> watchdog_thread_;
186
187  bool created_profile_manager_;
188  scoped_ptr<ProfileManager> profile_manager_;
189
190  bool created_local_state_;
191  scoped_ptr<PrefService> local_state_;
192
193  bool created_icon_manager_;
194  scoped_ptr<IconManager> icon_manager_;
195
196  scoped_refptr<ExtensionEventRouterForwarder>
197      extension_event_router_forwarder_;
198
199  scoped_refptr<DevToolsHttpProtocolHandler> devtools_http_handler_;
200
201  scoped_refptr<DevToolsProtocolHandler> devtools_legacy_handler_;
202
203  bool created_devtools_manager_;
204  scoped_refptr<DevToolsManager> devtools_manager_;
205
206  bool created_sidebar_manager_;
207  scoped_refptr<SidebarManager> sidebar_manager_;
208
209  bool created_browser_policy_connector_;
210  scoped_ptr<policy::BrowserPolicyConnector> browser_policy_connector_;
211
212  scoped_refptr<printing::PrintPreviewTabController>
213      print_preview_tab_controller_;
214
215  scoped_ptr<ui::Clipboard> clipboard_;
216
217  // Manager for desktop notification UI.
218  bool created_notification_ui_manager_;
219  scoped_ptr<NotificationUIManager> notification_ui_manager_;
220
221  scoped_ptr<AutomationProviderList> automation_provider_list_;
222
223  scoped_ptr<GoogleURLTracker> google_url_tracker_;
224  scoped_ptr<IntranetRedirectDetector> intranet_redirect_detector_;
225
226  scoped_ptr<NotificationService> main_notification_service_;
227
228  scoped_ptr<TabCloseableStateWatcher> tab_closeable_state_watcher_;
229
230  bool created_safe_browsing_detection_service_;
231  scoped_ptr<safe_browsing::ClientSideDetectionService>
232     safe_browsing_detection_service_;
233
234  unsigned int module_ref_count_;
235  bool did_start_;
236
237  // Ensures that all the print jobs are finished before closing the browser.
238  scoped_ptr<printing::PrintJobManager> print_job_manager_;
239
240  std::string locale_;
241
242  bool checked_for_new_frames_;
243  bool using_new_frames_;
244
245  // This service just sits around and makes thumbnails for tabs. It does
246  // nothing in the constructor so we don't have to worry about lazy init.
247  ThumbnailGenerator thumbnail_generator_;
248
249  // Download status updates (like a changing application icon on dock/taskbar)
250  // are global per-application. DownloadStatusUpdater does no work in the ctor
251  // so we don't have to worry about lazy initialization.
252  DownloadStatusUpdater download_status_updater_;
253
254  // An event that notifies when we are shutting-down.
255  scoped_ptr<base::WaitableEvent> shutdown_event_;
256
257  // Ensures that the observers of plugin/print disable/enable state
258  // notifications are properly added and removed.
259  PrefChangeRegistrar pref_change_registrar_;
260
261  // Lives here so can safely log events on shutdown.
262  scoped_ptr<ChromeNetLog> net_log_;
263
264  NotificationRegistrar notification_registrar_;
265  scoped_refptr<PluginDataRemover> plugin_data_remover_;
266
267  // Monitors the state of the 'DisablePluginFinder' policy.
268  BooleanPrefMember plugin_finder_disabled_pref_;
269
270  // Monitors the list of disabled schemes policy.
271  ListPrefMember disabled_schemes_pref_;
272
273#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
274  base::RepeatingTimer<BrowserProcessImpl> autoupdate_timer_;
275
276  // Gets called by autoupdate timer to see if browser needs restart and can be
277  // restarted, and if that's the case, restarts the browser.
278  void OnAutoupdateTimer();
279  bool CanAutorestartForUpdate() const;
280  void RestartPersistentInstance();
281#endif  // defined(OS_WIN) || defined(OS_LINUX)
282
283#if defined(OS_CHROMEOS)
284  scoped_refptr<chromeos::ProxyConfigServiceImpl>
285      chromeos_proxy_config_service_impl_;
286#endif
287
288  DISALLOW_COPY_AND_ASSIGN(BrowserProcessImpl);
289};
290
291#endif  // CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_
292