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