1 // Copyright (c) 2013 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.
4
5 #include "chrome/browser/browser_process_platform_part_chromeos.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/check_op.h"
11 #include "base/memory/singleton.h"
12 #include "base/time/default_tick_clock.h"
13 #include "base/time/tick_clock.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/chromeos/login/saml/in_session_password_change_manager.h"
16 #include "chrome/browser/chromeos/login/session/chrome_session_manager.h"
17 #include "chrome/browser/chromeos/login/users/chrome_user_manager_impl.h"
18 #include "chrome/browser/chromeos/net/delay_network_call.h"
19 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
20 #include "chrome/browser/chromeos/policy/system_proxy_manager.h"
21 #include "chrome/browser/chromeos/profiles/profile_helper.h"
22 #include "chrome/browser/chromeos/scheduler_configuration_manager.h"
23 #include "chrome/browser/chromeos/settings/cros_settings.h"
24 #include "chrome/browser/chromeos/system/automatic_reboot_manager.h"
25 #include "chrome/browser/chromeos/system/device_disabling_manager.h"
26 #include "chrome/browser/chromeos/system/device_disabling_manager_default_delegate.h"
27 #include "chrome/browser/chromeos/system/system_clock.h"
28 #include "chrome/browser/chromeos/system/timezone_resolver_manager.h"
29 #include "chrome/browser/chromeos/system/timezone_util.h"
30 #include "chrome/browser/component_updater/metadata_table_chromeos.h"
31 #include "chrome/common/chrome_switches.h"
32 #include "chromeos/components/account_manager/account_manager_factory.h"
33 #include "chromeos/dbus/dbus_thread_manager.h"
34 #include "chromeos/geolocation/simple_geolocation_provider.h"
35 #include "chromeos/timezone/timezone_resolver.h"
36 #include "components/keep_alive_registry/keep_alive_types.h"
37 #include "components/keep_alive_registry/scoped_keep_alive.h"
38 #include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h"
39 #include "components/session_manager/core/session_manager.h"
40 #include "components/user_manager/user_manager.h"
41 #include "services/network/public/cpp/shared_url_loader_factory.h"
42 #include "services/preferences/public/mojom/preferences.mojom.h"
43 #include "services/service_manager/public/cpp/binder_registry.h"
44 #include "services/service_manager/public/cpp/interface_provider.h"
45 #include "services/service_manager/public/cpp/service.h"
46
47 namespace {
48
49 class PrimaryProfileServicesShutdownNotifierFactory
50 : public BrowserContextKeyedServiceShutdownNotifierFactory {
51 public:
GetInstance()52 static PrimaryProfileServicesShutdownNotifierFactory* GetInstance() {
53 return base::Singleton<
54 PrimaryProfileServicesShutdownNotifierFactory>::get();
55 }
56
57 private:
58 friend struct base::DefaultSingletonTraits<
59 PrimaryProfileServicesShutdownNotifierFactory>;
60
PrimaryProfileServicesShutdownNotifierFactory()61 PrimaryProfileServicesShutdownNotifierFactory()
62 : BrowserContextKeyedServiceShutdownNotifierFactory(
63 "PrimaryProfileServices") {}
~PrimaryProfileServicesShutdownNotifierFactory()64 ~PrimaryProfileServicesShutdownNotifierFactory() override {}
65
66 DISALLOW_COPY_AND_ASSIGN(PrimaryProfileServicesShutdownNotifierFactory);
67 };
68
69 } // namespace
70
BrowserProcessPlatformPart()71 BrowserProcessPlatformPart::BrowserProcessPlatformPart()
72 : created_profile_helper_(false),
73 account_manager_factory_(
74 std::make_unique<chromeos::AccountManagerFactory>()) {}
75
~BrowserProcessPlatformPart()76 BrowserProcessPlatformPart::~BrowserProcessPlatformPart() {
77 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
78 }
79
InitializeAutomaticRebootManager()80 void BrowserProcessPlatformPart::InitializeAutomaticRebootManager() {
81 DCHECK(!automatic_reboot_manager_);
82
83 automatic_reboot_manager_.reset(new chromeos::system::AutomaticRebootManager(
84 base::DefaultTickClock::GetInstance()));
85 }
86
ShutdownAutomaticRebootManager()87 void BrowserProcessPlatformPart::ShutdownAutomaticRebootManager() {
88 automatic_reboot_manager_.reset();
89 }
90
InitializeChromeUserManager()91 void BrowserProcessPlatformPart::InitializeChromeUserManager() {
92 DCHECK(!chrome_user_manager_);
93 chrome_user_manager_ =
94 chromeos::ChromeUserManagerImpl::CreateChromeUserManager();
95 chrome_user_manager_->Initialize();
96 }
97
DestroyChromeUserManager()98 void BrowserProcessPlatformPart::DestroyChromeUserManager() {
99 chrome_user_manager_->Destroy();
100 chrome_user_manager_.reset();
101 }
102
InitializeDeviceDisablingManager()103 void BrowserProcessPlatformPart::InitializeDeviceDisablingManager() {
104 DCHECK(!device_disabling_manager_);
105
106 device_disabling_manager_delegate_.reset(
107 new chromeos::system::DeviceDisablingManagerDefaultDelegate);
108 device_disabling_manager_.reset(new chromeos::system::DeviceDisablingManager(
109 device_disabling_manager_delegate_.get(), chromeos::CrosSettings::Get(),
110 user_manager::UserManager::Get()));
111 device_disabling_manager_->Init();
112 }
113
ShutdownDeviceDisablingManager()114 void BrowserProcessPlatformPart::ShutdownDeviceDisablingManager() {
115 device_disabling_manager_.reset();
116 device_disabling_manager_delegate_.reset();
117 }
118
InitializeSessionManager()119 void BrowserProcessPlatformPart::InitializeSessionManager() {
120 DCHECK(!session_manager_);
121 session_manager_ = std::make_unique<chromeos::ChromeSessionManager>();
122 }
123
ShutdownSessionManager()124 void BrowserProcessPlatformPart::ShutdownSessionManager() {
125 session_manager_.reset();
126 }
127
InitializeCrosComponentManager()128 void BrowserProcessPlatformPart::InitializeCrosComponentManager() {
129 if (using_testing_cros_component_manager_)
130 return;
131
132 DCHECK(!cros_component_manager_);
133 cros_component_manager_ =
134 base::MakeRefCounted<component_updater::CrOSComponentInstaller>(
135 std::make_unique<component_updater::MetadataTable>(
136 g_browser_process->local_state()),
137 g_browser_process->component_updater());
138
139 // Register all installed components for regular update.
140 cros_component_manager_->RegisterInstalled();
141 }
142
ShutdownCrosComponentManager()143 void BrowserProcessPlatformPart::ShutdownCrosComponentManager() {
144 if (using_testing_cros_component_manager_)
145 return;
146
147 cros_component_manager_.reset();
148 }
149
InitializeSchedulerConfigurationManager()150 void BrowserProcessPlatformPart::InitializeSchedulerConfigurationManager() {
151 DCHECK(!scheduler_configuration_manager_);
152 scheduler_configuration_manager_ =
153 std::make_unique<chromeos::SchedulerConfigurationManager>(
154 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient(),
155 g_browser_process->local_state());
156 }
157
ShutdownSchedulerConfigurationManager()158 void BrowserProcessPlatformPart::ShutdownSchedulerConfigurationManager() {
159 scheduler_configuration_manager_.reset();
160 }
161
InitializePrimaryProfileServices(Profile * primary_profile)162 void BrowserProcessPlatformPart::InitializePrimaryProfileServices(
163 Profile* primary_profile) {
164 DCHECK(primary_profile);
165
166 DCHECK(!in_session_password_change_manager_);
167 in_session_password_change_manager_ =
168 chromeos::InSessionPasswordChangeManager::CreateIfEnabled(
169 primary_profile);
170
171 primary_profile_shutdown_subscription_ =
172 PrimaryProfileServicesShutdownNotifierFactory::GetInstance()
173 ->Get(primary_profile)
174 ->Subscribe(base::BindRepeating(
175 &BrowserProcessPlatformPart::ShutdownPrimaryProfileServices,
176 base::Unretained(this)));
177 browser_policy_connector_chromeos()
178 ->GetSystemProxyManager()
179 ->StartObservingPrimaryProfilePrefs(primary_profile);
180 }
181
ShutdownPrimaryProfileServices()182 void BrowserProcessPlatformPart::ShutdownPrimaryProfileServices() {
183 browser_policy_connector_chromeos()
184 ->GetSystemProxyManager()
185 ->StopObservingPrimaryProfilePrefs();
186 in_session_password_change_manager_.reset();
187 }
188
RegisterKeepAlive()189 void BrowserProcessPlatformPart::RegisterKeepAlive() {
190 DCHECK(!keep_alive_);
191 keep_alive_.reset(
192 new ScopedKeepAlive(KeepAliveOrigin::BROWSER_PROCESS_CHROMEOS,
193 KeepAliveRestartOption::DISABLED));
194 }
195
UnregisterKeepAlive()196 void BrowserProcessPlatformPart::UnregisterKeepAlive() {
197 keep_alive_.reset();
198 }
199
profile_helper()200 chromeos::ProfileHelper* BrowserProcessPlatformPart::profile_helper() {
201 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
202 if (!created_profile_helper_)
203 CreateProfileHelper();
204 return profile_helper_.get();
205 }
206
207 policy::BrowserPolicyConnectorChromeOS*
browser_policy_connector_chromeos()208 BrowserProcessPlatformPart::browser_policy_connector_chromeos() {
209 return static_cast<policy::BrowserPolicyConnectorChromeOS*>(
210 g_browser_process->browser_policy_connector());
211 }
212
213 chromeos::system::TimeZoneResolverManager*
GetTimezoneResolverManager()214 BrowserProcessPlatformPart::GetTimezoneResolverManager() {
215 if (!timezone_resolver_manager_.get()) {
216 timezone_resolver_manager_.reset(
217 new chromeos::system::TimeZoneResolverManager());
218 }
219 return timezone_resolver_manager_.get();
220 }
221
GetTimezoneResolver()222 chromeos::TimeZoneResolver* BrowserProcessPlatformPart::GetTimezoneResolver() {
223 if (!timezone_resolver_.get()) {
224 timezone_resolver_.reset(new chromeos::TimeZoneResolver(
225 GetTimezoneResolverManager(),
226 g_browser_process->shared_url_loader_factory(),
227 chromeos::SimpleGeolocationProvider::DefaultGeolocationProviderURL(),
228 base::BindRepeating(&chromeos::system::ApplyTimeZone),
229 base::BindRepeating(&chromeos::DelayNetworkCall,
230 base::TimeDelta::FromMilliseconds(
231 chromeos::kDefaultNetworkRetryDelayMS)),
232 g_browser_process->local_state()));
233 }
234 return timezone_resolver_.get();
235 }
236
StartTearDown()237 void BrowserProcessPlatformPart::StartTearDown() {
238 // interactive_ui_tests check for memory leaks before this object is
239 // destroyed. So we need to destroy |timezone_resolver_| here.
240 timezone_resolver_.reset();
241 profile_helper_.reset();
242 }
243
GetSystemClock()244 chromeos::system::SystemClock* BrowserProcessPlatformPart::GetSystemClock() {
245 if (!system_clock_.get())
246 system_clock_.reset(new chromeos::system::SystemClock());
247 return system_clock_.get();
248 }
249
DestroySystemClock()250 void BrowserProcessPlatformPart::DestroySystemClock() {
251 system_clock_.reset();
252 }
253
CreateProfileHelper()254 void BrowserProcessPlatformPart::CreateProfileHelper() {
255 DCHECK(!created_profile_helper_ && !profile_helper_);
256 created_profile_helper_ = true;
257 profile_helper_ = chromeos::ProfileHelper::CreateInstance();
258 }
259
260 chromeos::AccountManagerFactory*
GetAccountManagerFactory()261 BrowserProcessPlatformPart::GetAccountManagerFactory() {
262 return account_manager_factory_.get();
263 }
264