#ifndef CONTENT_BROWSER_INTEREST_GROUP_AUCTION_RUNNER_H_
#define CONTENT_BROWSER_INTEREST_GROUP_AUCTION_RUNNER_H_
#include <map>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "content/browser/interest_group/auction_metrics_recorder.h"
#include "content/browser/interest_group/auction_nonce_manager.h"
#include "content/browser/interest_group/auction_worklet_manager.h"
#include "content/browser/interest_group/interest_group_auction.h"
#include "content/browser/interest_group/interest_group_auction_reporter.h"
#include "content/common/content_export.h"
#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom-forward.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "services/network/public/mojom/client_security_state.mojom.h"
#include "third_party/blink/public/common/interest_group/interest_group.h"
#include "third_party/blink/public/mojom/interest_group/ad_auction_service.mojom.h"
#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom.h"
#include "url/origin.h"
namespace blink {
struct AuctionConfig;
}
namespace content {
class AdAuctionPageData;
class InterestGroupAuctionReporter;
class BrowserContext;
class InterestGroupManagerImpl;
class PrivateAggregationManager;
struct DebugReportLockoutAndCooldowns;
class CONTENT_EXPORT AuctionRunner : public blink::mojom::AbortableAdAuction {
public:
static constexpr base::TimeDelta kPostAuctionInterestGroupUpdateDelay =
base::Seconds(3);
static constexpr base::TimeDelta kMaxReportingTimeout = base::Seconds(5);
using PrivateAggregationRequests =
std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr>;
using RunAuctionCallback = base::OnceCallback<void(
AuctionRunner* auction_runner,
bool aborted_by_script,
std::optional<blink::InterestGroupKey> winning_group_id,
std::optional<blink::AdSize> requested_ad_size,
std::optional<blink::AdDescriptor> ad_descriptor,
std::vector<blink::AdDescriptor> ad_component_descriptors,
std::vector<std::string> errors,
std::unique_ptr<InterestGroupAuctionReporter>
interest_group_auction_reporter,
bool contained_server_auction,
bool contained_on_device_auction,
AuctionResult result)>;
using IsInterestGroupApiAllowedCallback =
InterestGroupAuction::IsInterestGroupApiAllowedCallback;
using AreReportingOriginsAttestedCallback =
base::RepeatingCallback<bool(const std::vector<url::Origin>&)>;
using AdAuctionPageDataCallback =
base::RepeatingCallback<AdAuctionPageData*()>;
static std::unique_ptr<AuctionRunner> CreateAndStart(
AuctionMetricsRecorder* auction_metrics_recorder,
DwaAuctionMetricsManager* dwa_auction_metrics_manager,
AuctionWorkletManager* auction_worklet_manager,
AuctionNonceManager* auction_nonce_manager,
InterestGroupManagerImpl* interest_group_manager,
BrowserContext* browser_context,
PrivateAggregationManager* private_aggregation_manager,
AdAuctionPageDataCallback ad_auction_page_data_callback,
InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
log_private_aggregation_requests_callback,
const blink::AuctionConfig& auction_config,
const url::Origin& main_frame_origin,
const url::Origin& frame_origin,
std::optional<std::string> user_agent_override,
network::mojom::ClientSecurityStatePtr client_security_state,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
IsInterestGroupApiAllowedCallback is_interest_group_api_allowed_callback,
AreReportingOriginsAttestedCallback attestation_callback,
mojo::PendingReceiver<AbortableAdAuction> abort_receiver,
RunAuctionCallback callback);
explicit AuctionRunner(const AuctionRunner&) = delete;
AuctionRunner& operator=(const AuctionRunner&) = delete;
~AuctionRunner() override;
void ResolvedPromiseParam(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
blink::mojom::AuctionAdConfigField field,
const std::optional<std::string>& json_value) override;
void ResolvedPerBuyerSignalsPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
const std::optional<base::flat_map<url::Origin, std::string>>&
per_buyer_signals) override;
void ResolvedBuyerTkvSignalsPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
const url::Origin& buyer,
const std::optional<std::string>& buyer_tkv_signals) override;
void ResolvedBuyerTimeoutsPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
blink::mojom::AuctionAdConfigBuyerTimeoutField field,
const blink::AuctionConfig::BuyerTimeouts& buyer_timeouts) override;
void ResolvedBuyerCurrenciesPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
const blink::AuctionConfig::BuyerCurrencies& buyer_currencies) override;
void ResolvedDirectFromSellerSignalsPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
const std::optional<blink::DirectFromSellerSignals>&
direct_from_seller_signals) override;
void ResolvedDirectFromSellerSignalsHeaderAdSlotPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
const std::optional<std::string>&
direct_from_seller_signals_header_ad_slot) override;
void ResolvedDeprecatedRenderURLReplacementsPromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction,
const std::vector<blink::AuctionConfig::AdKeywordReplacement>&
deprecated_render_url_replacements) override;
void ResolvedAuctionAdResponsePromise(
blink::mojom::AuctionAdConfigAuctionIdPtr auction_id,
mojo_base::BigBuffer response) override;
void ResolvedAdditionalBids(
blink::mojom::AuctionAdConfigAuctionIdPtr auction) override;
void Abort() override;
void NormalizeReportingTimeouts();
void FailAuction(bool aborted_by_script,
blink::InterestGroupSet interest_groups_that_bid =
blink::InterestGroupSet());
private:
enum class State {
kNotYetStarted = 0,
kLoadingGroupsPhase = 1,
kBiddingAndScoringPhase = 2,
kSucceeded = 3,
kFailed = 4,
kMaxValue = kFailed
};
AuctionRunner(
AuctionMetricsRecorder* auction_metrics_recorder,
DwaAuctionMetricsManager* dwa_auction_metrics_manager,
AuctionWorkletManager* auction_worklet_manager,
AuctionNonceManager* auction_nonce_manager,
InterestGroupManagerImpl* interest_group_manager,
BrowserContext* browser_context,
PrivateAggregationManager* private_aggregation_manager,
AdAuctionPageDataCallback ad_auction_page_data_callback,
InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
log_private_aggregation_requests_callback,
auction_worklet::mojom::KAnonymityBidMode kanon_mode,
const blink::AuctionConfig& auction_config,
const url::Origin& main_frame_origin,
const url::Origin& frame_origin,
std::optional<std::string> user_agent_override,
network::mojom::ClientSecurityStatePtr client_security_state,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
IsInterestGroupApiAllowedCallback is_interest_group_api_allowed_callback,
AreReportingOriginsAttestedCallback attestation_callback,
mojo::PendingReceiver<AbortableAdAuction> abort_receiver,
RunAuctionCallback callback);
void StartAuction();
void OnLoadInterestGroupsComplete(bool success);
void OnLoadDebugReportLockoutAndCooldownsComplete(
std::optional<DebugReportLockoutAndCooldowns>
debug_report_lockout_and_cooldowns);
void OnBidsGeneratedAndScored(base::TimeTicks start_time, bool success);
void OnReportingPhaseComplete(
blink::InterestGroupSet interest_groups_that_bid,
bool success);
void UpdateInterestGroupsPostAuction();
void NotifyPromiseResolved(
const blink::mojom::AuctionAdConfigAuctionId& auction_id,
const blink::AuctionConfig& config);
data_decoder::DataDecoder* GetDataDecoder(const url::Origin& origin);
std::pair<bool, bool> IncludesServerAndOnDeviceAuctions();
const raw_ptr<InterestGroupManagerImpl> interest_group_manager_;
const raw_ptr<BrowserContext> browser_context_;
const raw_ptr<PrivateAggregationManager> private_aggregation_manager_;
const url::Origin main_frame_origin_;
const url::Origin frame_origin_;
const network::mojom::ClientSecurityStatePtr client_security_state_;
std::optional<std::string> user_agent_override_;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
IsInterestGroupApiAllowedCallback is_interest_group_api_allowed_callback_;
AdAuctionPageDataCallback ad_auction_page_data_callback_;
AreReportingOriginsAttestedCallback attestation_callback_;
mojo::Receiver<blink::mojom::AbortableAdAuction> abort_receiver_;
const auction_worklet::mojom::KAnonymityBidMode kanon_mode_;
std::unique_ptr<blink::AuctionConfig> owned_auction_config_;
RunAuctionCallback callback_;
int promise_fields_in_auction_config_;
InterestGroupAuction auction_;
State state_ = State::kNotYetStarted;
base::WeakPtrFactory<AuctionRunner> weak_ptr_factory_{this};
};
}
#endif