blob: 0ada0cbac14678bdc3b34f98df5a8eabcba2b113 [file] [log] [blame]
// Copyright 2023 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/interest_group/ad_auction_page_data.h"
#include "base/no_destructor.h"
#include "base/time/time.h"
#include "services/data_decoder/public/cpp/data_decoder.h"
namespace content {
AdAuctionPageData::AdAuctionPageData(Page& page)
: PageUserData<AdAuctionPageData>(page) {}
AdAuctionPageData::~AdAuctionPageData() = default;
PAGE_USER_DATA_KEY_IMPL(AdAuctionPageData);
void AdAuctionPageData::AddAuctionResultWitnessForOrigin(
const url::Origin& origin,
const std::string& response) {
origin_auction_result_map_[origin].insert(response);
}
bool AdAuctionPageData::WitnessedAuctionResultForOrigin(
const url::Origin& origin,
const std::string& response) const {
auto it = origin_auction_result_map_.find(origin);
if (it == origin_auction_result_map_.end()) {
return false;
}
return it->second.contains(response);
}
void AdAuctionPageData::AddAuctionSignalsWitnessForOrigin(
const url::Origin& origin,
const std::string& response) {
origin_auction_signals_map_[origin].insert(response);
}
const std::set<std::string>& AdAuctionPageData::GetAuctionSignalsForOrigin(
const url::Origin& origin) const {
auto it = origin_auction_signals_map_.find(origin);
if (it == origin_auction_signals_map_.end()) {
static base::NoDestructor<std::set<std::string>> kEmptySet;
return *kEmptySet;
}
return it->second;
}
void AdAuctionPageData::AddAuctionAdditionalBidsWitnessForOrigin(
const url::Origin& origin,
const std::map<std::string, std::vector<std::string>>&
nonce_additional_bids_map) {
CHECK(!nonce_additional_bids_map.empty());
std::map<std::string, std::vector<std::string>>&
existing_nonce_additional_bids_map =
origin_nonce_additional_bids_map_[origin];
for (const auto& [nonce, additional_bids] : nonce_additional_bids_map) {
CHECK(!additional_bids.empty());
std::vector<std::string>& existing_additional_bids =
existing_nonce_additional_bids_map[nonce];
existing_additional_bids.insert(existing_additional_bids.end(),
additional_bids.begin(),
additional_bids.end());
}
}
std::vector<std::string>
AdAuctionPageData::TakeAuctionAdditionalBidsForOriginAndNonce(
const url::Origin& origin,
const std::string& nonce) {
auto origin_map_it = origin_nonce_additional_bids_map_.find(origin);
if (origin_map_it == origin_nonce_additional_bids_map_.end()) {
return {};
}
std::map<std::string, std::vector<std::string>>& nonce_additional_bids_map =
origin_map_it->second;
auto nonce_map_it = nonce_additional_bids_map.find(nonce);
if (nonce_map_it == nonce_additional_bids_map.end()) {
return {};
}
auto extracted_nonce_and_additional_bids =
nonce_additional_bids_map.extract(nonce_map_it);
return std::move(extracted_nonce_and_additional_bids.mapped());
}
void AdAuctionPageData::RegisterAdAuctionRequestContext(
const base::Uuid& id,
AdAuctionRequestContext context) {
context_map_.insert(std::make_pair(id, std::move(context)));
}
AdAuctionRequestContext* AdAuctionPageData::GetContextForAdAuctionRequest(
const base::Uuid& id) {
auto it = context_map_.find(id);
if (it == context_map_.end()) {
return nullptr;
}
return &it->second;
}
AdAuctionRequestContext::AdAuctionRequestContext(
url::Origin seller,
base::flat_map<url::Origin, std::vector<std::string>> group_names,
quiche::ObliviousHttpRequest::Context context,
base::TimeTicks start_time)
: seller(std::move(seller)),
group_names(std::move(group_names)),
context(std::move(context)),
start_time(start_time),
decoder(std::make_unique<data_decoder::DataDecoder>()) {
decoder->GetService(); // pre-warm decoder.
}
AdAuctionRequestContext::AdAuctionRequestContext(
AdAuctionRequestContext&& other) = default;
AdAuctionRequestContext::~AdAuctionRequestContext() = default;
} // namespace content