// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// When each service is created, we set a flag indicating this. At this point,
// the service initialization could fail or succeed. This allows us to remember
// if we tried to create a service, and not try creating it over and over if
// the creation failed.
#ifndef CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_
#define CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_
#pragma once
#include <string>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "base/threading/non_thread_safe.h"
#include "base/timer.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_status_updater.h"
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/tab_contents/thumbnail_generator.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
#include "ipc/ipc_message.h"
class ChromeNetLog;
class CommandLine;
class DevToolsHttpProtocolHandler;
class DevToolsProtocolHandler;
class FilePath;
class NotificationService;
class PluginDataRemover;
class TabCloseableStateWatcher;
// Real implementation of BrowserProcess that creates and returns the services.
class BrowserProcessImpl : public BrowserProcess,
public base::NonThreadSafe,
public NotificationObserver {
public:
explicit BrowserProcessImpl(const CommandLine& command_line);
virtual ~BrowserProcessImpl();
virtual void EndSession();
// BrowserProcess methods
virtual ResourceDispatcherHost* resource_dispatcher_host();
virtual MetricsService* metrics_service();
virtual IOThread* io_thread();
virtual base::Thread* file_thread();
virtual base::Thread* db_thread();
virtual base::Thread* process_launcher_thread();
virtual base::Thread* cache_thread();
virtual base::Thread* gpu_thread();
#if defined(USE_X11)
virtual base::Thread* background_x11_thread();
#endif
virtual WatchDogThread* watchdog_thread();
virtual ProfileManager* profile_manager();
virtual PrefService* local_state();
virtual DevToolsManager* devtools_manager();
virtual SidebarManager* sidebar_manager();
virtual ui::Clipboard* clipboard();
virtual net::URLRequestContextGetter* system_request_context();
#if defined(OS_CHROMEOS)
virtual chromeos::ProxyConfigServiceImpl*
chromeos_proxy_config_service_impl();
#endif // defined(OS_CHROMEOS)
virtual ExtensionEventRouterForwarder* extension_event_router_forwarder();
virtual NotificationUIManager* notification_ui_manager();
virtual policy::BrowserPolicyConnector* browser_policy_connector();
virtual IconManager* icon_manager();
virtual ThumbnailGenerator* GetThumbnailGenerator();
virtual AutomationProviderList* InitAutomationProviderList();
virtual void InitDevToolsHttpProtocolHandler(
const std::string& ip,
int port,
const std::string& frontend_url);
virtual void InitDevToolsLegacyProtocolHandler(int port);
virtual unsigned int AddRefModule();
virtual unsigned int ReleaseModule();
virtual bool IsShuttingDown();
virtual printing::PrintJobManager* print_job_manager();
virtual printing::PrintPreviewTabController* print_preview_tab_controller();
virtual GoogleURLTracker* google_url_tracker();
virtual IntranetRedirectDetector* intranet_redirect_detector();
virtual const std::string& GetApplicationLocale();
virtual void SetApplicationLocale(const std::string& locale);
virtual DownloadStatusUpdater* download_status_updater();
virtual base::WaitableEvent* shutdown_event();
virtual TabCloseableStateWatcher* tab_closeable_state_watcher();
virtual safe_browsing::ClientSideDetectionService*
safe_browsing_detection_service();
virtual bool plugin_finder_disabled() const;
// NotificationObserver methods
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
virtual void StartAutoupdateTimer();
#endif
virtual ChromeNetLog* net_log();
#if defined(IPC_MESSAGE_LOG_ENABLED)
virtual void SetIPCLoggingEnabled(bool enable);
#endif
private:
void ClearLocalState(const FilePath& profile_path);
bool ShouldClearLocalState(FilePath* profile_path);
void CreateResourceDispatcherHost();
void CreateMetricsService();
void CreateIOThread();
static void CleanupOnIOThread();
void WaitForPluginDataRemoverToFinish();
void CreateFileThread();
void CreateDBThread();
void CreateProcessLauncherThread();
void CreateCacheThread();
void CreateGpuThread();
void CreateWatchdogThread();
void CreateTemplateURLModel();
void CreateProfileManager();
void CreateWebDataService();
void CreateLocalState();
void CreateViewedPageTracker();
void CreateIconManager();
void CreateDevToolsManager();
void CreateSidebarManager();
void CreateGoogleURLTracker();
void CreateIntranetRedirectDetector();
void CreateNotificationUIManager();
void CreateStatusTrayManager();
void CreateTabCloseableStateWatcher();
void CreatePrintPreviewTabController();
void CreateSafeBrowsingDetectionService();
bool IsSafeBrowsingDetectionServiceEnabled();
void ApplyDisabledSchemesPolicy();
#if defined(IPC_MESSAGE_LOG_ENABLED)
void SetIPCLoggingEnabledForChildProcesses(bool enabled);
#endif
bool created_resource_dispatcher_host_;
scoped_ptr<ResourceDispatcherHost> resource_dispatcher_host_;
bool created_metrics_service_;
scoped_ptr<MetricsService> metrics_service_;
bool created_io_thread_;
scoped_ptr<IOThread> io_thread_;
#if defined(USE_X11)
// This shares a created flag with the IO thread.
scoped_ptr<base::Thread> background_x11_thread_;
#endif
bool created_file_thread_;
scoped_ptr<base::Thread> file_thread_;
bool created_db_thread_;
scoped_ptr<base::Thread> db_thread_;
bool created_process_launcher_thread_;
scoped_ptr<base::Thread> process_launcher_thread_;
bool created_cache_thread_;
scoped_ptr<base::Thread> cache_thread_;
bool created_gpu_thread_;
scoped_ptr<base::Thread> gpu_thread_;
bool created_watchdog_thread_;
scoped_ptr<WatchDogThread> watchdog_thread_;
bool created_profile_manager_;
scoped_ptr<ProfileManager> profile_manager_;
bool created_local_state_;
scoped_ptr<PrefService> local_state_;
bool created_icon_manager_;
scoped_ptr<IconManager> icon_manager_;
scoped_refptr<ExtensionEventRouterForwarder>
extension_event_router_forwarder_;
scoped_refptr<DevToolsHttpProtocolHandler> devtools_http_handler_;
scoped_refptr<DevToolsProtocolHandler> devtools_legacy_handler_;
bool created_devtools_manager_;
scoped_refptr<DevToolsManager> devtools_manager_;
bool created_sidebar_manager_;
scoped_refptr<SidebarManager> sidebar_manager_;
bool created_browser_policy_connector_;
scoped_ptr<policy::BrowserPolicyConnector> browser_policy_connector_;
scoped_refptr<printing::PrintPreviewTabController>
print_preview_tab_controller_;
scoped_ptr<ui::Clipboard> clipboard_;
// Manager for desktop notification UI.
bool created_notification_ui_manager_;
scoped_ptr<NotificationUIManager> notification_ui_manager_;
scoped_ptr<AutomationProviderList> automation_provider_list_;
scoped_ptr<GoogleURLTracker> google_url_tracker_;
scoped_ptr<IntranetRedirectDetector> intranet_redirect_detector_;
scoped_ptr<NotificationService> main_notification_service_;
scoped_ptr<TabCloseableStateWatcher> tab_closeable_state_watcher_;
bool created_safe_browsing_detection_service_;
scoped_ptr<safe_browsing::ClientSideDetectionService>
safe_browsing_detection_service_;
unsigned int module_ref_count_;
bool did_start_;
// Ensures that all the print jobs are finished before closing the browser.
scoped_ptr<printing::PrintJobManager> print_job_manager_;
std::string locale_;
bool checked_for_new_frames_;
bool using_new_frames_;
// This service just sits around and makes thumbnails for tabs. It does
// nothing in the constructor so we don't have to worry about lazy init.
ThumbnailGenerator thumbnail_generator_;
// Download status updates (like a changing application icon on dock/taskbar)
// are global per-application. DownloadStatusUpdater does no work in the ctor
// so we don't have to worry about lazy initialization.
DownloadStatusUpdater download_status_updater_;
// An event that notifies when we are shutting-down.
scoped_ptr<base::WaitableEvent> shutdown_event_;
// Ensures that the observers of plugin/print disable/enable state
// notifications are properly added and removed.
PrefChangeRegistrar pref_change_registrar_;
// Lives here so can safely log events on shutdown.
scoped_ptr<ChromeNetLog> net_log_;
NotificationRegistrar notification_registrar_;
scoped_refptr<PluginDataRemover> plugin_data_remover_;
// Monitors the state of the 'DisablePluginFinder' policy.
BooleanPrefMember plugin_finder_disabled_pref_;
// Monitors the list of disabled schemes policy.
ListPrefMember disabled_schemes_pref_;
#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
base::RepeatingTimer<BrowserProcessImpl> autoupdate_timer_;
// Gets called by autoupdate timer to see if browser needs restart and can be
// restarted, and if that's the case, restarts the browser.
void OnAutoupdateTimer();
bool CanAutorestartForUpdate() const;
void RestartPersistentInstance();
#endif // defined(OS_WIN) || defined(OS_LINUX)
#if defined(OS_CHROMEOS)
scoped_refptr<chromeos::ProxyConfigServiceImpl>
chromeos_proxy_config_service_impl_;
#endif
DISALLOW_COPY_AND_ASSIGN(BrowserProcessImpl);
};
#endif // CHROME_BROWSER_BROWSER_PROCESS_IMPL_H_