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