blob: 8d9df42293003dc4762110e93528320c405af8ab [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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) {
// `site` appears in more than one set (or is listed in the same set more
// than once).
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 {
// A set is valid iff its primary site has a self-entry, has at least one
// non-self entry, and the set is disjoint from all other sets.
return has_nonself_entry && has_self_entry && is_disjoint;
}
} // namespace net