#include "net/first_party_sets/first_party_sets_validator.h"
#include <algorithm>
#include "base/containers/map_util.h"
#include "net/base/schemeful_site.h"
namespace net {
FirstPartySetsValidator::FirstPartySetsValidator() = default;
FirstPartySetsValidator::~FirstPartySetsValidator() = default;
FirstPartySetsValidator::FirstPartySetsValidator(FirstPartySetsValidator&&) =
default;
FirstPartySetsValidator& FirstPartySetsValidator::operator=(
FirstPartySetsValidator&&) = default;
void FirstPartySetsValidator::Update(const SchemefulSite& site,
const SchemefulSite& primary) {
PrimarySiteState& primary_state = primary_states_[primary];
if (site == primary) {
primary_state.has_self_entry = true;
} else {
primary_state.has_nonself_entry = true;
}
const auto [it, inserted] = site_metadatas_.emplace(site, SiteState{primary});
if (!inserted) {
primary_state.is_disjoint = false;
primary_states_[it->second.first_seen_primary].is_disjoint = false;
}
}
bool FirstPartySetsValidator::IsValid() const {
return std::ranges::all_of(primary_states_, [](const auto& pair) -> bool {
return pair.second.IsValid();
});
}
bool FirstPartySetsValidator::IsSiteValid(const SchemefulSite& site) const {
const SiteState* state = base::FindOrNull(site_metadatas_, site);
return state && IsSitePrimaryValid(state->first_seen_primary);
}
bool FirstPartySetsValidator::IsSitePrimaryValid(
const SchemefulSite& primary) const {
const PrimarySiteState* state = base::FindOrNull(primary_states_, primary);
return state && state->IsValid();
}
bool FirstPartySetsValidator::PrimarySiteState::IsValid() const {
return has_nonself_entry && has_self_entry && is_disjoint;
}
}