13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process_impl.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/synchronization/waitable_event.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/task.h" 143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/automation/automation_provider_list.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_main.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process_sub_thread.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_trial.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/debugger/browser_list_tabcontents_provider.h" 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/debugger/devtools_http_protocol_handler.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_manager.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/debugger/devtools_protocol_handler.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_file_manager.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/save_file_manager.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/extensions/extension_event_router_forwarder.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_tab_id_map.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/user_script_listener.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/first_run/upgrade_util.h" 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/google/google_url_tracker.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/gpu_process_host_ui_shim.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/icon_manager.h" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/intranet_redirect_detector.h" 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/io_thread.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/metrics/metrics_service.h" 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/metrics/thread_watcher.h" 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/net/chrome_net_log.h" 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/predictor_api.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/sdch_dictionary_fetcher.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/notifications/notification_ui_manager.h" 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/platform_util.h" 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/plugin_data_remover.h" 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/plugin_updater.h" 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/browser_policy_connector.h" 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/printing/print_job_manager.h" 474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/printing/print_preview_tab_controller.h" 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile_manager.h" 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/safe_browsing/client_side_detection_service.h" 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/safe_browsing/safe_browsing_service.h" 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/shell_integration.h" 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sidebar/sidebar_manager.h" 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_closeable_state_watcher.h" 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h" 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h" 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_l10n_util.h" 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/extensions/extension_resource.h" 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/json_pref_store.h" 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/switch_utils.h" 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/url_constants.h" 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/installer/util/google_update_constants.h" 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_child_process_host.h" 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/child_process_security_policy.h" 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/plugin_service.h" 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h" 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_dispatcher_host.h" 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_logging.h" 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/url_request/url_request_context_getter.h" 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/clipboard/clipboard.h" 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/database/database_tracker.h" 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/view_storage.h" 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(IPC_MESSAGE_LOG_ENABLED) 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/child_process_messages.h" 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/proxy_config_service_impl.h" 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // defined(OS_CHROMEOS) 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// How often to check if the persistent instance of Chrome needs to restart 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to install an update. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kUpdateCheckIntervalHours = 6; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_X11) 973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// How long to wait for the File thread to complete during EndSession, on 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Linux. We have a timeout here because we're unable to run the UI messageloop 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// and there's some deadlock risk. Our only option is to exit anyway. 1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic const int kEndSessionTimeoutSeconds = 10; 1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserProcessImpl::BrowserProcessImpl(const CommandLine& command_line) 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : created_resource_dispatcher_host_(false), 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_metrics_service_(false), 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_io_thread_(false), 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_file_thread_(false), 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_db_thread_(false), 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_process_launcher_thread_(false), 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_cache_thread_(false), 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen created_gpu_thread_(false), 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen created_watchdog_thread_(false), 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_profile_manager_(false), 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_local_state_(false), 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_icon_manager_(false), 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_devtools_manager_(false), 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick created_sidebar_manager_(false), 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen created_browser_policy_connector_(false), 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_notification_ui_manager_(false), 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen created_safe_browsing_detection_service_(false), 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch module_ref_count_(0), 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch did_start_(false), 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch checked_for_new_frames_(false), 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen using_new_frames_(false) { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process = this; 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen clipboard_.reset(new ui::Clipboard); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch main_notification_service_.reset(new NotificationService); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen notification_registrar_.Add(this, 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationType::APP_TERMINATING, 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationService::AllSources()); 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Must be created after the NotificationService. 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch print_job_manager_.reset(new printing::PrintJobManager); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch shutdown_event_.reset(new base::WaitableEvent(true, false)); 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen net_log_.reset(new ChromeNetLog); 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extension_event_router_forwarder_ = new ExtensionEventRouterForwarder; 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionTabIdMap::GetInstance()->Init(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBrowserProcessImpl::~BrowserProcessImpl() { 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath profile_path; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool clear_local_state_on_exit; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Store the profile path for clearing local state data on exit. 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch clear_local_state_on_exit = ShouldClearLocalState(&profile_path); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete the AutomationProviderList before NotificationService, 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // since it may try to unregister notifications 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Both NotificationService and AutomationProvider are singleton instances in 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the BrowserProcess. Since AutomationProvider may have some active 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification observers, it is essential that it gets destroyed before the 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NotificationService. NotificationService won't be destroyed until after 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this destructor is run. 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch automation_provider_list_.reset(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to shutdown the SdchDictionaryFetcher as it regularly holds 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a pointer to a URLFetcher, and that URLFetcher (upon destruction) will do 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a PostDelayedTask onto the IO thread. This shutdown call will both discard 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // any pending URLFetchers, and avoid creating any more. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SdchDictionaryFetcher::Shutdown(); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We need to destroy the MetricsService, GoogleURLTracker, 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // IntranetRedirectDetector, and SafeBrowsing ClientSideDetectionService 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // before the io_thread_ gets destroyed, since their destructors can call the 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // URLFetcher destructor, which does a PostDelayedTask operation on the IO 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // thread. (The IO thread will handle that URLFetcher operation before going 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // away.) 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch metrics_service_.reset(); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch google_url_tracker_.reset(); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch intranet_redirect_detector_.reset(); 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_detection_service_.reset(); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Need to clear the desktop notification balloons before the io_thread_ and 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // before the profiles, since if there are any still showing we will access 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // those things during teardown. 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_ui_manager_.reset(); 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to clear profiles (download managers) before the io_thread_. 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_manager_.reset(); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Debugger must be cleaned up before IO thread and NotificationService. 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (devtools_http_handler_.get()) { 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_http_handler_->Stop(); 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_http_handler_ = NULL; 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (devtools_legacy_handler_.get()) { 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_legacy_handler_->Stop(); 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_legacy_handler_ = NULL; 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (resource_dispatcher_host_.get()) { 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to tell Safe Browsing Service that the IO thread is going away 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // since it cached a pointer to it. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (resource_dispatcher_host()->safe_browsing_service()) 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host()->safe_browsing_service()->ShutDown(); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Cancel pending requests and prevent new requests. 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host()->Shutdown(); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ExtensionTabIdMap::GetInstance()->Shutdown(); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // The policy providers managed by |browser_policy_connector_| need to shut 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // down while the IO and FILE threads are still alive. 210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen browser_policy_connector_.reset(); 2113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(USE_X11) 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The IO thread must outlive the BACKGROUND_X11 thread. 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_x11_thread_.reset(); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Wait for removing plugin data to finish before shutting down the IO thread. 21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WaitForPluginDataRemoverToFinish(); 21921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Destroying the GpuProcessHostUIShims on the UI thread posts a task to 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // delete related objects on the GPU thread. This must be done before 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // stopping the GPU thread. The GPU thread will close IPC channels to renderer 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // processes so this has to happen before stopping the IO thread. 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GpuProcessHostUIShim::DestroyAll(); 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gpu_thread_.reset(); 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to stop io_thread_ before resource_dispatcher_host_, since 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // io_thread_ may still deref ResourceDispatcherHost and handle resource 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // request before going away. 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_.reset(); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The IO thread was the only user of this thread. 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache_thread_.reset(); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Stop the process launcher thread after the IO thread, in case the IO thread 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // posted a task to terminate a process on the process launcher thread. 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_launcher_thread_.reset(); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Clean up state that lives on the file_thread_ before it goes away. 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (resource_dispatcher_host_.get()) { 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host()->download_file_manager()->Shutdown(); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host()->save_file_manager()->Shutdown(); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to stop the file_thread_ here to force it to process messages in its 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // message loop from the previous call to shutdown the DownloadFileManager, 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SaveFileManager and SessionService. 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_thread_.reset(); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // With the file_thread_ flushed, we can release any icon resources. 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_manager_.reset(); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Need to destroy ResourceDispatcherHost before PluginService and 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // SafeBrowsingService, since it caches a pointer to it. This also 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // causes the webkit thread to terminate. 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host_.reset(); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Wait for the pending print jobs to finish. 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch print_job_manager_->OnQuit(); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch print_job_manager_.reset(); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Destroy TabCloseableStateWatcher before NotificationService since the 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // former registers for notifications. 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_closeable_state_watcher_.reset(); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now OK to destroy NotificationService. 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch main_notification_service_.reset(); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Prior to clearing local state, we want to complete tasks pending 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the db thread too. 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_thread_.reset(); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Stop the watchdog thread after stopping other threads. 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen watchdog_thread_.reset(); 275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // At this point, no render process exist and the file, io, db, and 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // webkit threads in this process have all terminated, so it's safe 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to access local state data such as cookies, database, or local storage. 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (clear_local_state_on_exit) 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClearLocalState(profile_path); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_browser_process = NULL; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Send a QuitTask to the given MessageLoop. 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void PostQuit(MessageLoop* message_loop) { 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask()); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(USE_X11) 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstatic void Signal(base::WaitableEvent* event) { 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick event->Signal(); 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochunsigned int BrowserProcessImpl::AddRefModule() { 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(CalledOnValidThread()); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch did_start_ = true; 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch module_ref_count_++; 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return module_ref_count_; 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochunsigned int BrowserProcessImpl::ReleaseModule() { 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(CalledOnValidThread()); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK_NE(0u, module_ref_count_); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch module_ref_count_--; 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (0 == module_ref_count_) { 30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Allow UI and IO threads to do blocking IO on shutdown, since we do a lot 30921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // of it on shutdown for valid reasons. 31021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::ThreadRestrictions::SetIOAllowed(true); 31121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen io_thread()->message_loop()->PostTask( 31221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FROM_HERE, 31321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NewRunnableFunction(&base::ThreadRestrictions::SetIOAllowed, true)); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask( 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, NewRunnableFunction(DidEndMainMessageLoop)); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Quit(); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return module_ref_count_; 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::EndSession() { 3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) || defined(USE_X11) 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify we are going away. 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick shutdown_event_->Signal(); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Mark all the profiles as clean. 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ProfileManager* pm = profile_manager(); 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<Profile*> profiles(pm->GetLoadedProfiles()); 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < profiles.size(); ++i) 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profiles[i]->MarkAsCleanShutdown(); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tell the metrics service it was cleanly shutdown. 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MetricsService* metrics = g_browser_process->metrics_service(); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (metrics && local_state()) { 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch metrics->RecordStartOfSessionEnd(); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MetricsService lazily writes to prefs, force it to write now. 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch local_state()->SavePersistentPrefs(); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We must write that the profile and metrics service shutdown cleanly, 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // otherwise on startup we'll think we crashed. So we block until done and 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // then proceed with normal shutdown. 3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_X11) 3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Can't run a local loop on linux. Instead create a waitable event. 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::WaitableEvent done_writing(false, false); 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NewRunnableFunction(Signal, &done_writing)); 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick done_writing.TimedWait( 3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::TimeDelta::FromSeconds(kEndSessionTimeoutSeconds)); 3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_WIN) 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableFunction(PostQuit, MessageLoop::current())); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTIMPLEMENTED(); 3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickResourceDispatcherHost* BrowserProcessImpl::resource_dispatcher_host() { 3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_resource_dispatcher_host_) 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateResourceDispatcherHost(); 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return resource_dispatcher_host_.get(); 3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickMetricsService* BrowserProcessImpl::metrics_service() { 3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_metrics_service_) 3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateMetricsService(); 3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return metrics_service_.get(); 3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIOThread* BrowserProcessImpl::io_thread() { 3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_io_thread_) 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateIOThread(); 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return io_thread_.get(); 3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::Thread* BrowserProcessImpl::file_thread() { 3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_file_thread_) 3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateFileThread(); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return file_thread_.get(); 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::Thread* BrowserProcessImpl::db_thread() { 3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_db_thread_) 3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateDBThread(); 3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return db_thread_.get(); 3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::Thread* BrowserProcessImpl::process_launcher_thread() { 3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_process_launcher_thread_) 3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateProcessLauncherThread(); 4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return process_launcher_thread_.get(); 4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::Thread* BrowserProcessImpl::cache_thread() { 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_cache_thread_) 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateCacheThread(); 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return cache_thread_.get(); 4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbase::Thread* BrowserProcessImpl::gpu_thread() { 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(CalledOnValidThread()); 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!created_gpu_thread_) 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreateGpuThread(); 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gpu_thread_.get(); 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_X11) 4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::Thread* BrowserProcessImpl::background_x11_thread() { 4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The BACKGROUND_X11 thread is created when the IO thread is created. 4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_io_thread_) 4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateIOThread(); 4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return background_x11_thread_.get(); 4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 427dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenWatchDogThread* BrowserProcessImpl::watchdog_thread() { 428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(CalledOnValidThread()); 429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!created_watchdog_thread_) 430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CreateWatchdogThread(); 431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(watchdog_thread_.get() != NULL); 432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return watchdog_thread_.get(); 433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickProfileManager* BrowserProcessImpl::profile_manager() { 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_profile_manager_) 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateProfileManager(); 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return profile_manager_.get(); 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPrefService* BrowserProcessImpl::local_state() { 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_local_state_) 4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateLocalState(); 4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return local_state_.get(); 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickDevToolsManager* BrowserProcessImpl::devtools_manager() { 4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_devtools_manager_) 4523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateDevToolsManager(); 4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return devtools_manager_.get(); 4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickSidebarManager* BrowserProcessImpl::sidebar_manager() { 4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_sidebar_manager_) 4593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateSidebarManager(); 4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return sidebar_manager_.get(); 4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::Clipboard* BrowserProcessImpl::clipboard() { 4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return clipboard_.get(); 4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennet::URLRequestContextGetter* BrowserProcessImpl::system_request_context() { 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(CalledOnValidThread()); 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return io_thread()->system_url_request_context_getter(); 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenchromeos::ProxyConfigServiceImpl* 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBrowserProcessImpl::chromeos_proxy_config_service_impl() { 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(CalledOnValidThread()); 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!chromeos_proxy_config_service_impl_) { 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos_proxy_config_service_impl_ = 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::ProxyConfigServiceImpl(); 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return chromeos_proxy_config_service_impl_; 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // defined(OS_CHROMEOS) 484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 485dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionEventRouterForwarder* 486dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBrowserProcessImpl::extension_event_router_forwarder() { 487dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return extension_event_router_forwarder_.get(); 488dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickNotificationUIManager* BrowserProcessImpl::notification_ui_manager() { 4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_notification_ui_manager_) 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateNotificationUIManager(); 4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return notification_ui_manager_.get(); 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenpolicy::BrowserPolicyConnector* BrowserProcessImpl::browser_policy_connector() { 4983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen DCHECK(CalledOnValidThread()); 499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!created_browser_policy_connector_) { 500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(browser_policy_connector_.get() == NULL); 501dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen created_browser_policy_connector_ = true; 502dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen browser_policy_connector_.reset(new policy::BrowserPolicyConnector()); 5033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen } 504dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return browser_policy_connector_.get(); 5053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen} 5063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIconManager* BrowserProcessImpl::icon_manager() { 5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!created_icon_manager_) 5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateIconManager(); 5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return icon_manager_.get(); 5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickThumbnailGenerator* BrowserProcessImpl::GetThumbnailGenerator() { 5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return &thumbnail_generator_; 5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickAutomationProviderList* BrowserProcessImpl::InitAutomationProviderList() { 5193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (automation_provider_list_.get() == NULL) { 5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick automation_provider_list_.reset(AutomationProviderList::GetInstance()); 5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return automation_provider_list_.get(); 5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BrowserProcessImpl::InitDevToolsHttpProtocolHandler( 52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& ip, 52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int port, 52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& frontend_url) { 53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(CalledOnValidThread()); 53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_http_handler_ = 53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DevToolsHttpProtocolHandler::Start(ip, 53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen port, 53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen frontend_url, 53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new BrowserListTabContentsProvider()); 53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BrowserProcessImpl::InitDevToolsLegacyProtocolHandler(int port) { 5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen devtools_legacy_handler_ = DevToolsProtocolHandler::Start(port); 5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool BrowserProcessImpl::IsShuttingDown() { 5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return did_start_ && 0 == module_ref_count_; 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochprinting::PrintJobManager* BrowserProcessImpl::print_job_manager() { 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(abarth): DCHECK(CalledOnValidThread()); 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // http://code.google.com/p/chromium/issues/detail?id=6828 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // print_job_manager_ is initialized in the constructor and destroyed in the 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // destructor, so it should always be valid. 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(print_job_manager_.get()); 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return print_job_manager_.get(); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochprinting::PrintPreviewTabController* 5584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BrowserProcessImpl::print_preview_tab_controller() { 5594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(CalledOnValidThread()); 5604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!print_preview_tab_controller_.get()) 5614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch CreatePrintPreviewTabController(); 5624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return print_preview_tab_controller_.get(); 5634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 5644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickGoogleURLTracker* BrowserProcessImpl::google_url_tracker() { 5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!google_url_tracker_.get()) 5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateGoogleURLTracker(); 5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return google_url_tracker_.get(); 5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIntranetRedirectDetector* BrowserProcessImpl::intranet_redirect_detector() { 5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!intranet_redirect_detector_.get()) 5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateIntranetRedirectDetector(); 5763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return intranet_redirect_detector_.get(); 5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst std::string& BrowserProcessImpl::GetApplicationLocale() { 5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(!locale_.empty()); 5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return locale_; 5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BrowserProcessImpl::SetApplicationLocale(const std::string& locale) { 5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick locale_ = locale; 5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick extension_l10n_util::SetProcessLocale(locale); 5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickDownloadStatusUpdater* BrowserProcessImpl::download_status_updater() { 5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return &download_status_updater_; 5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::WaitableEvent* BrowserProcessImpl::shutdown_event() { 5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return shutdown_event_.get(); 5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTabCloseableStateWatcher* BrowserProcessImpl::tab_closeable_state_watcher() { 5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(CalledOnValidThread()); 5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!tab_closeable_state_watcher_.get()) 6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CreateTabCloseableStateWatcher(); 6013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return tab_closeable_state_watcher_.get(); 6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 60421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsensafe_browsing::ClientSideDetectionService* 60521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BrowserProcessImpl::safe_browsing_detection_service() { 60621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(CalledOnValidThread()); 60721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!created_safe_browsing_detection_service_) { 60821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CreateSafeBrowsingDetectionService(); 60921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 61021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return safe_browsing_detection_service_.get(); 61121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 61221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 613dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool BrowserProcessImpl::plugin_finder_disabled() const { 614dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return *plugin_finder_disabled_pref_; 615dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 616dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 61721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid BrowserProcessImpl::Observe(NotificationType type, 61821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationSource& source, 61921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const NotificationDetails& details) { 62021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (type == NotificationType::APP_TERMINATING) { 62121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile = ProfileManager::GetDefaultProfile(); 62221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (profile) { 62321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefService* prefs = profile->GetPrefs(); 62472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (prefs->GetBoolean(prefs::kClearSiteDataOnExit) && 62521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen local_state()->GetBoolean(prefs::kClearPluginLSODataEnabled)) { 62621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen plugin_data_remover_ = new PluginDataRemover(); 62772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!plugin_data_remover_mime_type().empty()) 62872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen plugin_data_remover_->set_mime_type(plugin_data_remover_mime_type()); 62972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen plugin_data_remover_->StartRemoving(base::Time()); 63021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 63121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 63272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (type == NotificationType::PREF_CHANGED) { 63372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string* pref = Details<std::string>(details).ptr(); 63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (*pref == prefs::kDefaultBrowserSettingEnabled) { 63572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) 63672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ShellIntegration::SetAsDefaultBrowser(); 637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (*pref == prefs::kDisabledSchemes) { 638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ApplyDisabledSchemesPolicy(); 63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 64021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else { 64121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED(); 64221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 64321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 64421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 64521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid BrowserProcessImpl::WaitForPluginDataRemoverToFinish() { 64672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (plugin_data_remover_.get()) 64772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen plugin_data_remover_->Wait(); 64821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 64921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BrowserProcessImpl::StartAutoupdateTimer() { 6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick autoupdate_timer_.Start( 6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::TimeDelta::FromHours(kUpdateCheckIntervalHours), 6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick this, 6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &BrowserProcessImpl::OnAutoupdateTimer); 6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 65972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenChromeNetLog* BrowserProcessImpl::net_log() { 66072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return net_log_.get(); 66172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 66272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::ClearLocalState(const FilePath& profile_path) { 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch webkit_database::DatabaseTracker::ClearLocalState(profile_path); 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserProcessImpl::ShouldClearLocalState(FilePath* profile_path) { 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath user_data_dir; 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile; 670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check for the existence of a profile manager. When quitting early, 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // e.g. because another chrome instance is running, or when invoked with 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // options such as --uninstall or --try-chrome-again=0, the profile manager 674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // does not exist yet. 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!profile_manager_.get()) 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile = profile_manager_->GetDefaultProfile(user_data_dir); 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!profile) 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *profile_path = profile->GetPath(); 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return profile->GetPrefs()->GetBoolean(prefs::kClearSiteDataOnExit); 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateResourceDispatcherHost() { 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_resource_dispatcher_host_ && 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host_.get() == NULL); 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_resource_dispatcher_host_ = true; 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // UserScriptListener will delete itself. 692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ResourceQueue::DelegateSet resource_queue_delegates; 693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resource_queue_delegates.insert(new UserScriptListener()); 694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resource_dispatcher_host_.reset( 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new ResourceDispatcherHost(resource_queue_delegates)); 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch resource_dispatcher_host_->Initialize(); 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateMetricsService() { 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_metrics_service_ && metrics_service_.get() == NULL); 702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_metrics_service_ = true; 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch metrics_service_.reset(new MetricsService); 705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateIOThread() { 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_io_thread_ && io_thread_.get() == NULL); 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_io_thread_ = true; 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Prior to starting the io thread, we create the plugin service as 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // it is predominantly used from the io thread, but must be created 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the main thread. The service ctor is inexpensive and does not 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // invoke the io_thread() accessor. 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PluginService::GetInstance(); 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(USE_X11) 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The lifetime of the BACKGROUND_X11 thread is a subset of the IO thread so 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we start it now. 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> background_x11_thread( 721731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new BrowserProcessSubThread(BrowserThread::BACKGROUND_X11)); 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!background_x11_thread->Start()) 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch background_x11_thread_.swap(background_x11_thread); 725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 727dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<IOThread> thread(new IOThread( 728dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state(), net_log_.get(), extension_event_router_forwarder_.get())); 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options options; 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch options.message_loop_type = MessageLoop::TYPE_IO; 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!thread->StartWithOptions(options)) 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_.swap(thread); 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateFileThread() { 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_file_thread_ && file_thread_.get() == NULL); 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_file_thread_ = true; 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> thread( 741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new BrowserProcessSubThread(BrowserThread::FILE)); 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options options; 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On Windows, the FILE thread needs to be have a UI message loop which pumps 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // messages in such a way that Google Update can communicate back to us. 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch options.message_loop_type = MessageLoop::TYPE_UI; 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch options.message_loop_type = MessageLoop::TYPE_IO; 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!thread->StartWithOptions(options)) 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_thread_.swap(thread); 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateDBThread() { 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_db_thread_ && db_thread_.get() == NULL); 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_db_thread_ = true; 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> thread( 760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new BrowserProcessSubThread(BrowserThread::DB)); 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!thread->Start()) 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_thread_.swap(thread); 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateProcessLauncherThread() { 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_process_launcher_thread_ && !process_launcher_thread_.get()); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_process_launcher_thread_ = true; 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> thread( 771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new BrowserProcessSubThread(BrowserThread::PROCESS_LAUNCHER)); 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!thread->Start()) 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch process_launcher_thread_.swap(thread); 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateCacheThread() { 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_cache_thread_ && !cache_thread_.get()); 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_cache_thread_ = true; 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> thread( 782513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new BrowserThread(BrowserThread::CACHE)); 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Thread::Options options; 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch options.message_loop_type = MessageLoop::TYPE_IO; 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!thread->StartWithOptions(options)) 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cache_thread_.swap(thread); 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserProcessImpl::CreateGpuThread() { 791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!created_gpu_thread_ && !gpu_thread_.get()); 792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen created_gpu_thread_ = true; 793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<base::Thread> thread(new BrowserThread(BrowserThread::GPU)); 795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Thread::Options options; 797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_WIN) 798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // On Windows the GPU thread needs to pump the compositor child window's 799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // message loop. TODO(apatrick): make this an IO thread if / when we get rid 800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // of this child window. Unfortunately it might always be necessary for 801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Windows XP because we cannot share the backing store textures between 802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // processes. 803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen options.message_loop_type = MessageLoop::TYPE_UI; 804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else 805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen options.message_loop_type = MessageLoop::TYPE_IO; 806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!thread->StartWithOptions(options)) 809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gpu_thread_.swap(thread); 811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 813dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid BrowserProcessImpl::CreateWatchdogThread() { 814dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!created_watchdog_thread_ && watchdog_thread_.get() == NULL); 815dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen created_watchdog_thread_ = true; 816dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 817dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<WatchDogThread> thread(new WatchDogThread()); 818dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!thread->Start()) 819dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 820dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen watchdog_thread_.swap(thread); 821dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 822dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateProfileManager() { 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_profile_manager_ && profile_manager_.get() == NULL); 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_profile_manager_ = true; 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_manager_.reset(new ProfileManager()); 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateLocalState() { 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_local_state_ && local_state_.get() == NULL); 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_local_state_ = true; 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath local_state_path; 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path); 83621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen local_state_.reset( 83721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PrefService::CreatePrefService(local_state_path, NULL, NULL)); 8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 839731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick pref_change_registrar_.Init(local_state_.get()); 840731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Make sure the the plugin updater gets notifications of changes 842dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // in the plugin policy lists. 843dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state_->RegisterListPref(prefs::kPluginsDisabledPlugins); 844dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pref_change_registrar_.Add(prefs::kPluginsDisabledPlugins, 845dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen PluginUpdater::GetInstance()); 846dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state_->RegisterListPref(prefs::kPluginsDisabledPluginsExceptions); 847dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pref_change_registrar_.Add(prefs::kPluginsDisabledPluginsExceptions, 848dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen PluginUpdater::GetInstance()); 849dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state_->RegisterListPref(prefs::kPluginsEnabledPlugins); 850dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen pref_change_registrar_.Add(prefs::kPluginsEnabledPlugins, 85121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PluginUpdater::GetInstance()); 852731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 853731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Initialize and set up notifications for the printing enabled 854731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // preference. 855731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick local_state_->RegisterBooleanPref(prefs::kPrintingEnabled, true); 856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool printing_enabled = 857731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick local_state_->GetBoolean(prefs::kPrintingEnabled); 858731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick print_job_manager_->set_printing_enabled(printing_enabled); 859731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick pref_change_registrar_.Add(prefs::kPrintingEnabled, 860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick print_job_manager_.get()); 86172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 86272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Initialize the notification for the default browser setting policy. 86372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen local_state_->RegisterBooleanPref(prefs::kDefaultBrowserSettingEnabled, 86472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false); 86572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (local_state_->IsManagedPreference(prefs::kDefaultBrowserSettingEnabled)) { 86672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) 86772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ShellIntegration::SetAsDefaultBrowser(); 86872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 86972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen pref_change_registrar_.Add(prefs::kDefaultBrowserSettingEnabled, this); 870dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 871dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Initialize the preference for the plugin finder policy. 872dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // This preference is only needed on the IO thread so make it available there. 873dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state_->RegisterBooleanPref(prefs::kDisablePluginFinder, false); 874dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen plugin_finder_disabled_pref_.Init(prefs::kDisablePluginFinder, 875dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen local_state_.get(), NULL); 876dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen plugin_finder_disabled_pref_.MoveToThread(BrowserThread::IO); 877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initialize the preference for the disabled schemes policy, and 879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // load the initial policy on startup. 880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen local_state_->RegisterListPref(prefs::kDisabledSchemes); 881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen disabled_schemes_pref_.Init(prefs::kDisabledSchemes, local_state_.get(), 882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this); 883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ApplyDisabledSchemesPolicy(); 8843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateIconManager() { 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!created_icon_manager_ && icon_manager_.get() == NULL); 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_icon_manager_ = true; 889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch icon_manager_.reset(new IconManager); 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateDevToolsManager() { 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(devtools_manager_.get() == NULL); 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_devtools_manager_ = true; 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch devtools_manager_ = new DevToolsManager(); 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BrowserProcessImpl::CreateSidebarManager() { 8993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(sidebar_manager_.get() == NULL); 9003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick created_sidebar_manager_ = true; 9013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sidebar_manager_ = new SidebarManager(); 9023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateGoogleURLTracker() { 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(google_url_tracker_.get() == NULL); 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<GoogleURLTracker> google_url_tracker(new GoogleURLTracker); 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch google_url_tracker_.swap(google_url_tracker); 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateIntranetRedirectDetector() { 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(intranet_redirect_detector_.get() == NULL); 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<IntranetRedirectDetector> intranet_redirect_detector( 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new IntranetRedirectDetector); 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch intranet_redirect_detector_.swap(intranet_redirect_detector); 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateNotificationUIManager() { 918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(notification_ui_manager_.get() == NULL); 9193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen notification_ui_manager_.reset(NotificationUIManager::Create(local_state())); 9203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch created_notification_ui_manager_ = true; 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::CreateTabCloseableStateWatcher() { 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(tab_closeable_state_watcher_.get() == NULL); 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_closeable_state_watcher_.reset(TabCloseableStateWatcher::Create()); 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid BrowserProcessImpl::CreatePrintPreviewTabController() { 9304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK(print_preview_tab_controller_.get() == NULL); 9314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch print_preview_tab_controller_ = new printing::PrintPreviewTabController(); 9324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 9334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 93421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid BrowserProcessImpl::CreateSafeBrowsingDetectionService() { 93521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(safe_browsing_detection_service_.get() == NULL); 93621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Set this flag to true so that we don't retry indefinitely to 93721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // create the service class if there was an error. 93821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen created_safe_browsing_detection_service_ = true; 93921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 94021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen FilePath model_file_path; 94121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Profile* profile = profile_manager() ? 94221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile_manager()->GetDefaultProfile() : NULL; 94321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (IsSafeBrowsingDetectionServiceEnabled() && 94421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PathService::Get(chrome::DIR_USER_DATA, &model_file_path) && 94521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile && profile->GetRequestContext()) { 94621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen safe_browsing_detection_service_.reset( 94721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen safe_browsing::ClientSideDetectionService::Create( 94821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen model_file_path.Append(chrome::kSafeBrowsingPhishingModelFilename), 94921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen profile->GetRequestContext())); 95021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 95121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 95221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 95321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool BrowserProcessImpl::IsSafeBrowsingDetectionServiceEnabled() { 95421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // The safe browsing client-side detection is enabled only if the switch is 95572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // enabled and when safe browsing related stats is allowed to be collected. 956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // For now we only enable client-side detection on the canary, dev and beta 957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // channel. 958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifdef OS_CHROMEOS 959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else 961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string channel = platform_util::GetVersionStringModifier(); 962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return !CommandLine::ForCurrentProcess()->HasSwitch( 963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen switches::kDisableClientSidePhishingDetection) && 96472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen resource_dispatcher_host()->safe_browsing_service() && 965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resource_dispatcher_host()->safe_browsing_service()->CanReportStats() && 966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(noelutz): use platform_util::GetChannel() once it has been 967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // pushed to the release branch. 968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (channel == "beta" || channel == "dev" || channel == "canary" || 969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen channel == "beta-m" || channel == "dev-m" || channel == "canary-m"); 970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserProcessImpl::ApplyDisabledSchemesPolicy() { 975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<std::string> schemes; 976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (ListValue::const_iterator iter = (*disabled_schemes_pref_)->begin(); 977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != (*disabled_schemes_pref_)->end(); ++iter) { 978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string scheme; 979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ((*iter)->GetAsString(&scheme)) 980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen schemes.insert(scheme); 981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChildProcessSecurityPolicy::GetInstance()->RegisterDisabledSchemes(schemes); 98321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 98421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The BrowserProcess object must outlive the file thread so we use traits 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// which don't do any management. 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDISABLE_RUNNABLE_METHOD_REFCOUNT(BrowserProcessImpl); 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(IPC_MESSAGE_LOG_ENABLED) 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::SetIPCLoggingEnabled(bool enable) { 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First enable myself. 993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (enable) 99421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Logging::GetInstance()->Enable(); 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 99621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IPC::Logging::GetInstance()->Disable(); 997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now tell subprocesses. Messages to ChildProcess-derived 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // processes must be done on the IO thread. 1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread()->message_loop()->PostTask 1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (FROM_HERE, 1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, 1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &BrowserProcessImpl::SetIPCLoggingEnabledForChildProcesses, 1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enable)); 1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Finally, tell the renderers which don't derive from ChildProcess. 1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Messages to the renderers must be done on the UI (main) thread. 1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator()); 1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !i.IsAtEnd(); i.Advance()) 1011dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i.GetCurrentValue()->Send(new ChildProcessMsg_SetIPCLoggingEnabled(enable)); 1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper for SetIPCLoggingEnabled. 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::SetIPCLoggingEnabledForChildProcesses(bool enabled) { 1016731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserChildProcessHost::Iterator i; // default constr references a singleton 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (!i.Done()) { 1020dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i->Send(new ChildProcessMsg_SetIPCLoggingEnabled(enabled)); 1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++i; 1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // IPC_MESSAGE_LOG_ENABLED 1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Mac is currently not supported. 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserProcessImpl::CanAutorestartForUpdate() const { 1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check if browser is in the background and if it needs to be restarted to 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // apply a pending update. 10333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return BrowserList::size() == 0 && BrowserList::WillKeepAlive() && 1034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen upgrade_util::IsUpdatePendingRestart(); 1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Switches to add when auto-restarting Chrome. 10383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSwitchesToAddOnAutorestart[] = { 10393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick switches::kNoStartupWindow 1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::RestartPersistentInstance() { 1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine* old_cl = CommandLine::ForCurrentProcess(); 1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<CommandLine> new_cl(new CommandLine(old_cl->GetProgram())); 1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::map<std::string, CommandLine::StringType> switches = 1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_cl->GetSwitches(); 1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick switches::RemoveSwitchesForAutostart(&switches); 1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Append the rest of the switches (along with their values, if any) 1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to the new command line 1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::map<std::string, CommandLine::StringType>::const_iterator i = 1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switches.begin(); i != switches.end(); ++i) { 1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine::StringType switch_value = i->second; 1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (switch_value.length() > 0) { 10573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new_cl->AppendSwitchNative(i->first, i->second); 1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new_cl->AppendSwitch(i->first); 1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ensure that our desired switches are set on the new process. 10643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t i = 0; i < arraysize(kSwitchesToAddOnAutorestart); ++i) { 10653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!new_cl->HasSwitch(kSwitchesToAddOnAutorestart[i])) 10663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new_cl->AppendSwitch(kSwitchesToAddOnAutorestart[i]); 10673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DLOG(WARNING) << "Shutting down current instance of the browser."; 1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserList::CloseAllBrowsersAndExit(); 1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Transfer ownership to Upgrade. 1073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen upgrade_util::SetNewCommandLine(new_cl.release()); 1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BrowserProcessImpl::OnAutoupdateTimer() { 1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (CanAutorestartForUpdate()) { 1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DLOG(WARNING) << "Detected update. Restarting browser."; 1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RestartPersistentInstance(); 1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 1084