1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/test/base/testing_browser_process.h"
7 #include "base/prefs/pref_service.h"
8 #include "base/strings/string_util.h"
9 #include "base/time/default_tick_clock.h"
10 #include "build/build_config.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/browser_process_impl.h"
13 #include "chrome/browser/printing/print_job_manager.h"
14 #include "chrome/browser/profiles/profile_manager.h"
15 #include "chrome/test/base/testing_browser_process_platform_part.h"
16 #include "components/network_time/network_time_tracker.h"
17 #include "content/public/browser/notification_service.h"
18 #include "net/url_request/url_request_context_getter.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "ui/message_center/message_center.h"
23 #include "chrome/browser/notifications/notification_ui_manager.h"
24 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
27 #if defined(ENABLE_BACKGROUND)
28 #include "chrome/browser/background/background_mode_manager.h"
31 #if defined(ENABLE_CONFIGURATION_POLICY)
32 #include "components/policy/core/browser/browser_policy_connector.h"
34 #include "components/policy/core/common/policy_service_stub.h"
35 #endif // defined(ENABLE_CONFIGURATION_POLICY)
37 #if defined(ENABLE_EXTENSIONS)
38 #include "chrome/browser/extensions/chrome_extensions_browser_client.h"
39 #include "chrome/browser/media_galleries/media_file_system_registry.h"
40 #include "chrome/browser/ui/apps/chrome_app_window_client.h"
41 #include "components/storage_monitor/storage_monitor.h"
42 #include "components/storage_monitor/test_storage_monitor.h"
45 #if defined(ENABLE_PRINT_PREVIEW)
46 #include "chrome/browser/printing/background_printing_manager.h"
47 #include "chrome/browser/printing/print_preview_dialog_controller.h"
51 TestingBrowserProcess
* TestingBrowserProcess::GetGlobal() {
52 return static_cast<TestingBrowserProcess
*>(g_browser_process
);
56 void TestingBrowserProcess::CreateInstance() {
57 DCHECK(!g_browser_process
);
58 g_browser_process
= new TestingBrowserProcess
;
62 void TestingBrowserProcess::DeleteInstance() {
63 // g_browser_process must be null during its own destruction.
64 BrowserProcess
* browser_process
= g_browser_process
;
65 g_browser_process
= nullptr;
66 delete browser_process
;
69 TestingBrowserProcess::TestingBrowserProcess()
70 : notification_service_(content::NotificationService::Create()),
73 local_state_(nullptr),
75 system_request_context_(nullptr),
76 platform_part_(new TestingBrowserProcessPlatformPart()) {
77 #if defined(ENABLE_EXTENSIONS)
78 extensions_browser_client_
.reset(
79 new extensions::ChromeExtensionsBrowserClient
);
80 extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
81 extensions::ExtensionsBrowserClient::Set(extensions_browser_client_
.get());
85 TestingBrowserProcess::~TestingBrowserProcess() {
86 EXPECT_FALSE(local_state_
);
87 #if defined(ENABLE_CONFIGURATION_POLICY)
88 SetBrowserPolicyConnector(nullptr);
90 #if defined(ENABLE_EXTENSIONS)
91 extensions::ExtensionsBrowserClient::Set(nullptr);
94 // Destructors for some objects owned by TestingBrowserProcess will use
95 // g_browser_process if it is not null, so it must be null before proceeding.
96 DCHECK_EQ(static_cast<BrowserProcess
*>(nullptr), g_browser_process
);
99 void TestingBrowserProcess::ResourceDispatcherHostCreated() {
102 void TestingBrowserProcess::EndSession() {
105 MetricsServicesManager
* TestingBrowserProcess::GetMetricsServicesManager() {
109 metrics::MetricsService
* TestingBrowserProcess::metrics_service() {
113 rappor::RapporService
* TestingBrowserProcess::rappor_service() {
117 IOThread
* TestingBrowserProcess::io_thread() {
121 WatchDogThread
* TestingBrowserProcess::watchdog_thread() {
125 ProfileManager
* TestingBrowserProcess::profile_manager() {
130 return profile_manager_
.get();
134 void TestingBrowserProcess::SetProfileManager(ProfileManager
* profile_manager
) {
136 // NotificationUIManager can contain references to elements in the current
137 // ProfileManager (for example, the MessageCenterSettingsController maintains
138 // a pointer to the ProfileInfoCache). So when we change the ProfileManager
139 // (typically during test shutdown) make sure to reset any objects that might
140 // maintain references to it. See SetLocalState() for a description of a
141 // similar situation.
142 notification_ui_manager_
.reset();
143 profile_manager_
.reset(profile_manager
);
147 PrefService
* TestingBrowserProcess::local_state() {
151 chrome_variations::VariationsService
*
152 TestingBrowserProcess::variations_service() {
156 PromoResourceService
* TestingBrowserProcess::promo_resource_service() {
160 policy::BrowserPolicyConnector
*
161 TestingBrowserProcess::browser_policy_connector() {
162 #if defined(ENABLE_CONFIGURATION_POLICY)
163 if (!browser_policy_connector_
)
164 browser_policy_connector_
= platform_part_
->CreateBrowserPolicyConnector();
165 return browser_policy_connector_
.get();
171 policy::PolicyService
* TestingBrowserProcess::policy_service() {
175 #elif defined(ENABLE_CONFIGURATION_POLICY)
176 return browser_policy_connector()->GetPolicyService();
178 if (!policy_service_
)
179 policy_service_
.reset(new policy::PolicyServiceStub());
180 return policy_service_
.get();
184 IconManager
* TestingBrowserProcess::icon_manager() {
188 GLStringManager
* TestingBrowserProcess::gl_string_manager() {
192 GpuModeManager
* TestingBrowserProcess::gpu_mode_manager() {
196 BackgroundModeManager
* TestingBrowserProcess::background_mode_manager() {
200 void TestingBrowserProcess::set_background_mode_manager_for_test(
201 scoped_ptr
<BackgroundModeManager
> manager
) {
205 StatusTray
* TestingBrowserProcess::status_tray() {
209 SafeBrowsingService
* TestingBrowserProcess::safe_browsing_service() {
214 return sb_service_
.get();
218 safe_browsing::ClientSideDetectionService
*
219 TestingBrowserProcess::safe_browsing_detection_service() {
223 net::URLRequestContextGetter
* TestingBrowserProcess::system_request_context() {
224 return system_request_context_
;
227 BrowserProcessPlatformPart
* TestingBrowserProcess::platform_part() {
228 return platform_part_
.get();
231 extensions::EventRouterForwarder
*
232 TestingBrowserProcess::extension_event_router_forwarder() {
236 NotificationUIManager
* TestingBrowserProcess::notification_ui_manager() {
237 #if defined(ENABLE_NOTIFICATIONS)
238 if (!notification_ui_manager_
.get())
239 notification_ui_manager_
.reset(
240 NotificationUIManager::Create(local_state()));
241 return notification_ui_manager_
.get();
248 message_center::MessageCenter
* TestingBrowserProcess::message_center() {
249 return message_center::MessageCenter::Get();
252 IntranetRedirectDetector
* TestingBrowserProcess::intranet_redirect_detector() {
255 void TestingBrowserProcess::CreateDevToolsHttpProtocolHandler(
256 chrome::HostDesktopType host_desktop_type
,
257 const std::string
& ip
,
261 unsigned int TestingBrowserProcess::AddRefModule() {
262 return ++module_ref_count_
;
265 unsigned int TestingBrowserProcess::ReleaseModule() {
266 DCHECK_GT(module_ref_count_
, 0U);
267 return --module_ref_count_
;
270 bool TestingBrowserProcess::IsShuttingDown() {
274 printing::PrintJobManager
* TestingBrowserProcess::print_job_manager() {
275 #if defined(ENABLE_PRINTING)
276 if (!print_job_manager_
.get())
277 print_job_manager_
.reset(new printing::PrintJobManager());
278 return print_job_manager_
.get();
285 printing::PrintPreviewDialogController
*
286 TestingBrowserProcess::print_preview_dialog_controller() {
287 #if defined(ENABLE_PRINT_PREVIEW)
288 if (!print_preview_dialog_controller_
.get())
289 print_preview_dialog_controller_
=
290 new printing::PrintPreviewDialogController();
291 return print_preview_dialog_controller_
.get();
298 printing::BackgroundPrintingManager
*
299 TestingBrowserProcess::background_printing_manager() {
300 #if defined(ENABLE_PRINT_PREVIEW)
301 if (!background_printing_manager_
.get()) {
302 background_printing_manager_
.reset(
303 new printing::BackgroundPrintingManager());
305 return background_printing_manager_
.get();
312 const std::string
& TestingBrowserProcess::GetApplicationLocale() {
316 void TestingBrowserProcess::SetApplicationLocale(
317 const std::string
& app_locale
) {
318 app_locale_
= app_locale
;
321 DownloadStatusUpdater
* TestingBrowserProcess::download_status_updater() {
325 DownloadRequestLimiter
* TestingBrowserProcess::download_request_limiter() {
329 ChromeNetLog
* TestingBrowserProcess::net_log() {
333 component_updater::ComponentUpdateService
*
334 TestingBrowserProcess::component_updater() {
338 CRLSetFetcher
* TestingBrowserProcess::crl_set_fetcher() {
342 component_updater::PnaclComponentInstaller
*
343 TestingBrowserProcess::pnacl_component_installer() {
347 component_updater::SupervisedUserWhitelistInstaller
*
348 TestingBrowserProcess::supervised_user_whitelist_installer() {
352 MediaFileSystemRegistry
* TestingBrowserProcess::media_file_system_registry() {
353 #if defined(OS_IOS) || defined(OS_ANDROID)
357 if (!media_file_system_registry_
)
358 media_file_system_registry_
.reset(new MediaFileSystemRegistry());
359 return media_file_system_registry_
.get();
363 bool TestingBrowserProcess::created_local_state() const {
364 return (local_state_
!= nullptr);
367 #if defined(ENABLE_WEBRTC)
368 WebRtcLogUploader
* TestingBrowserProcess::webrtc_log_uploader() {
373 network_time::NetworkTimeTracker
*
374 TestingBrowserProcess::network_time_tracker() {
375 if (!network_time_tracker_
) {
376 DCHECK(local_state_
);
377 network_time_tracker_
.reset(new network_time::NetworkTimeTracker(
378 scoped_ptr
<base::TickClock
>(new base::DefaultTickClock()),
381 return network_time_tracker_
.get();
384 gcm::GCMDriver
* TestingBrowserProcess::gcm_driver() {
388 memory::OomPriorityManager
* TestingBrowserProcess::GetOomPriorityManager() {
392 ShellIntegration::DefaultWebClientState
393 TestingBrowserProcess::CachedDefaultWebClientState() {
394 return ShellIntegration::UNKNOWN_DEFAULT
;
396 void TestingBrowserProcess::SetSystemRequestContext(
397 net::URLRequestContextGetter
* context_getter
) {
398 system_request_context_
= context_getter
;
401 void TestingBrowserProcess::SetNotificationUIManager(
402 scoped_ptr
<NotificationUIManager
> notification_ui_manager
) {
403 notification_ui_manager_
.swap(notification_ui_manager
);
406 void TestingBrowserProcess::SetLocalState(PrefService
* local_state
) {
408 // The local_state_ PrefService is owned outside of TestingBrowserProcess,
409 // but some of the members of TestingBrowserProcess hold references to it
410 // (for example, via PrefNotifier members). But given our test
411 // infrastructure which tears down individual tests before freeing the
412 // TestingBrowserProcess, there's not a good way to make local_state outlive
413 // these dependencies. As a workaround, whenever local_state_ is cleared
414 // (assumedly as part of exiting the test and freeing TestingBrowserProcess)
415 // any components owned by TestingBrowserProcess that depend on local_state
417 network_time_tracker_
.reset();
419 notification_ui_manager_
.reset();
421 #if defined(ENABLE_CONFIGURATION_POLICY)
422 SetBrowserPolicyConnector(nullptr);
425 local_state_
= local_state
;
428 void TestingBrowserProcess::SetIOThread(IOThread
* io_thread
) {
429 io_thread_
= io_thread
;
432 void TestingBrowserProcess::SetBrowserPolicyConnector(
433 policy::BrowserPolicyConnector
* connector
) {
434 #if defined(ENABLE_CONFIGURATION_POLICY)
435 if (browser_policy_connector_
) {
436 browser_policy_connector_
->Shutdown();
438 browser_policy_connector_
.reset(connector
);
444 void TestingBrowserProcess::SetSafeBrowsingService(
445 SafeBrowsingService
* sb_service
) {
449 sb_service_
= sb_service
;
453 ///////////////////////////////////////////////////////////////////////////////
455 TestingBrowserProcessInitializer::TestingBrowserProcessInitializer() {
456 TestingBrowserProcess::CreateInstance();
459 TestingBrowserProcessInitializer::~TestingBrowserProcessInitializer() {
460 TestingBrowserProcess::DeleteInstance();