blob: 737b263ac37344c13229a0dbb0604398ad92f725 [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 "content/browser/agent_cluster_key.h"
#include <variant>
#include "base/notreached.h"
namespace content {
AgentClusterKey::CrossOriginIsolationKey::CrossOriginIsolationKey(
const url::Origin& common_coi_origin,
CrossOriginIsolationMode cross_origin_isolation_mode)
: common_coi_origin(common_coi_origin),
cross_origin_isolation_mode(cross_origin_isolation_mode) {}
AgentClusterKey::CrossOriginIsolationKey::CrossOriginIsolationKey(
const CrossOriginIsolationKey& other) = default;
AgentClusterKey::CrossOriginIsolationKey::~CrossOriginIsolationKey() = default;
bool AgentClusterKey::CrossOriginIsolationKey::operator==(
const CrossOriginIsolationKey& b) const = default;
// static
AgentClusterKey AgentClusterKey::CreateSiteKeyed(const GURL& site_url) {
return AgentClusterKey(site_url, std::nullopt);
}
// static
AgentClusterKey AgentClusterKey::CreateOriginKeyed(const url::Origin& origin) {
return AgentClusterKey(origin, std::nullopt);
}
// static
AgentClusterKey AgentClusterKey::CreateWithCrossOriginIsolationKey(
const url::Origin& origin,
const CrossOriginIsolationKey& isolation_key) {
return AgentClusterKey(origin, isolation_key);
}
AgentClusterKey::AgentClusterKey() : key_(GURL()) {}
AgentClusterKey::AgentClusterKey(const AgentClusterKey& other) = default;
AgentClusterKey::~AgentClusterKey() = default;
bool AgentClusterKey::IsSiteKeyed() const {
return std::holds_alternative<GURL>(key_);
}
bool AgentClusterKey::IsOriginKeyed() const {
return std::holds_alternative<url::Origin>(key_);
}
const GURL& AgentClusterKey::GetSite() const {
CHECK(IsSiteKeyed());
return std::get<GURL>(key_);
}
const url::Origin& AgentClusterKey::GetOrigin() const {
CHECK(IsOriginKeyed());
return std::get<url::Origin>(key_);
}
const std::optional<AgentClusterKey::CrossOriginIsolationKey>&
AgentClusterKey::GetCrossOriginIsolationKey() const {
return isolation_key_;
}
bool AgentClusterKey::IsCrossOriginIsolated() const {
if (!isolation_key_.has_value()) {
return false;
}
return isolation_key_->cross_origin_isolation_mode ==
CrossOriginIsolationMode::kConcrete;
}
bool AgentClusterKey::operator==(const AgentClusterKey& b) const = default;
bool AgentClusterKey::operator<(const AgentClusterKey& b) const {
if (GetCrossOriginIsolationKey().has_value() !=
b.GetCrossOriginIsolationKey().has_value()) {
return !GetCrossOriginIsolationKey().has_value();
}
if (GetCrossOriginIsolationKey().has_value() &&
GetCrossOriginIsolationKey() != b.GetCrossOriginIsolationKey()) {
if (GetCrossOriginIsolationKey()->cross_origin_isolation_mode !=
b.GetCrossOriginIsolationKey()->cross_origin_isolation_mode) {
return GetCrossOriginIsolationKey()->cross_origin_isolation_mode !=
CrossOriginIsolationMode::kConcrete;
}
return GetCrossOriginIsolationKey()->common_coi_origin <
b.GetCrossOriginIsolationKey()->common_coi_origin;
}
if (IsOriginKeyed() != b.IsOriginKeyed()) {
return !IsOriginKeyed();
}
if (IsOriginKeyed()) {
return GetOrigin() < b.GetOrigin();
}
return GetSite() < b.GetSite();
}
AgentClusterKey::AgentClusterKey(
const std::variant<GURL, url::Origin>& key,
const std::optional<CrossOriginIsolationKey>& isolation_key)
: key_(key), isolation_key_(isolation_key) {}
std::ostream& operator<<(std::ostream& out,
const AgentClusterKey& agent_cluster_key) {
out << "{";
if (agent_cluster_key.IsSiteKeyed()) {
out << "site_: ";
out << agent_cluster_key.GetSite();
} else {
out << "origin_: ";
out << agent_cluster_key.GetOrigin();
}
if (agent_cluster_key.GetCrossOriginIsolationKey().has_value()) {
out << ", cross_origin_isolation_key_: {common_coi_origin: ";
out << agent_cluster_key.GetCrossOriginIsolationKey()->common_coi_origin;
out << ", cross_origin_isolation_mode: ";
if (agent_cluster_key.GetCrossOriginIsolationKey()
->cross_origin_isolation_mode ==
CrossOriginIsolationMode::kConcrete) {
out << "concrete";
} else {
out << "logical";
}
out << "}";
}
out << "}";
return out;
}
} // namespace content