#ifndef CONTENT_SERVICES_AUCTION_WORKLET_SELLER_WORKLET_H_
#define CONTENT_SERVICES_AUCTION_WORKLET_SELLER_WORKLET_H_
#include <stdint.h>
#include <list>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/services/auction_worklet/auction_v8_helper.h"
#include "content/services/auction_worklet/context_recycler.h"
#include "content/services/auction_worklet/direct_from_seller_signals_requester.h"
#include "content/services/auction_worklet/execution_mode_util.h"
#include "content/services/auction_worklet/public/mojom/auction_shared_storage_host.mojom.h"
#include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom.h"
#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h"
#include "content/services/auction_worklet/public/mojom/real_time_reporting.mojom.h"
#include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h"
#include "content/services/auction_worklet/trusted_signals.h"
#include "content/services/auction_worklet/trusted_signals_kvv2_manager.h"
#include "content/services/auction_worklet/trusted_signals_request_manager.h"
#include "content/services/auction_worklet/worklet_loader.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "third_party/blink/public/common/interest_group/ad_display_size.h"
#include "third_party/blink/public/common/interest_group/auction_config.h"
#include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom-forward.h"
#include "url/gurl.h"
#include "url/origin.h"
#include "v8/include/v8-persistent-handle.h"
namespace v8 {
class UnboundScript;
}
namespace auction_worklet {
class CONTENT_EXPORT SellerWorklet : public mojom::SellerWorklet {
public:
using ClosePipeCallback =
base::OnceCallback<void(const std::string& description)>;
using PrivateAggregationRequests =
std::vector<auction_worklet::mojom::PrivateAggregationRequestPtr>;
using RealTimeReportingContributions =
std::vector<auction_worklet::mojom::RealTimeReportingContributionPtr>;
using GetNextThreadIndexCallback = base::RepeatingCallback<size_t()>;
enum class SignalsOriginRelation {
kNoTrustedSignals,
kSameOriginSignals,
kUnknownPermissionCrossOriginSignals,
kPermittedCrossOriginSignals,
kForbiddenCrossOriginSignals,
kMaxValue = kForbiddenCrossOriginSignals
};
SellerWorklet(
std::vector<scoped_refptr<AuctionV8Helper>> v8_helpers,
std::vector<mojo::PendingRemote<mojom::AuctionSharedStorageHost>>
shared_storage_hosts,
bool pause_for_debugger_on_start,
mojo::PendingRemote<network::mojom::URLLoaderFactory>
pending_url_loader_factory,
mojo::PendingRemote<auction_worklet::mojom::AuctionNetworkEventsHandler>
auction_network_events_handler,
TrustedSignalsKVv2Manager* trusted_signals_kvv2_manager,
mojom::InProgressAuctionDownloadPtr decision_logic_load,
const std::optional<GURL>& trusted_scoring_signals_url,
const url::Origin& top_window_origin,
mojom::AuctionWorkletPermissionsPolicyStatePtr permissions_policy_state,
std::optional<uint16_t> experiment_group_id,
std::optional<bool> send_creative_scanning_metadata,
mojom::TrustedSignalsPublicKeyPtr public_key,
GetNextThreadIndexCallback next_thread_index_callback,
mojo::PendingRemote<auction_worklet::mojom::LoadSellerWorkletClient>
load_seller_worklet_client);
explicit SellerWorklet(const SellerWorklet&) = delete;
SellerWorklet& operator=(const SellerWorklet&) = delete;
~SellerWorklet() override;
void set_close_pipe_callback(ClosePipeCallback close_pipe_callback) {
close_pipe_callback_ = std::move(close_pipe_callback);
}
std::vector<int> context_group_ids_for_testing() const;
void ScoreAd(
const std::string& ad_metadata_json,
double bid,
const std::optional<blink::AdCurrency>& bid_currency,
const blink::AuctionConfig::NonSharedParams&
auction_ad_config_non_shared_params,
mojom::TrustedSignalsCacheKeyPtr trusted_signals_cache_key,
mojom::CreativeInfoWithoutOwnerPtr ad,
std::vector<mojom::CreativeInfoWithoutOwnerPtr> ad_components,
const std::optional<GURL>& direct_from_seller_seller_signals,
const std::optional<std::string>&
direct_from_seller_seller_signals_header_ad_slot,
const std::optional<GURL>& direct_from_seller_auction_signals,
const std::optional<std::string>&
direct_from_seller_auction_signals_header_ad_slot,
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller,
const std::optional<blink::AdCurrency>& component_expect_bid_currency,
const url::Origin& browser_signal_interest_group_owner,
const std::optional<std::string>&
browser_signal_selected_buyer_and_seller_reporting_id,
const std::optional<std::string>&
browser_signal_buyer_and_seller_reporting_id,
uint32_t browser_signal_bidding_duration_msecs,
bool browser_signal_for_debugging_only_in_cooldown_or_lockout,
bool browser_signal_for_debugging_only_sampling,
const std::optional<base::TimeDelta> seller_timeout,
uint64_t group_by_origin_id,
bool allow_group_by_origin_mode,
uint64_t trace_id,
const url::Origin& bidder_joining_origin,
mojo::PendingRemote<auction_worklet::mojom::ScoreAdClient>
score_ad_client) override;
void SendPendingSignalsRequests() override;
void ReportResult(
const blink::AuctionConfig::NonSharedParams&
auction_ad_config_non_shared_params,
const std::optional<GURL>& direct_from_seller_seller_signals,
const std::optional<std::string>&
direct_from_seller_seller_signals_header_ad_slot,
const std::optional<GURL>& direct_from_seller_auction_signals,
const std::optional<std::string>&
direct_from_seller_auction_signals_header_ad_slot,
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller,
const url::Origin& browser_signal_interest_group_owner,
const std::optional<std::string>&
browser_signal_buyer_and_seller_reporting_id,
const std::optional<std::string>&
browser_signal_selected_buyer_and_seller_reporting_id,
const GURL& browser_signal_render_url,
double browser_signal_bid,
const std::optional<blink::AdCurrency>& browser_signal_bid_currency,
double browser_signal_desirability,
double browser_signal_highest_scoring_other_bid,
const std::optional<blink::AdCurrency>&
browser_signal_highest_scoring_other_bid_currency,
auction_worklet::mojom::ComponentAuctionReportResultParamsPtr
browser_signals_component_auction_report_result_params,
std::optional<uint32_t> scoring_signals_data_version,
uint64_t trace_id,
ReportResultCallback callback) override;
void ConnectDevToolsAgent(
mojo::PendingAssociatedReceiver<blink::mojom::DevToolsAgent> agent,
uint32_t thread_index) override;
private:
struct ScoreAdTask {
ScoreAdTask();
~ScoreAdTask();
base::CancelableTaskTracker::TaskId context_prep_task_id =
base::CancelableTaskTracker::kBadTaskId;
base::CancelableTaskTracker::TaskId task_id =
base::CancelableTaskTracker::kBadTaskId;
std::string ad_metadata_json;
double bid;
std::optional<blink::AdCurrency> bid_currency;
blink::AuctionConfig::NonSharedParams auction_ad_config_non_shared_params;
mojom::CreativeInfoWithoutOwnerPtr ad;
std::vector<mojom::CreativeInfoWithoutOwnerPtr> ad_components;
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller;
std::optional<blink::AdCurrency> component_expect_bid_currency;
url::Origin browser_signal_interest_group_owner;
url::Origin bidder_joining_origin;
std::optional<std::string>
browser_signal_selected_buyer_and_seller_reporting_id;
std::optional<std::string> browser_signal_buyer_and_seller_reporting_id;
uint32_t browser_signal_bidding_duration_msecs;
bool browser_signal_for_debugging_only_in_cooldown_or_lockout;
bool browser_signal_for_debugging_only_sampling;
std::optional<base::TimeDelta> seller_timeout;
uint64_t group_by_origin_id;
bool allow_group_by_origin_mode;
uint64_t trace_id;
base::TimeTicks trace_wait_deps_start;
base::TimeDelta wait_code;
base::TimeDelta wait_trusted_signals;
base::TimeDelta wait_direct_from_seller_signals;
base::TimeTicks score_ad_start_time;
mojo::Remote<auction_worklet::mojom::ScoreAdClient> score_ad_client;
std::unique_ptr<TrustedSignalsRequestManager::Request>
trusted_scoring_signals_request;
std::unique_ptr<TrustedSignalsKVv2Manager::Request>
trusted_scoring_signals_kvv2_request;
scoped_refptr<TrustedSignals::Result> trusted_scoring_signals_result;
bool waiting_for_signals_fetch = false;
bool trusted_bidding_signals_fetch_failed = false;
std::optional<std::string> trusted_scoring_signals_error_msg;
std::unique_ptr<DirectFromSellerSignalsRequester::Request>
direct_from_seller_request_seller_signals;
std::unique_ptr<DirectFromSellerSignalsRequester::Request>
direct_from_seller_request_auction_signals;
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_seller_signals;
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_auction_signals;
std::optional<std::string> direct_from_seller_seller_signals_header_ad_slot;
std::optional<std::string>
direct_from_seller_auction_signals_header_ad_slot;
size_t thread;
};
using ScoreAdTaskList = std::list<ScoreAdTask>;
struct ReportResultTask {
ReportResultTask();
~ReportResultTask();
blink::AuctionConfig::NonSharedParams auction_ad_config_non_shared_params;
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller;
url::Origin browser_signal_interest_group_owner;
std::optional<std::string> browser_signal_buyer_and_seller_reporting_id;
std::optional<std::string>
browser_signal_selected_buyer_and_seller_reporting_id;
GURL browser_signal_render_url;
double browser_signal_bid;
std::optional<blink::AdCurrency> browser_signal_bid_currency;
double browser_signal_desirability;
double browser_signal_highest_scoring_other_bid;
std::optional<blink::AdCurrency>
browser_signal_highest_scoring_other_bid_currency;
auction_worklet::mojom::ComponentAuctionReportResultParamsPtr
browser_signals_component_auction_report_result_params;
std::optional<uint32_t> scoring_signals_data_version;
uint64_t trace_id;
base::TimeTicks trace_wait_deps_start;
base::TimeDelta wait_code;
base::TimeDelta wait_direct_from_seller_signals;
std::unique_ptr<DirectFromSellerSignalsRequester::Request>
direct_from_seller_request_seller_signals;
std::unique_ptr<DirectFromSellerSignalsRequester::Request>
direct_from_seller_request_auction_signals;
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_seller_signals;
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_auction_signals;
std::optional<std::string> direct_from_seller_seller_signals_header_ad_slot;
std::optional<std::string>
direct_from_seller_auction_signals_header_ad_slot;
ReportResultCallback callback;
};
using ReportResultTaskList = std::list<ReportResultTask>;
class V8State {
public:
using ScoreAdCallbackInternal = base::OnceCallback<void(
double score,
mojom::RejectReason reject_reason,
mojom::ComponentAuctionModifiedBidParamsPtr
component_auction_modified_bid_params,
std::optional<double> bid_in_seller_currency,
std::optional<uint32_t> scoring_signals_data_version,
std::optional<GURL> debug_loss_report_url,
std::optional<GURL> debug_win_report_url,
PrivateAggregationRequests pa_requests,
RealTimeReportingContributions real_time_contributions,
base::TimeDelta scoring_latency,
bool script_timed_out,
std::vector<std::string> errors)>;
using ReportResultCallbackInternal =
base::OnceCallback<void(std::optional<std::string> signals_for_winner,
std::optional<GURL> report_url,
base::flat_map<std::string, GURL> ad_beacon_map,
PrivateAggregationRequests pa_requests,
base::TimeDelta reporting_latency,
bool script_timed_out,
std::vector<std::string> errors)>;
V8State(
scoped_refptr<AuctionV8Helper> v8_helper,
scoped_refptr<AuctionV8Helper::DebugId> debug_id,
mojo::PendingRemote<mojom::AuctionSharedStorageHost>
shared_storage_host_remote,
const GURL& decision_logic_url,
const std::optional<GURL>& trusted_scoring_signals_url,
const std::optional<url::Origin>& trusted_scoring_signals_origin,
const url::Origin& top_window_origin,
mojom::AuctionWorkletPermissionsPolicyStatePtr permissions_policy_state,
std::optional<uint16_t> experiment_group_id,
std::optional<bool> send_creative_scanning_metadata,
base::WeakPtr<SellerWorklet> parent);
void SetWorkletScript(WorkletLoader::Result worklet_script,
SignalsOriginRelation trusted_signals_relation);
void ScoreAd(
const std::string& ad_metadata_json,
double bid,
const std::optional<blink::AdCurrency>& bid_currency,
const blink::AuctionConfig::NonSharedParams&
auction_ad_config_non_shared_params,
mojom::CreativeInfoWithoutOwnerPtr ad,
std::vector<mojom::CreativeInfoWithoutOwnerPtr> ad_components,
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_seller_signals,
const std::optional<std::string>&
direct_from_seller_seller_signals_header_ad_slot,
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_auction_signals,
const std::optional<std::string>&
direct_from_seller_auction_signals_header_ad_slot,
scoped_refptr<TrustedSignals::Result> trusted_scoring_signals,
bool trusted_scoring_signals_fetch_failed,
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller,
const std::optional<blink::AdCurrency>& component_expect_bid_currency,
const url::Origin& browser_signal_interest_group_owner,
const std::optional<std::string>&
browser_signal_selected_buyer_and_seller_reporting_id,
const std::optional<std::string>&
browser_signal_buyer_and_seller_reporting_id,
uint32_t browser_signal_bidding_duration_msecs,
bool browser_signal_for_debugging_only_in_cooldown_or_lockout,
bool browser_signal_for_debugging_only_sampling,
const std::optional<base::TimeDelta> seller_timeout,
uint64_t group_by_origin_id,
bool allow_group_by_origin_mode,
uint64_t trace_id,
base::ScopedClosureRunner cleanup_score_ad_task,
base::TimeTicks task_enqueued_time,
ScoreAdCallbackInternal callback);
void ReportResult(
const blink::AuctionConfig::NonSharedParams&
auction_ad_config_non_shared_params,
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_seller_signals,
const std::optional<std::string>&
direct_from_seller_seller_signals_header_ad_slot,
DirectFromSellerSignalsRequester::Result
direct_from_seller_result_auction_signals,
const std::optional<std::string>&
direct_from_seller_auction_signals_header_ad_slot,
mojom::ComponentAuctionOtherSellerPtr browser_signals_other_seller,
const url::Origin& browser_signal_interest_group_owner,
const std::optional<std::string>&
browser_signal_buyer_and_seller_reporting_id,
const std::optional<std::string>&
browser_signal_selected_buyer_and_seller_reporting_id,
const GURL& browser_signal_render_url,
double browser_signal_bid,
const std::optional<blink::AdCurrency>& browser_signal_bid_currency,
double browser_signal_desirability,
double browser_signal_highest_scoring_other_bid,
const std::optional<blink::AdCurrency>&
browser_signal_highest_scoring_other_bid_currency,
auction_worklet::mojom::ComponentAuctionReportResultParamsPtr
browser_signals_component_auction_report_result_params,
std::optional<uint32_t> scoring_signals_data_version,
uint64_t trace_id,
ReportResultCallbackInternal callback);
void ConnectDevToolsAgent(
mojo::PendingAssociatedReceiver<blink::mojom::DevToolsAgent> agent);
void PrepareContextRecycler(uint64_t trace_id);
private:
friend class base::DeleteHelper<V8State>;
~V8State();
void FinishInit(mojo::PendingRemote<mojom::AuctionSharedStorageHost>
shared_storage_host_remote);
void PostScoreAdCallbackToUserThreadOnError(
ScoreAdCallbackInternal callback,
base::TimeDelta scoring_latency,
bool script_timed_out,
std::vector<std::string> errors,
PrivateAggregationRequests pa_requests = {},
RealTimeReportingContributions real_time_contributions = {});
void PostScoreAdCallbackToUserThread(
ScoreAdCallbackInternal callback,
double score,
mojom::RejectReason reject_reason,
mojom::ComponentAuctionModifiedBidParamsPtr
component_auction_modified_bid_params,
std::optional<double> bid_in_seller_currency,
std::optional<uint32_t> scoring_signals_data_version,
std::optional<GURL> debug_loss_report_url,
std::optional<GURL> debug_win_report_url,
PrivateAggregationRequests pa_requests,
RealTimeReportingContributions real_time_contributions,
base::TimeDelta scoring_latency,
bool script_timed_out,
std::vector<std::string> errors);
void PostReportResultCallbackToUserThread(
ReportResultCallbackInternal callback,
std::optional<std::string> signals_for_winner,
std::optional<GURL> report_url,
base::flat_map<std::string, GURL> ad_beacon_map,
PrivateAggregationRequests pa_requests,
base::TimeDelta reporting_latency,
bool script_timed_out,
std::vector<std::string> errors);
static void PostResumeToUserThread(
base::WeakPtr<SellerWorklet> parent,
scoped_refptr<base::SequencedTaskRunner> user_thread);
std::unique_ptr<ContextRecycler> CreateContextRecyclerAndRunTopLevel(
uint64_t trace_id,
AuctionV8Helper::TimeLimit& total_timeout,
bool should_deep_freeze,
bool& script_timed_out,
std::vector<std::string>& errors_out);
const scoped_refptr<AuctionV8Helper> v8_helper_;
const scoped_refptr<AuctionV8Helper::DebugId> debug_id_;
const base::WeakPtr<SellerWorklet> parent_;
const scoped_refptr<base::SequencedTaskRunner> user_thread_;
v8::Global<v8::UnboundScript> worklet_script_;
const GURL decision_logic_url_;
const std::optional<GURL> trusted_scoring_signals_url_;
const std::optional<url::Origin> trusted_scoring_signals_origin_;
SignalsOriginRelation trusted_signals_relation_ =
SignalsOriginRelation::kNoTrustedSignals;
const url::Origin top_window_origin_;
mojom::AuctionWorkletPermissionsPolicyStatePtr permissions_policy_state_;
const std::optional<uint16_t> experiment_group_id_;
std::optional<bool> send_creative_scanning_metadata_;
const bool creative_scanning_enabled_;
mojo::Remote<mojom::AuctionSharedStorageHost> shared_storage_host_remote_;
ExecutionModeHelper execution_mode_helper_;
std::vector<std::tuple<std::unique_ptr<ContextRecycler>,
bool,
std::vector<std::string>>>
unused_context_recyclers_;
SEQUENCE_CHECKER(v8_sequence_checker_);
};
void ResumeIfPaused();
void Start();
void OnDownloadComplete(std::vector<WorkletLoader::Result> worklet_scripts,
std::optional<std::string> error_msg);
void MaybeRecordCodeWait();
void OnGotCrossOriginTrustedSignalsPermissions(
std::vector<url::Origin> permit_origins);
void StartFetchingSignalsForTask(ScoreAdTaskList::iterator score_ad_task);
void OnTrustedScoringSignalsDownloaded(
ScoreAdTaskList::iterator task,
scoped_refptr<TrustedSignals::Result> result,
std::optional<std::string> error_msg);
void OnScoreAdClientDestroyed(ScoreAdTaskList::iterator task);
void OnDirectFromSellerSellerSignalsDownloadedScoreAd(
ScoreAdTaskList::iterator task,
DirectFromSellerSignalsRequester::Result result);
void OnDirectFromSellerAuctionSignalsDownloadedScoreAd(
ScoreAdTaskList::iterator task,
DirectFromSellerSignalsRequester::Result result);
bool ScoreAdTaskHasInputs(const SellerWorklet::ScoreAdTask& task) const;
bool IsReadyToScoreAd(const ScoreAdTask& task) const;
void SetEagerJsCompilation(bool eagerly_compile_js);
void ScoreAdIfReady(const ScoreAdTaskList::iterator task);
void DeliverScoreAdCallbackOnUserThread(
ScoreAdTaskList::iterator task,
double score,
mojom::RejectReason reject_reason,
mojom::ComponentAuctionModifiedBidParamsPtr
component_auction_modified_bid_params,
std::optional<double> bid_in_seller_currency,
std::optional<uint32_t> scoring_signals_data_version,
std::optional<GURL> debug_loss_report_url,
std::optional<GURL> debug_win_report_url,
PrivateAggregationRequests pa_requests,
RealTimeReportingContributions real_time_contributions,
base::TimeDelta scoring_latency,
bool script_timed_out,
std::vector<std::string> errors);
void CleanUpScoreAdTaskOnUserThread(ScoreAdTaskList::iterator task);
void OnDirectFromSellerSellerSignalsDownloadedReportResult(
ReportResultTaskList::iterator task,
DirectFromSellerSignalsRequester::Result result);
void OnDirectFromSellerAuctionSignalsDownloadedReportResult(
ReportResultTaskList::iterator task,
DirectFromSellerSignalsRequester::Result result);
bool IsReadyToReportResult(const ReportResultTask& task) const;
void RunReportResultIfReady(ReportResultTaskList::iterator task);
void DeliverReportResultCallbackOnUserThread(
ReportResultTaskList::iterator task,
std::optional<std::string> signals_for_winner,
std::optional<GURL> report_url,
base::flat_map<std::string, GURL> ad_beacon_map,
PrivateAggregationRequests pa_requests,
base::TimeDelta reporting_latency,
bool script_timed_out,
std::vector<std::string> errors);
bool IsCodeReady() const;
std::vector<scoped_refptr<base::SequencedTaskRunner>> v8_runners_;
std::vector<scoped_refptr<AuctionV8Helper>> v8_helpers_;
std::vector<scoped_refptr<AuctionV8Helper::DebugId>> debug_ids_;
mojo::Remote<network::mojom::URLLoaderFactory> url_loader_factory_;
raw_ptr<TrustedSignalsKVv2Manager> trusted_signals_kvv2_manager_;
const GURL script_source_url_;
mojom::InProgressAuctionDownloadPtr script_source_load_;
mojom::TrustedSignalsPublicKeyPtr public_key_;
std::optional<bool> send_creative_scanning_metadata_;
std::unique_ptr<TrustedSignalsRequestManager>
trusted_signals_request_manager_;
std::optional<base::TimeTicks> first_deferred_trusted_signals_time_;
const std::optional<url::Origin> trusted_scoring_signals_origin_;
SignalsOriginRelation trusted_signals_relation_ =
SignalsOriginRelation::kNoTrustedSignals;
DirectFromSellerSignalsRequester direct_from_seller_requester_seller_signals_;
DirectFromSellerSignalsRequester
direct_from_seller_requester_auction_signals_;
bool paused_;
size_t resumed_count_ = 0;
ScoreAdTaskList score_ad_tasks_;
ReportResultTaskList report_result_tasks_;
std::unique_ptr<WorkletLoader> worklet_loader_;
base::TimeTicks code_download_start_;
std::optional<base::TimeDelta> js_fetch_latency_;
std::vector<std::unique_ptr<V8State, base::OnTaskRunnerDeleter>> v8_state_;
ClosePipeCallback close_pipe_callback_;
std::optional<std::string> load_script_error_msg_;
base::CancelableTaskTracker cancelable_task_tracker_;
mojo::Remote<auction_worklet::mojom::AuctionNetworkEventsHandler>
auction_network_events_handler_;
GetNextThreadIndexCallback get_next_thread_index_callback_;
mojo::PendingRemote<auction_worklet::mojom::LoadSellerWorkletClient>
load_seller_worklet_client_;
SEQUENCE_CHECKER(user_sequence_checker_);
base::WeakPtrFactory<SellerWorklet> weak_ptr_factory_{this};
};
}
#endif