Migrate configuration of SupervisedUserSettingsService.

Moves the configuration of the supervised state to the settings
initialization in SupervisedUserService to modularize the actions
taken by each child service.

Bug: 1324946
Change-Id: I621e4b53b0d95b1d78774b87fe8f9612572adc58
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3700171
Commit-Queue: Nohemi Fernandez <fernandex@chromium.org>
Reviewed-by: Marc Treib <treib@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1016136}
diff --git a/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc b/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc
index eb46022b..121dfa5 100644
--- a/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc
+++ b/chrome/browser/content_settings/content_settings_supervised_provider_unittest.cc
@@ -84,16 +84,7 @@
 TEST_F(SupervisedUserProviderTest, CookiesTest) {
   std::unique_ptr<RuleIterator> rule_iterator =
       provider_->GetRuleIterator(ContentSettingsType::COOKIES, false);
-  EXPECT_FALSE(rule_iterator);
 
-  // Allow cookies everywhere.
-  EXPECT_CALL(mock_observer_,
-              OnContentSettingChanged(_, _, ContentSettingsType::COOKIES));
-  service_.SetLocalSetting(supervised_users::kCookiesAlwaysAllowed,
-                           std::make_unique<base::Value>(true));
-
-  rule_iterator =
-      provider_->GetRuleIterator(ContentSettingsType::COOKIES, false);
   ASSERT_TRUE(rule_iterator->HasNext());
   Rule rule = rule_iterator->Next();
   EXPECT_FALSE(rule_iterator->HasNext());
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service.cc b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
index aa75902..4f02764 100644
--- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
 #include "chrome/browser/supervised_user/web_approvals_manager.h"
-#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/common/pref_names.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
@@ -31,8 +30,6 @@
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/signin/public/identity_manager/tribool.h"
-#include "components/sync/driver/sync_service.h"
-#include "components/sync/driver/sync_user_settings.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 
@@ -161,28 +158,6 @@
   active_ = active;
 
   if (active_) {
-    SupervisedUserSettingsService* settings_service =
-        SupervisedUserSettingsServiceFactory::GetForKey(
-            profile_->GetProfileKey());
-
-    // In contrast to deprecated legacy SUs, child account SUs must sign in.
-    settings_service->SetLocalSetting(supervised_users::kSigninAllowed,
-                                      std::make_unique<base::Value>(true));
-
-    // Always allow cookies, to avoid website compatibility issues.
-    settings_service->SetLocalSetting(supervised_users::kCookiesAlwaysAllowed,
-                                      std::make_unique<base::Value>(true));
-
-    // SafeSearch is controlled at the account level, so don't override it
-    // client-side.
-    settings_service->SetLocalSetting(supervised_users::kForceSafeSearch,
-                                      std::make_unique<base::Value>(false));
-
-    // GeolocationDisabled is controlled at the account level, so don't override
-    // it client-side.
-    settings_service->SetLocalSetting(supervised_users::kGeolocationDisabled,
-                                      std::make_unique<base::Value>(false));
-
 #if !BUILDFLAG(IS_CHROMEOS)
     // This is also used by user policies (UserPolicySigninService), but since
     // child accounts can not also be Dasher accounts, there shouldn't be any
@@ -197,18 +172,6 @@
     service->web_approvals_manager().AddRemoteApprovalRequestCreator(
         PermissionRequestCreatorApiary::CreateWithProfile(profile_));
   } else {
-    SupervisedUserSettingsService* settings_service =
-        SupervisedUserSettingsServiceFactory::GetForKey(
-            profile_->GetProfileKey());
-    settings_service->SetLocalSetting(supervised_users::kSigninAllowed,
-                                      nullptr);
-    settings_service->SetLocalSetting(supervised_users::kCookiesAlwaysAllowed,
-                                      nullptr);
-    settings_service->SetLocalSetting(supervised_users::kForceSafeSearch,
-                                      nullptr);
-    settings_service->SetLocalSetting(supervised_users::kGeolocationDisabled,
-                                      nullptr);
-
 #if !BUILDFLAG(IS_CHROMEOS)
     signin_util::SetUserSignoutAllowedForProfile(profile_, true);
 #endif
@@ -216,18 +179,6 @@
     CancelFetchingFamilyInfo();
   }
 
-  // Trigger a sync reconfig to enable/disable the right SU data types.
-  // The logic to do this lives in the SupervisedUserSyncModelTypeController.
-  // TODO(crbug.com/946473): Get rid of this hack and instead call
-  // DataTypePreconditionChanged from the controller.
-  syncer::SyncService* sync_service =
-      SyncServiceFactory::GetForProfile(profile_);
-  if (sync_service->GetUserSettings()->IsFirstSetupComplete()) {
-    // Trigger a reconfig by grabbing a SyncSetupInProgressHandle and
-    // immediately releasing it again (via the temporary unique_ptr going away).
-    sync_service->GetSetupInProgressHandle();
-  }
-
   return true;
 }
 
diff --git a/chrome/browser/supervised_user/parental_control_metrics_unittest.cc b/chrome/browser/supervised_user/parental_control_metrics_unittest.cc
index 7f75683..b2200b5 100644
--- a/chrome/browser/supervised_user/parental_control_metrics_unittest.cc
+++ b/chrome/browser/supervised_user/parental_control_metrics_unittest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/supervised_user/supervised_user_service.h"
 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
 #include "chrome/browser/supervised_user/supervised_user_url_filter.h"
+#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
@@ -52,6 +53,9 @@
     TestingProfile::Builder profile_builder;
     profile_builder.SetPrefService(std::move(prefs));
     profile_builder.SetIsSupervisedProfile();
+    profile_builder.AddTestingFactory(SyncServiceFactory::GetInstance(),
+                                      SyncServiceFactory::GetDefaultFactory());
+
     profile_ = profile_builder.Build();
     EXPECT_TRUE(profile_->IsChild());
     supervised_user_service_ =
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 7095942..29d46b3 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -37,12 +37,15 @@
 #include "chrome/browser/supervised_user/supervised_user_service_observer.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
+#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/pref_service.h"
+#include "components/sync/driver/sync_service.h"
+#include "components/sync/driver/sync_user_settings.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "extensions/buildflags/buildflags.h"
@@ -379,6 +382,18 @@
     theme_service->UseDefaultTheme();
 #endif
 
+  // Trigger a sync reconfig to enable/disable the right SU data types.
+  // The logic to do this lives in the SupervisedUserSyncModelTypeController.
+  // TODO(crbug.com/946473): Get rid of this hack and instead call
+  // DataTypePreconditionChanged from the controller.
+  syncer::SyncService* sync_service =
+      SyncServiceFactory::GetForProfile(profile_);
+  if (sync_service->GetUserSettings()->IsFirstSetupComplete()) {
+    // Trigger a reconfig by grabbing a SyncSetupInProgressHandle and
+    // immediately releasing it again (via the temporary unique_ptr going away).
+    sync_service->GetSetupInProgressHandle();
+  }
+
   GetSettingsService()->SetActive(active_);
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/supervised_user/supervised_user_service_browsertest.cc b/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
index 86431b42..7ace6fa 100644
--- a/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
@@ -82,9 +82,9 @@
   logged_in_user_mixin_.LogInUser();
   Profile* profile = browser()->profile();
   PrefService* prefs = profile->GetPrefs();
-  EXPECT_FALSE(prefs->GetBoolean(prefs::kForceGoogleSafeSearch));
+  EXPECT_TRUE(prefs->GetBoolean(prefs::kForceGoogleSafeSearch));
   EXPECT_EQ(prefs->GetInteger(prefs::kForceYouTubeRestrict),
-            safe_search_util::YOUTUBE_RESTRICT_OFF);
+            safe_search_util::YOUTUBE_RESTRICT_MODERATE);
   EXPECT_FALSE(
       prefs->IsUserModifiablePreference(prefs::kForceGoogleSafeSearch));
   EXPECT_FALSE(prefs->IsUserModifiablePreference(prefs::kForceYouTubeRestrict));
diff --git a/chrome/browser/supervised_user/supervised_user_service_unittest.cc b/chrome/browser/supervised_user/supervised_user_service_unittest.cc
index 9978fc20..7896631 100644
--- a/chrome/browser/supervised_user/supervised_user_service_unittest.cc
+++ b/chrome/browser/supervised_user/supervised_user_service_unittest.cc
@@ -22,6 +22,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
+#include "chrome/browser/sync/sync_service_factory.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -130,6 +131,8 @@
 
     // Build supervised profile.
     TestingProfile::Builder builder;
+    builder.AddTestingFactory(SyncServiceFactory::GetInstance(),
+                              SyncServiceFactory::GetDefaultFactory());
     builder.SetIsSupervisedProfile();
     profile_ = builder.Build();
 
diff --git a/chrome/browser/supervised_user/supervised_user_settings_service.cc b/chrome/browser/supervised_user/supervised_user_settings_service.cc
index bae1163..dee41b4a 100644
--- a/chrome/browser/supervised_user/supervised_user_settings_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_settings_service.cc
@@ -156,6 +156,25 @@
 
 void SupervisedUserSettingsService::SetActive(bool active) {
   active_ = active;
+
+  if (active_) {
+    // Child account supervised users must be signed in.
+    SetLocalSetting(supervised_users::kSigninAllowed,
+                    std::make_unique<base::Value>(true));
+
+    // Always allow cookies, to avoid website compatibility issues.
+    SetLocalSetting(supervised_users::kCookiesAlwaysAllowed,
+                    std::make_unique<base::Value>(true));
+
+    // SafeSearch and GeolocationDisabled are controlled at the account level,
+    // so don't override them client-side.
+  } else {
+    SetLocalSetting(supervised_users::kSigninAllowed, nullptr);
+    SetLocalSetting(supervised_users::kCookiesAlwaysAllowed, nullptr);
+    SetLocalSetting(supervised_users::kForceSafeSearch, nullptr);
+    SetLocalSetting(supervised_users::kGeolocationDisabled, nullptr);
+  }
+
   InformSubscribers();
 }