blob: 4ffebe7cb4b65dc58dc2bdd2157d3b014f91d47c [file]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/supervised_user/supervised_user_browsertest_base.h"
#include <memory>
#include <utility>
#include "base/check_deref.h"
#include "base/functional/bind.h"
#include "build/build_config.h"
#include "build/buildflag.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_key.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/supervised_user/android/supervised_user_service_platform_delegate.h"
#include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h"
#include "chrome/browser/supervised_user/child_accounts/list_family_members_service_factory.h"
#include "chrome/browser/supervised_user/family_link_settings_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_url_filtering_service_factory.h"
#include "chrome/browser/sync/sync_service_factory.h"
#include "chrome/test/base/android/android_browser_test.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/safe_search_api/url_checker_client.h"
#include "components/supervised_user/core/browser/child_account_service.h"
#include "components/supervised_user/core/browser/device_parental_controls.h"
#include "components/supervised_user/core/browser/device_parental_controls_url_filter.h"
#include "components/supervised_user/core/browser/family_link_url_filter.h"
#include "components/supervised_user/core/browser/kids_chrome_management_url_checker_client.h"
#include "components/supervised_user/core/browser/supervised_user_service.h"
#include "components/supervised_user/core/browser/supervised_user_url_filtering_service.h"
#include "components/supervised_user/test_support/supervised_user_url_filter_test_utils.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#if BUILDFLAG(IS_ANDROID)
#include "components/supervised_user/core/browser/android/android_parental_controls.h"
#endif // BUILDFLAG(IS_ANDROID)
namespace supervised_user {
namespace {
std::unique_ptr<KeyedService> BuildSupervisedUserService(
MockUrlCheckerClient& mock_url_checker_client,
content::BrowserContext* context) {
Profile* profile = Profile::FromBrowserContext(context);
FamilyLinkSettingsService& settings_service =
CHECK_DEREF(FamilyLinkSettingsServiceFactory::GetInstance()->GetForKey(
profile->GetProfileKey()));
return std::make_unique<SupervisedUserService>(
IdentityManagerFactory::GetForProfile(profile),
profile->GetDefaultStoragePartition()
->GetURLLoaderFactoryForBrowserProcess(),
*profile->GetPrefs(), settings_service,
SyncServiceFactory::GetForProfile(profile),
std::make_unique<FamilyLinkUrlFilter>(
settings_service, *profile->GetPrefs(),
std::make_unique<FakeURLFilterDelegate>(),
std::make_unique<UrlCheckerClientWrapper>(mock_url_checker_client)),
std::make_unique<SupervisedUserServicePlatformDelegate>(*profile),
g_browser_process->device_parental_controls());
}
std::unique_ptr<KeyedService> BuildSupervisedUserUrlFilteringService(
MockUrlCheckerClient& mock_url_checker_client,
content::BrowserContext* context) {
return std::make_unique<SupervisedUserUrlFilteringService>(
CHECK_DEREF(SupervisedUserServiceFactory::GetForProfile(
Profile::FromBrowserContext(context))),
std::make_unique<DeviceParentalControlsUrlFilter>(
g_browser_process->device_parental_controls(),
std::make_unique<UrlCheckerClientWrapper>(mock_url_checker_client)));
}
} // namespace
SupervisedUserBrowserTestBase::SupervisedUserBrowserTestBase() = default;
SupervisedUserBrowserTestBase::~SupervisedUserBrowserTestBase() = default;
void SupervisedUserBrowserTestBase::SetUpBrowserContextKeyedServices(
content::BrowserContext* context) {
#if BUILDFLAG(IS_ANDROID)
AndroidBrowserTest::SetUpBrowserContextKeyedServices(context);
#else
MixinBasedInProcessBrowserTest::SetUpBrowserContextKeyedServices(context);
#endif // BUILDFLAG(IS_ANDROID)
// Preset user-prefs before any service is initialized.
Profile* profile = Profile::FromBrowserContext(context);
if (initial_state_.family_link_parental_controls) {
EnableParentalControls(*profile->GetPrefs());
} else {
DisableParentalControls(*profile->GetPrefs());
}
#if BUILDFLAG(IS_ANDROID)
GetDeviceParentalControls().SetBrowserContentFiltersEnabledForTesting(
initial_state_.android_parental_controls.browser_filter);
GetDeviceParentalControls().SetSearchContentFiltersEnabledForTesting(
initial_state_.android_parental_controls.search_filter);
#endif // BUILDFLAG(IS_ANDROID)
SupervisedUserServiceFactory::GetInstance()->SetTestingFactory(
context, base::BindRepeating(&BuildSupervisedUserService,
std::ref(mock_url_checker_client_)));
SupervisedUserUrlFilteringServiceFactory::GetInstance()->SetTestingFactory(
context, base::BindRepeating(&BuildSupervisedUserUrlFilteringService,
std::ref(mock_url_checker_client_)));
browser_context_keyed_services_set_up_ = true;
}
void SupervisedUserBrowserTestBase::SetInitialSupervisedUserState(
InitialSupervisedUserState initial_state) {
CHECK(!browser_context_keyed_services_set_up_)
<< "SetInitialSupervisedUserState must be called before setting up the "
"mocks.";
initial_state_ = initial_state;
}
SupervisedUserService* SupervisedUserBrowserTestBase::GetSupervisedUserService()
const {
return SupervisedUserServiceFactory::GetForProfile(GetProfile());
}
SupervisedUserUrlFilteringService*
SupervisedUserBrowserTestBase::GetSupervisedUserUrlFilteringService() const {
return SupervisedUserUrlFilteringServiceFactory::GetForProfile(GetProfile());
}
MockUrlCheckerClient& SupervisedUserBrowserTestBase::GetMockUrlCheckerClient() {
return mock_url_checker_client_;
}
#if BUILDFLAG(IS_ANDROID)
AndroidParentalControls&
SupervisedUserBrowserTestBase::GetDeviceParentalControls() {
return static_cast<AndroidParentalControls&>(
g_browser_process->device_parental_controls());
}
#else
DeviceParentalControls&
SupervisedUserBrowserTestBase::GetDeviceParentalControls() {
return g_browser_process->device_parental_controls();
}
#endif // BUILDFLAG(IS_ANDROID)
} // namespace supervised_user