15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/alias.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/json_pref_store.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/automation/automation_provider_list.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_mode_manager.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_configurator.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/component_updater/pnacl/pnacl_component_installer.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/remote_debugging_server.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_request_limiter.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_status_updater.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/event_router_forwarder.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_renderer_state.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/upgrade_util.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/gpu/gl_string_manager.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/gpu/gpu_mode_manager.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/icon_manager.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/idle.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/intranet_redirect_detector.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/io_thread.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/metrics_service.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/thread_watcher.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/metrics/variations/variations_service.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/chrome_net_log.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/crl_set_fetcher.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/sdch_dictionary_fetcher.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/notifications/notification_ui_manager.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_finder.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_service.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/chrome_pref_service_factory.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_tracker.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/background_printing_manager.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_manager.h" 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_service.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/shell_integration.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_tray.h" 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/storage_monitor/storage_monitor.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/thumbnails/render_widget_snapshot_taker.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_prompt_controller.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/web_resource/promo_resource_service.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/common/extensions/chrome_extensions_client.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_l10n_util.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/switch_utils.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_constants.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h" 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_manager.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/policy/policy_service_stub.h" 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(ENABLE_CONFIGURATION_POLICY) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_mac.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_ANDROID) && !defined(OS_IOS) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h" 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PLUGIN_INSTALLATION) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/plugins_resource_service.h" 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media/webrtc_log_uploader.h" 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How often to check if the persistent instance of Chrome needs to restart 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to install an update. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kUpdateCheckIntervalHours = 6; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attest to the fact that the call to the file thread to save preferences has 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run, and it is safe to terminate. This avoids the potential of some other 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// task prematurely terminating our waiting message loop by posting a 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// QuitTask(). 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool g_end_session_file_thread_has_completed = false; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long to wait for the File thread to complete during EndSession, on 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Linux. We have a timeout here because we're unable to run the UI messageloop 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and there's some deadlock risk. Our only option is to exit anyway. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kEndSessionTimeoutSeconds = 10; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ChildProcessSecurityPolicy; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceDispatcherHost; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserProcessImpl::BrowserProcessImpl( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SequencedTaskRunner* local_state_task_runner, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CommandLine& command_line) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : created_metrics_service_(false), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_watchdog_thread_(false), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_browser_policy_connector_(false), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_profile_manager_(false), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_local_state_(false), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_icon_manager_(false), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_notification_ui_manager_(false), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_safe_browsing_service_(false), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_ref_count_(0), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_(false), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_new_frames_(false), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using_new_frames_(false), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_widget_snapshot_taker_(new RenderWidgetSnapshotTaker), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_status_updater_(new DownloadStatusUpdater), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state_task_runner_(local_state_task_runner) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process = this; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) platform_part_.reset(new BrowserProcessPlatformPart()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be created after the NotificationService. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_job_manager_.reset(new printing::PrintJobManager); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net_log_.reset(new ChromeNetLog); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::kExtensionScheme); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kExtensionResourceScheme); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme( 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::kChromeSearchScheme); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitIdleMonitor(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch extensions::ExtensionsClient::Set( 1864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch extensions::ChromeExtensionsClient::GetInstance()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_event_router_forwarder_ = new extensions::EventRouterForwarder; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionRendererState::GetInstance()->Init(); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Initialize(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserProcessImpl::~BrowserProcessImpl() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_objects::ThreadData::EnsureCleanupWasCalled(4); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_browser_process = NULL; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::StartTearDown() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_AUTOMATION) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the AutomationProviderList before NotificationService, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since it may try to unregister notifications 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both NotificationService and AutomationProvider are singleton instances in 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the BrowserProcess. Since AutomationProvider may have some active 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification observers, it is essential that it gets destroyed before the 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NotificationService. NotificationService won't be destroyed until after 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this destructor is run. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) automation_provider_list_.reset(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to shutdown the SdchDictionaryFetcher as it regularly holds 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a pointer to a URLFetcher, and that URLFetcher (upon destruction) will do 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a PostDelayedTask onto the IO thread. This shutdown call will both discard 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any pending URLFetchers, and avoid creating any more. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&SdchDictionaryFetcher::Shutdown)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to destroy the MetricsService, VariationsService, 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IntranetRedirectDetector, PromoResourceService, and SafeBrowsing 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ClientSideDetectionService (owned by the SafeBrowsingService) before the 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // io_thread_ gets destroyed, since their destructors can call the URLFetcher 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destructor, which does a PostDelayedTask operation on the IO thread. (The 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IO thread will handle that URLFetcher operation before going away.) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metrics_service_.reset(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variations_service_.reset(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intranet_redirect_detector_.reset(); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (safe_browsing_service_.get()) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_service()->ShutDown(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to clear the desktop notification balloons before the io_thread_ and 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the profiles, since if there are any still showing we will access 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those things during teardown. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ui_manager_.reset(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Need to clear profiles (download managers) before the io_thread_. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.reset(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Debugger must be cleaned up before IO thread and NotificationService. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remote_debugging_server_.reset(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionRendererState::GetInstance()->Shutdown(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_ANDROID) && !defined(OS_IOS) 248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch media_file_system_registry_.reset(); 249ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Delete |storage_monitor_| now. Otherwise the FILE thread would be gone 250ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // when we try to release it in the dtor and Valgrind would report a 251ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // leak on almost every single browser_test. 252ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // TODO(gbillock): Make this unnecessary. 253ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage_monitor_.reset(); 254ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 255ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_center::MessageCenter::Shutdown(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The policy providers managed by |browser_policy_connector_| need to shut 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // down while the IO and FILE threads are still alive. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_policy_connector_) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_policy_connector_->Shutdown(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop the watchdog thread before stopping other threads. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watchdog_thread_.reset(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete aura after the metrics service has been deleted as it accesses 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // monitor information. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Env::DeleteInstance(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) platform_part()->StartTearDown(); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::PostDestroyThreads() { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // With the file_thread_ flushed, we can release any icon resources. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_manager_.reset(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset associated state right after actual thread is stopped, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as io_thread_.global_ cleanup happens in CleanUp on the IO 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread, i.e. as the thread exits its message loop. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is important also because in various places, the 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IOThread object being NULL is considered synonymous with the 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IO thread having stopped. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread_.reset(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send a QuitTask to the given MessageLoop when the (file) thread has processed 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our (other) recent requests (to save preferences). 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change the boolean so that the receiving thread will know that we did indeed 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// send the QuitTask that terminated the message loop. 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static void PostQuit(base::MessageLoop* message_loop) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_end_session_file_thread_has_completed = true; 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void Signal(base::WaitableEvent* event) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->Signal(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int BrowserProcessImpl::AddRefModule() { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CHECK(!IsShuttingDown()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsShuttingDown()) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the stacktrace which released the final reference onto our stack so 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it will be available in the crash report for inspection. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::StackTrace callstack = release_last_reference_callstack_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::debug::Alias(&callstack); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(false); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_start_ = true; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_ref_count_++; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return module_ref_count_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int BrowserProcessImpl::ReleaseModule() { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(0u, module_ref_count_); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_ref_count_--; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 == module_ref_count_) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) release_last_reference_callstack_ = base::debug::StackTrace(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the pending print jobs to finish. Don't do this later, since 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this might cause a nested message loop to run, and we don't want pending 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tasks to run once teardown has started. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_job_manager_->OnQuit(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_job_manager_.reset(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CHECK(base::MessageLoop::current()->is_running()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(ChromeBrowserMainPartsMac::DidEndMainMessageLoop)); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return module_ref_count_; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::EndSession() { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark all the profiles as clean. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileManager* pm = profile_manager(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Profile*> profiles(pm->GetLoadedProfiles()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < profiles.size(); ++i) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profiles[i]->SetExitType(Profile::EXIT_SESSION_ENDED); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the metrics service it was cleanly shutdown. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetricsService* metrics = g_browser_process->metrics_service(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metrics && local_state()) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metrics->RecordStartOfSessionEnd(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MetricsService lazily writes to prefs, force it to write now. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_state()->CommitPendingWrite(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/125207 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowWait allow_wait; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We must write that the profile and metrics service shutdown cleanly, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise on startup we'll think we crashed. So we block until done and 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // then proceed with normal shutdown. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't run a local loop on linux. Instead create a waitable event. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::WaitableEvent> done_writing( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::WaitableEvent(false, false)); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(Signal, done_writing.get())); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If all file writes haven't cleared in the timeout, leak the WaitableEvent 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that there's no race to reference it in Signal(). 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!done_writing->TimedWait( 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromSeconds(kEndSessionTimeoutSeconds))) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(done_writing.release()); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(PostQuit, base::MessageLoop::current())); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int quits_received = 0; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++quits_received; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (!g_end_session_file_thread_has_completed); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we did get extra quits, then we should re-post them to the message loop. 39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) while (--quits_received > 0) { 39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::QuitClosure()); 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MetricsService* BrowserProcessImpl::metrics_service() { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_metrics_service_) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateMetricsService(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return metrics_service_.get(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IOThread* BrowserProcessImpl::io_thread() { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(io_thread_.get()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_thread_.get(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WatchDogThread* BrowserProcessImpl::watchdog_thread() { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_watchdog_thread_) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateWatchdogThread(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(watchdog_thread_.get() != NULL); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return watchdog_thread_.get(); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProfileManager* BrowserProcessImpl::profile_manager() { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_profile_manager_) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateProfileManager(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return profile_manager_.get(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefService* BrowserProcessImpl::local_state() { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_local_state_) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLocalState(); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return local_state_.get(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::URLRequestContextGetter* BrowserProcessImpl::system_request_context() { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_thread()->system_url_request_context_getter(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome_variations::VariationsService* BrowserProcessImpl::variations_service() { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!variations_service_.get()) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) variations_service_.reset( 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome_variations::VariationsService::Create(local_state())); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return variations_service_.get(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BrowserProcessPlatformPart* BrowserProcessImpl::platform_part() { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return platform_part_.get(); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extensions::EventRouterForwarder* 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserProcessImpl::extension_event_router_forwarder() { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension_event_router_forwarder_.get(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NotificationUIManager* BrowserProcessImpl::notification_ui_manager() { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_notification_ui_manager_) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNotificationUIManager(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification_ui_manager_.get(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)message_center::MessageCenter* BrowserProcessImpl::message_center() { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return message_center::MessageCenter::Get(); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)policy::BrowserPolicyConnector* BrowserProcessImpl::browser_policy_connector() { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_browser_policy_connector_) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!browser_policy_connector_); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_policy_connector_.reset(new policy::BrowserPolicyConnector()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_browser_policy_connector_ = true; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_policy_connector_.get(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)policy::PolicyService* BrowserProcessImpl::policy_service() { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_policy_connector()->GetPolicyService(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!policy_service_.get()) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) policy_service_.reset(new policy::PolicyServiceStub()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return policy_service_.get(); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IconManager* BrowserProcessImpl::icon_manager() { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_icon_manager_) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateIconManager(); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return icon_manager_.get(); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GLStringManager* BrowserProcessImpl::gl_string_manager() { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gl_string_manager_.get()) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_string_manager_.reset(new GLStringManager()); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_string_manager_.get(); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuModeManager* BrowserProcessImpl::gpu_mode_manager() { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(CalledOnValidThread()); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_mode_manager_.get()) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_mode_manager_.reset(new GpuModeManager()); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gpu_mode_manager_.get(); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetSnapshotTaker* BrowserProcessImpl::GetRenderWidgetSnapshotTaker() { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return render_widget_snapshot_taker_.get(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationProviderList* BrowserProcessImpl::GetAutomationProviderList() { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_AUTOMATION) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (automation_provider_list_.get() == NULL) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) automation_provider_list_.reset(new AutomationProviderList()); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return automation_provider_list_.get(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateDevToolsHttpProtocolHandler( 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HostDesktopType host_desktop_type, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& ip, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int port, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& frontend_url) { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StartupBrowserCreator::LaunchBrowser can be run multiple times when browser 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is started with several profiles or existing browser process is reused. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!remote_debugging_server_.get()) { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remote_debugging_server_.reset( 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new RemoteDebuggingServer(host_desktop_type, ip, port, 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frontend_url)); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserProcessImpl::IsShuttingDown() { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return did_start_ && 0 == module_ref_count_; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::PrintJobManager* BrowserProcessImpl::print_job_manager() { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abarth): DCHECK(CalledOnValidThread()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=6828 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // print_job_manager_ is initialized in the constructor and destroyed in the 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor, so it should always be valid. 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(print_job_manager_.get()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return print_job_manager_.get(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)printing::PrintPreviewDialogController* 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserProcessImpl::print_preview_dialog_controller() { 566a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!print_preview_dialog_controller_.get()) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreatePrintPreviewDialogController(); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return print_preview_dialog_controller_.get(); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::BackgroundPrintingManager* 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserProcessImpl::background_printing_manager() { 579a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!background_printing_manager_.get()) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBackgroundPrintingManager(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return background_printing_manager_.get(); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IntranetRedirectDetector* BrowserProcessImpl::intranet_redirect_detector() { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!intranet_redirect_detector_.get()) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateIntranetRedirectDetector(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return intranet_redirect_detector_.get(); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& BrowserProcessImpl::GetApplicationLocale() { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!locale_.empty()); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return locale_; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::SetApplicationLocale(const std::string& locale) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locale_ = locale; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::SetProcessLocale(locale); 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::ChromeContentBrowserClient::SetApplicationLocale(locale); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadStatusUpdater* BrowserProcessImpl::download_status_updater() { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return download_status_updater_.get(); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkPromptController* BrowserProcessImpl::bookmark_prompt_controller() { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bookmark_prompt_controller_.get(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochchrome::StorageMonitor* BrowserProcessImpl::storage_monitor() { 621ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) || defined(OS_IOS) 622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return NULL; 623ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#else 624ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return storage_monitor_.get(); 625ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 626ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 627ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 628ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid BrowserProcessImpl::set_storage_monitor_for_test( 629ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<chrome::StorageMonitor> monitor) { 630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_ANDROID) && !defined(OS_IOS) 631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage_monitor_ = monitor.Pass(); 632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chrome::MediaFileSystemRegistry* 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BrowserProcessImpl::media_file_system_registry() { 637ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_ANDROID) || defined(OS_IOS) 638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!media_file_system_registry_) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media_file_system_registry_.reset(new chrome::MediaFileSystemRegistry()); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return media_file_system_registry_.get(); 643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool BrowserProcessImpl::created_local_state() const { 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return created_local_state_; 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_WEBRTC) 651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)WebRtcLogUploader* BrowserProcessImpl::webrtc_log_uploader() { 652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!webrtc_log_uploader_.get()) 653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) webrtc_log_uploader_.reset(new WebRtcLogUploader()); 654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return webrtc_log_uploader_.get(); 655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserProcessImpl::RegisterPrefs(PrefRegistrySimple* registry) { 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kDefaultBrowserSettingEnabled, 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This policy needs to be defined before the net subsystem is initialized, 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so we do it here. 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kMaxConnectionsPerProxy, 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) net::kDefaultMaxSocketsPerProxyServer); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kAllowCrossOriginAuthPrompt, false); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_IOS) 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kEulaAccepted, false); 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_IOS) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::win::GetVersion() >= base::win::VERSION_WIN8) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kRestartSwitchMode, false); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(brettw,*): this comment about ResourceBundle was here since 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initial commit. This comment seems unrelated, bit-rotten and 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a candidate for removal. 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initialize ResourceBundle which handles files loaded from external 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // sources. This has to be done before uninstall code path and before prefs 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are registered. 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterStringPref(prefs::kApplicationLocale, std::string()); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterStringPref(prefs::kOwnerLocale, std::string()); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterStringPref(prefs::kHardwareKeyboardLayout, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string()); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref( 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kMetricsReportingEnabled, 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GoogleUpdateSettings::GetCollectStatsConsent()); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // !defined(OS_CHROMEOS) 694b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 695b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if defined(OS_ANDROID) 696b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) registry->RegisterBooleanPref( 697b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) prefs::kCrashReportingEnabled, false); 698a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif // defined(OS_ANDROID) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DownloadRequestLimiter* BrowserProcessImpl::download_request_limiter() { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!download_request_limiter_.get()) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) download_request_limiter_ = new DownloadRequestLimiter(); 705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return download_request_limiter_.get(); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BackgroundModeManager* BrowserProcessImpl::background_mode_manager() { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_BACKGROUND) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!background_mode_manager_.get()) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateBackgroundModeManager(); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return background_mode_manager_.get(); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid BrowserProcessImpl::set_background_mode_manager_for_test( 721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<BackgroundModeManager> manager) { 722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_mode_manager_ = manager.Pass(); 723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)StatusTray* BrowserProcessImpl::status_tray() { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!status_tray_.get()) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStatusTray(); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return status_tray_.get(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SafeBrowsingService* BrowserProcessImpl::safe_browsing_service() { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!created_safe_browsing_service_) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSafeBrowsingService(); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return safe_browsing_service_.get(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)safe_browsing::ClientSideDetectionService* 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserProcessImpl::safe_browsing_detection_service() { 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CalledOnValidThread()); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (safe_browsing_service()) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return safe_browsing_service()->safe_browsing_detection_service(); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::StartAutoupdateTimer() { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autoupdate_timer_.Start(FROM_HERE, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromHours(kUpdateCheckIntervalHours), 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &BrowserProcessImpl::OnAutoupdateTimer); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeNetLog* BrowserProcessImpl::net_log() { 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net_log_.get(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)prerender::PrerenderTracker* BrowserProcessImpl::prerender_tracker() { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prerender_tracker_.get()) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prerender_tracker_.reset(new prerender::PrerenderTracker); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prerender_tracker_.get(); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ComponentUpdateService* BrowserProcessImpl::component_updater() { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!component_updater_.get()) { 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ComponentUpdateService::Configurator* configurator = 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MakeChromeComponentUpdaterConfigurator( 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess(), 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io_thread()->system_url_request_context_getter()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creating the component updater does not do anything, components 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to be registered and Start() needs to be called. 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) component_updater_.reset(ComponentUpdateServiceFactory(configurator)); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return component_updater_.get(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CRLSetFetcher* BrowserProcessImpl::crl_set_fetcher() { 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!crl_set_fetcher_.get()) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crl_set_fetcher_ = new CRLSetFetcher(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return crl_set_fetcher_.get(); 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PnaclComponentInstaller* BrowserProcessImpl::pnacl_component_installer() { 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!pnacl_component_installer_.get()) 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pnacl_component_installer_.reset(new PnaclComponentInstaller()); 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return pnacl_component_installer_.get(); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::ResourceDispatcherHostCreated() { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_dispatcher_host_delegate_.reset( 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeResourceDispatcherHostDelegate(prerender_tracker())); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHost::Get()->SetDelegate( 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource_dispatcher_host_delegate_.get()); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_change_registrar_.Add( 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kAllowCrossOriginAuthPrompt, 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&BrowserProcessImpl::ApplyAllowCrossOriginAuthPromptPolicy, 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ApplyAllowCrossOriginAuthPromptPolicy(); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateMetricsService() { 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!created_metrics_service_ && metrics_service_.get() == NULL); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_metrics_service_ = true; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metrics_service_.reset(new MetricsService); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateWatchdogThread() { 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!created_watchdog_thread_ && watchdog_thread_.get() == NULL); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_watchdog_thread_ = true; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WatchDogThread> thread(new WatchDogThread()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread->Start()) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) watchdog_thread_.swap(thread); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateProfileManager() { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!created_profile_manager_ && profile_manager_.get() == NULL); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_profile_manager_ = true; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath user_data_dir; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DATA, &user_data_dir); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.reset(new ProfileManager(user_data_dir)); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateLocalState() { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!created_local_state_ && local_state_.get() == NULL); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_local_state_ = true; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath local_state_path; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path)); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PrefRegistrySimple> pref_registry = new PrefRegistrySimple; 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Register local state preferences. 841868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) chrome::RegisterLocalState(pref_registry.get()); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state_.reset( 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome_prefs::CreateLocalState(local_state_path, 845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) local_state_task_runner_.get(), 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) policy_service(), 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_registry, 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false)); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_change_registrar_.Init(local_state_.get()); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the notification for the default browser setting policy. 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_change_registrar_.Add( 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kDefaultBrowserSettingEnabled, 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&BrowserProcessImpl::ApplyDefaultBrowserPolicy, 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_per_proxy = local_state_->GetInteger(prefs::kMaxConnectionsPerProxy); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ClientSocketPoolManager::set_max_sockets_per_proxy_server( 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::NORMAL_SOCKET_POOL, 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(std::min(max_per_proxy, 99), 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ClientSocketPoolManager::max_sockets_per_group( 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpNetworkSession::NORMAL_SOCKET_POOL))); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::PreCreateThreads() { 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) io_thread_.reset(new IOThread(local_state(), policy_service(), net_log_.get(), 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extension_event_router_forwarder_.get())); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::PreMainMessageLoopRun() { 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_CONFIGURATION_POLICY) 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // browser_policy_connector() is created very early because local_state() 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needs policy to be initialized with the managed preference values. 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // However, policy fetches from the network and loading of disk caches 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // requires that threads are running; this Init() call lets the connector 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resume its initialization now that the loops are spinning and the 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // system request context is available for the fetchers. 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_policy_connector()->Init(local_state(), system_request_context()); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (local_state_->IsManagedPreference(prefs::kDefaultBrowserSettingEnabled)) 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ApplyDefaultBrowserPolicy(); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginService* plugin_service = PluginService::GetInstance(); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_service->SetFilter(ChromePluginServiceFilter::GetInstance()); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_service->StartWatchingPlugins(); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also find plugins in a user-specific plugins dir, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // e.g. ~/.config/chromium/Plugins. 8947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); 8957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!cmd_line.HasSwitch(switches::kDisablePluginsDiscovery)) { 8967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::FilePath user_data_dir; 8977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) 8987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin_service->AddExtraPluginDir(user_data_dir.Append("Plugins")); 8997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Triggers initialization of the singleton instance on UI thread. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginFinder::GetInstance()->Init(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PLUGIN_INSTALLATION) 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!plugins_resource_service_.get()); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins_resource_service_ = new PluginsResourceService(local_state()); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugins_resource_service_->Init(); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_PLUGINS) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_line.HasSwitch(switches::kDisableWebResources)) { 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!promo_resource_service_.get()); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) promo_resource_service_ = new PromoResourceService; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) promo_resource_service_->StartAfterDelay(); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_defaults::bookmarks_enabled && 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BookmarkPromptController::IsEnabled()) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_prompt_controller_.reset(new BookmarkPromptController()); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if !defined(OS_ANDROID) && !defined(OS_IOS) 927ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch storage_monitor_.reset(chrome::StorageMonitor::Create()); 928ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif 929ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) platform_part_->PreMainMessageLoopRun(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateIconManager() { 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!created_icon_manager_ && icon_manager_.get() == NULL); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_icon_manager_ = true; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_manager_.reset(new IconManager); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateIntranetRedirectDetector() { 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(intranet_redirect_detector_.get() == NULL); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IntranetRedirectDetector> intranet_redirect_detector( 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new IntranetRedirectDetector); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intranet_redirect_detector_.swap(intranet_redirect_detector); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateNotificationUIManager() { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_NOTIFICATIONS) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(notification_ui_manager_.get() == NULL); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification_ui_manager_.reset(NotificationUIManager::Create(local_state())); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_notification_ui_manager_ = true; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateBackgroundModeManager() { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(background_mode_manager_.get() == NULL); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) background_mode_manager_.reset( 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new BackgroundModeManager(CommandLine::ForCurrentProcess(), 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_manager()->GetProfileInfoCache())); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateStatusTray() { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(status_tray_.get() == NULL); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_tray_.reset(StatusTray::Create()); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserProcessImpl::CreatePrintPreviewDialogController() { 967a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(print_preview_dialog_controller_.get() == NULL); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_dialog_controller_ = 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new printing::PrintPreviewDialogController(); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateBackgroundPrintingManager() { 977a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(background_printing_manager_.get() == NULL); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) background_printing_manager_.reset(new printing::BackgroundPrintingManager()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::CreateSafeBrowsingService() { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(safe_browsing_service_.get() == NULL); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set this flag to true so that we don't retry indefinitely to 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create the service class if there was an error. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) created_safe_browsing_service_ = true; 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING) || defined(MOBILE_SAFE_BROWSING) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_service_ = SafeBrowsingService::CreateSafeBrowsingService(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) safe_browsing_service_->Initialize(); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::ApplyDefaultBrowserPolicy() { 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (local_state()->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<ShellIntegration::DefaultWebClientWorker> 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_browser_worker = new ShellIntegration::DefaultBrowserWorker(NULL); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_browser_worker->StartSetAsDefault(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::ApplyAllowCrossOriginAuthPromptPolicy() { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value = local_state()->GetBoolean(prefs::kAllowCrossOriginAuthPrompt); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceDispatcherHost::Get()->SetAllowCrossOriginAuthPrompt(value); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mac is currently not supported. 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserProcessImpl::CanAutorestartForUpdate() const { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check if browser is in the background and if it needs to be restarted to 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apply a pending update. 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return chrome::GetTotalBrowserCount() == 0 && chrome::WillKeepAlive() && 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upgrade_util::IsUpdatePendingRestart(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Switches to add when auto-restarting Chrome. 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kSwitchesToAddOnAutorestart[] = { 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kNoStartupWindow 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::RestartBackgroundInstance() { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* old_cl = CommandLine::ForCurrentProcess(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<CommandLine> new_cl(new CommandLine(old_cl->GetProgram())); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, CommandLine::StringType> switches = 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_cl->GetSwitches(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::RemoveSwitchesForAutostart(&switches); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append the rest of the switches (along with their values, if any) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the new command line 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::map<std::string, CommandLine::StringType>::const_iterator i = 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches.begin(); i != switches.end(); ++i) { 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::StringType switch_value = i->second; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (switch_value.length() > 0) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_cl->AppendSwitchNative(i->first, i->second); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_cl->AppendSwitch(i->first); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that our desired switches are set on the new process. 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kSwitchesToAddOnAutorestart); ++i) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_cl->HasSwitch(kSwitchesToAddOnAutorestart[i])) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_cl->AppendSwitch(kSwitchesToAddOnAutorestart[i]); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(WARNING) << "Shutting down current instance of the browser."; 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::AttemptExit(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transfer ownership to Upgrade. 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upgrade_util::SetNewCommandLine(new_cl.release()); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserProcessImpl::OnAutoupdateTimer() { 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CanAutorestartForUpdate()) { 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(WARNING) << "Detected update. Restarting browser."; 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestartBackgroundInstance(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS) 1066