// Copyright (c) 2006-2008 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__ #include #include "base/basictypes.h" #include "base/command_line.h" #include "base/message_loop.h" #include "base/non_thread_safe.h" #include "base/ref_counted.h" #include "base/scoped_ptr.h" #include "chrome/browser/automation/automation_provider_list.h" #include "chrome/browser/browser_process.h" #if defined(OS_WIN) #include "sandbox/src/sandbox.h" #else #include "chrome/common/temp_scaffolding_stubs.h" #endif class CommandLine; class NotificationService; // Real implementation of BrowserProcess that creates and returns the services. class BrowserProcessImpl : public BrowserProcess, public NonThreadSafe { public: BrowserProcessImpl(const CommandLine& command_line); virtual ~BrowserProcessImpl(); virtual void EndSession(); virtual ResourceDispatcherHost* resource_dispatcher_host() { DCHECK(CalledOnValidThread()); if (!created_resource_dispatcher_host_) CreateResourceDispatcherHost(); return resource_dispatcher_host_.get(); } virtual MetricsService* metrics_service() { DCHECK(CalledOnValidThread()); if (!created_metrics_service_) CreateMetricsService(); return metrics_service_.get(); } virtual base::Thread* io_thread() { DCHECK(CalledOnValidThread()); if (!created_io_thread_) CreateIOThread(); return io_thread_.get(); } virtual base::Thread* file_thread() { DCHECK(CalledOnValidThread()); if (!created_file_thread_) CreateFileThread(); return file_thread_.get(); } virtual base::Thread* db_thread() { DCHECK(CalledOnValidThread()); if (!created_db_thread_) CreateDBThread(); return db_thread_.get(); } virtual ProfileManager* profile_manager() { DCHECK(CalledOnValidThread()); if (!created_profile_manager_) CreateProfileManager(); return profile_manager_.get(); } virtual PrefService* local_state() { DCHECK(CalledOnValidThread()); if (!created_local_state_) CreateLocalState(); return local_state_.get(); } virtual sandbox::BrokerServices* broker_services() { // TODO(abarth): DCHECK(CalledOnValidThread()); // See . if (!initialized_broker_services_) return NULL; return broker_services_; } virtual DebuggerWrapper* debugger_wrapper() { DCHECK(CalledOnValidThread()); if (!created_debugger_wrapper_) return NULL; return debugger_wrapper_.get(); } virtual DevToolsManager* devtools_manager() { DCHECK(CalledOnValidThread()); if (!created_devtools_manager_) CreateDevToolsManager(); return devtools_manager_.get(); } virtual ClipboardService* clipboard_service() { DCHECK(CalledOnValidThread()); return clipboard_service_.get(); } virtual IconManager* icon_manager() { DCHECK(CalledOnValidThread()); if (!created_icon_manager_) CreateIconManager(); return icon_manager_.get(); } virtual AutomationProviderList* InitAutomationProviderList() { DCHECK(CalledOnValidThread()); if (automation_provider_list_.get() == NULL) { automation_provider_list_.reset(AutomationProviderList::GetInstance()); } return automation_provider_list_.get(); } virtual void InitDebuggerWrapper(int port) { DCHECK(CalledOnValidThread()); if (!created_debugger_wrapper_) CreateDebuggerWrapper(port); } virtual unsigned int AddRefModule() { DCHECK(CalledOnValidThread()); module_ref_count_++; return module_ref_count_; } virtual unsigned int ReleaseModule() { DCHECK(CalledOnValidThread()); DCHECK(0 != module_ref_count_); module_ref_count_--; if (0 == module_ref_count_) { MessageLoop::current()->Quit(); } return module_ref_count_; } virtual bool IsShuttingDown() { DCHECK(CalledOnValidThread()); return 0 == module_ref_count_; } virtual views::AcceleratorHandler* accelerator_handler() { DCHECK(CalledOnValidThread()); if (!accelerator_handler_.get()) CreateAcceleratorHandler(); return accelerator_handler_.get(); } virtual printing::PrintJobManager* print_job_manager(); virtual GoogleURLTracker* google_url_tracker() { DCHECK(CalledOnValidThread()); if (!google_url_tracker_.get()) CreateGoogleURLTracker(); return google_url_tracker_.get(); } virtual const std::wstring& GetApplicationLocale(); virtual MemoryModel memory_model() { DCHECK(CalledOnValidThread()); return memory_model_; } virtual base::WaitableEvent* shutdown_event() { return shutdown_event_.get(); } private: void CreateResourceDispatcherHost(); void CreatePrefService(); void CreateMetricsService(); void CreateIOThread(); void CreateFileThread(); void CreateDBThread(); void CreateSafeBrowsingThread(); void CreateTemplateURLModel(); void CreateProfileManager(); void CreateWebDataService(); void CreateLocalState(); void CreateViewedPageTracker(); void CreateIconManager(); void CreateDebuggerWrapper(int port); void CreateDevToolsManager(); void CreateAcceleratorHandler(); void CreateGoogleURLTracker(); void InitBrokerServices(sandbox::BrokerServices* broker_services); bool created_resource_dispatcher_host_; scoped_ptr resource_dispatcher_host_; bool created_metrics_service_; scoped_ptr metrics_service_; bool created_io_thread_; scoped_ptr io_thread_; bool created_file_thread_; scoped_ptr file_thread_; bool created_db_thread_; scoped_ptr db_thread_; bool created_profile_manager_; scoped_ptr profile_manager_; bool created_local_state_; scoped_ptr local_state_; bool initialized_broker_services_; sandbox::BrokerServices* broker_services_; bool created_icon_manager_; scoped_ptr icon_manager_; bool created_debugger_wrapper_; scoped_refptr debugger_wrapper_; bool created_devtools_manager_; scoped_ptr devtools_manager_; scoped_ptr clipboard_service_; scoped_ptr automation_provider_list_; scoped_ptr accelerator_handler_; scoped_ptr google_url_tracker_; scoped_ptr main_notification_service_; unsigned int module_ref_count_; // Ensures that all the print jobs are finished before closing the browser. scoped_ptr print_job_manager_; std::wstring locale_; MemoryModel memory_model_; bool checked_for_new_frames_; bool using_new_frames_; // An event that notifies when we are shutting-down. scoped_ptr shutdown_event_; DISALLOW_EVIL_CONSTRUCTORS(BrowserProcessImpl); }; #endif // CHROME_BROWSER_BROWSER_PROCESS_IMPL_H__