blob: 53c8ccaf47f5e8f02f2b708c9a8953eaca4d2408 [file] [log] [blame]
// Copyright 2021 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/safe_browsing/chrome_user_population_helper.h"
#include "base/metrics/histogram_functions.h"
#include "base/no_destructor.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/safe_browsing/advanced_protection_status_manager.h"
#include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h"
#include "chrome/browser/safe_browsing/verdict_cache_manager_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/sync/sync_service_factory.h"
#include "components/safe_browsing/buildflags.h"
#include "components/safe_browsing/core/browser/sync/sync_utils.h"
#include "components/safe_browsing/core/browser/user_population.h"
#include "components/safe_browsing/core/browser/verdict_cache_manager.h"
#include "components/sync/service/sync_service.h"
namespace safe_browsing {
namespace {
std::optional<ChromeUserPopulation>& GetCachedUserPopulation(Profile* profile) {
static base::NoDestructor<
std::map<Profile*, std::optional<ChromeUserPopulation>>>
instance;
return (*instance)[profile];
}
NoCachedPopulationReason& GetNoCachedPopulationReason(Profile* profile) {
static base::NoDestructor<std::map<Profile*, NoCachedPopulationReason>>
instance;
auto it = instance->find(profile);
if (it == instance->end()) {
(*instance)[profile] = NoCachedPopulationReason::kStartup;
}
return (*instance)[profile];
}
void ComparePopulationWithCache(Profile* profile,
const ChromeUserPopulation& population) {
const std::optional<ChromeUserPopulation>& cached_population =
GetCachedUserPopulation(profile);
if (!cached_population) {
return;
}
}
} // namespace
void ClearCachedUserPopulation(Profile* profile,
NoCachedPopulationReason reason) {
GetCachedUserPopulation(profile) = std::nullopt;
GetNoCachedPopulationReason(profile) = reason;
}
ChromeUserPopulation GetUserPopulationForProfile(Profile* profile) {
// |profile| may be null in tests.
if (!profile)
return ChromeUserPopulation();
syncer::SyncService* sync = SyncServiceFactory::GetForProfile(profile);
bool is_history_sync_active =
sync && !sync->IsLocalSyncEnabled() &&
sync->GetActiveDataTypes().Has(syncer::HISTORY_DELETE_DIRECTIVES);
signin::IdentityManager* identity_manager =
IdentityManagerFactory::GetForProfile(profile);
bool is_signed_in =
identity_manager && SyncUtils::IsPrimaryAccountSignedIn(identity_manager);
bool is_under_advanced_protection = false;
#if BUILDFLAG(FULL_SAFE_BROWSING)
AdvancedProtectionStatusManager* advanced_protection_manager =
AdvancedProtectionStatusManagerFactory::GetForProfile(profile);
is_under_advanced_protection =
advanced_protection_manager &&
advanced_protection_manager->IsUnderAdvancedProtection();
#endif
std::optional<size_t> num_profiles;
std::optional<size_t> num_loaded_profiles;
ProfileManager* profile_manager = g_browser_process->profile_manager();
// |profile_manager| may be null in tests.
if (profile_manager) {
num_profiles = profile_manager->GetNumberOfProfiles();
num_loaded_profiles = profile_manager->GetLoadedProfiles().size();
}
ChromeUserPopulation population = GetUserPopulation(
profile->GetPrefs(), profile->IsOffTheRecord(), is_history_sync_active,
is_signed_in, is_under_advanced_protection,
g_browser_process->browser_policy_connector(), std::move(num_profiles),
std::move(num_loaded_profiles));
ComparePopulationWithCache(profile, population);
GetCachedUserPopulation(profile) = population;
return population;
}
ChromeUserPopulation::PageLoadToken GetPageLoadTokenForURL(Profile* profile,
GURL url) {
if (!profile) {
return ChromeUserPopulation::PageLoadToken();
}
VerdictCacheManager* cache_manager =
VerdictCacheManagerFactory::GetForProfile(profile);
if (!cache_manager) {
return ChromeUserPopulation::PageLoadToken();
}
ChromeUserPopulation::PageLoadToken token =
cache_manager->GetPageLoadToken(url);
if (token.has_token_value()) {
return token;
}
return cache_manager->CreatePageLoadToken(url);
}
} // namespace safe_browsing