ash: Get PrefService via SessionControllerClient

- Get sign-in screen and user PrefService from SessionControllerClient
  instead of mojom::PrefConnector.
- Add a TestPrefServiceProvider to create and own various PrefServices
  to outlive TestSessionControllerClient;
- Move Shell:: RegisterSignin/UserProfilePrefs to ash_prefs.h in
  public/cpp and call them from browser prefs to register as part
  of the browser;
- Remove RegisterForeignPref for user prefs in ash/* code since they are
  now part of the browser user prefs;

Bug: 958212
Change-Id: Ic4d9f951e5fd2f255c5274906115fc4aeb2dcc41
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1603325
Commit-Queue: Xiyuan Xia <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Cr-Commit-Position: refs/heads/master@{#659064}
diff --git a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
index 15ccecbd..d4a7397 100644
--- a/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
+++ b/chrome/browser/chromeos/power/auto_screen_brightness/adapter_unittest.cc
@@ -176,13 +176,6 @@
     chromeos::power::auto_screen_brightness::MetricsReporter::
         RegisterLocalStatePrefs(registry.get());
 
-    // Same default values as used in the actual pref store.
-    registry->RegisterIntegerPref(ash::prefs::kPowerAcScreenBrightnessPercent,
-                                  -1, PrefRegistry::PUBLIC);
-    registry->RegisterIntegerPref(
-        ash::prefs::kPowerBatteryScreenBrightnessPercent, -1,
-        PrefRegistry::PUBLIC);
-
     sync_preferences::PrefServiceSyncable* regular_prefs =
         factory.CreateSyncable(registry.get()).release();
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 242dfac8..56fb0cc7d 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -228,6 +228,7 @@
 #endif  // defined(OS_ANDROID)
 
 #if defined(OS_CHROMEOS)
+#include "ash/public/cpp/ash_prefs.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
@@ -918,6 +919,9 @@
 #if defined(OS_ANDROID)
   ::android::RegisterUserProfilePrefs(registry);
 #endif
+#if defined(OS_CHROMEOS)
+  ash::RegisterUserProfilePrefs(registry);
+#endif
 }
 
 void RegisterScreenshotPrefs(PrefRegistrySimple* registry) {
@@ -925,8 +929,9 @@
 }
 
 #if defined(OS_CHROMEOS)
-void RegisterLoginProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
+void RegisterSigninProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
   RegisterProfilePrefs(registry, g_browser_process->GetApplicationLocale());
+  ash::RegisterSigninProfilePrefs(registry);
 }
 
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
diff --git a/chrome/browser/prefs/browser_prefs.h b/chrome/browser/prefs/browser_prefs.h
index 69a5162..05f6c20 100644
--- a/chrome/browser/prefs/browser_prefs.h
+++ b/chrome/browser/prefs/browser_prefs.h
@@ -33,9 +33,9 @@
                               const std::string& locale);
 
 #if defined(OS_CHROMEOS)
-// Register all prefs that will be used via a PrefService attached to the login
-// Profile using the locale of |g_browser_process|.
-void RegisterLoginProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+// Register all prefs that will be used via a PrefService attached to the
+// sign-in profile using the locale of |g_browser_process|.
+void RegisterSigninProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 #endif
 
 // Migrate/cleanup deprecated prefs in |local_state|. Over time, long deprecated
diff --git a/chrome/browser/profiles/pref_service_builder_utils.cc b/chrome/browser/profiles/pref_service_builder_utils.cc
index 87f373a..9909604 100644
--- a/chrome/browser/profiles/pref_service_builder_utils.cc
+++ b/chrome/browser/profiles/pref_service_builder_utils.cc
@@ -73,7 +73,7 @@
                           user_prefs::PrefRegistrySyncable* pref_registry) {
 #if defined(OS_CHROMEOS)
   if (is_signin_profile)
-    RegisterLoginProfilePrefs(pref_registry);
+    RegisterSigninProfilePrefs(pref_registry);
   else
 #endif
     RegisterUserProfilePrefs(pref_registry, locale);
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.cc b/chrome/browser/ui/ash/session_controller_client_impl.cc
index df53ce8..eace4e2 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl.cc
+++ b/chrome/browser/ui/ash/session_controller_client_impl.cc
@@ -201,6 +201,10 @@
 SessionControllerClientImpl::~SessionControllerClientImpl() {
   DCHECK_EQ(this, g_session_controller_client_instance);
   g_session_controller_client_instance = nullptr;
+  if (session_controller_ &&
+      session_controller_ == ash::SessionController::Get()) {
+    session_controller_->SetClient(nullptr);
+  }
 
   if (supervised_user_profile_) {
     SupervisedUserServiceFactory::GetForProfile(supervised_user_profile_)
@@ -321,6 +325,20 @@
   chromeos::SessionManagerClient::Get()->EmitAshInitialized();
 }
 
+PrefService* SessionControllerClientImpl::GetSigninScreenPrefService() {
+  return chromeos::ProfileHelper::Get()->GetSigninProfile()->GetPrefs();
+}
+
+PrefService* SessionControllerClientImpl::GetUserPrefService(
+    const AccountId& account_id) {
+  Profile* const user_profile =
+      multi_user_util::GetProfileFromAccountId(account_id);
+  if (!user_profile)
+    return nullptr;
+
+  return user_profile->GetPrefs();
+}
+
 // static
 bool SessionControllerClientImpl::IsMultiProfileAvailable() {
   if (!profiles::IsMultipleProfilesEnabled() || !UserManager::IsInitialized())
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.h b/chrome/browser/ui/ash/session_controller_client_impl.h
index 111f950b..2a95b5c 100644
--- a/chrome/browser/ui/ash/session_controller_client_impl.h
+++ b/chrome/browser/ui/ash/session_controller_client_impl.h
@@ -80,6 +80,8 @@
   void CycleActiveUser(ash::CycleUserDirection direction) override;
   void ShowMultiProfileLogin() override;
   void EmitAshInitialized() override;
+  PrefService* GetSigninScreenPrefService() override;
+  PrefService* GetUserPrefService(const AccountId& account_id) override;
 
   // Returns true if a multi-profile user can be added to the session or if
   // multiple users are already signed in.
diff --git a/chrome/browser/ui/views/test/view_event_test_platform_part_chromeos.cc b/chrome/browser/ui/views/test/view_event_test_platform_part_chromeos.cc
index 36a8e45e..51c39e7 100644
--- a/chrome/browser/ui/views/test/view_event_test_platform_part_chromeos.cc
+++ b/chrome/browser/ui/views/test/view_event_test_platform_part_chromeos.cc
@@ -71,7 +71,7 @@
       switches::kHostWindowBounds, "0+0-1280x800");
   ash::Shell::CreateInstance(std::move(init_params));
   ash::TestSessionControllerClient session_controller_client(
-      ash::Shell::Get()->session_controller());
+      ash::Shell::Get()->session_controller(), /*prefs_provider=*/nullptr);
   session_controller_client.CreatePredefinedUserSessions(1);
   GetContext()->GetHost()->Show();
 }