#ifndef COMPONENTS_DOMAIN_RELIABILITY_CONTEXT_H_
#define COMPONENTS_DOMAIN_RELIABILITY_CONTEXT_H_
#include <stddef.h>
#include <list>
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "components/domain_reliability/beacon.h"
#include "components/domain_reliability/config.h"
#include "components/domain_reliability/domain_reliability_export.h"
#include "components/domain_reliability/scheduler.h"
#include "components/domain_reliability/uploader.h"
#include "net/base/isolation_info.h"
class GURL;
namespace base {
class Value;
}
namespace domain_reliability {
class DomainReliabilityDispatcher;
class DomainReliabilityUploader;
class MockableTime;
class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContext {
public:
static const int kMaxUploadDepthToSchedule;
using UploadAllowedCallback =
base::RepeatingCallback<void(const url::Origin&,
base::OnceCallback<void(bool)>)>;
DomainReliabilityContext(
const MockableTime* time,
const DomainReliabilityScheduler::Params& scheduler_params,
const std::string& upload_reporter_string,
const base::TimeTicks* last_network_change_time,
const UploadAllowedCallback& upload_allowed_callback,
DomainReliabilityDispatcher* dispatcher,
DomainReliabilityUploader* uploader,
std::unique_ptr<const DomainReliabilityConfig> config);
DomainReliabilityContext(const DomainReliabilityContext&) = delete;
DomainReliabilityContext& operator=(const DomainReliabilityContext&) = delete;
~DomainReliabilityContext();
void OnBeacon(std::unique_ptr<DomainReliabilityBeacon> beacon);
void ClearBeacons();
void GetQueuedBeaconsForTesting(
std::vector<const DomainReliabilityBeacon*>* beacons_out) const;
const DomainReliabilityConfig& config() const { return *config_.get(); }
static const size_t kMaxQueuedBeacons;
private:
void ScheduleUpload(base::TimeDelta min_delay, base::TimeDelta max_delay);
void CallUploadAllowedCallback();
void OnUploadAllowedCallbackComplete(bool allowed);
void StartUpload();
void OnUploadComplete(const DomainReliabilityUploader::UploadResult& result);
base::Value CreateReport(base::TimeTicks upload_time,
const GURL& collector_url,
int* max_beacon_depth_out);
void CommitUpload();
void RollbackUpload();
void RemoveOldestBeacon();
void RemoveExpiredBeacons();
int GetMinBeaconUploadDepth() const;
std::unique_ptr<const DomainReliabilityConfig> config_;
raw_ptr<const MockableTime> time_;
const raw_ref<const std::string> upload_reporter_string_;
DomainReliabilityScheduler scheduler_;
raw_ptr<DomainReliabilityDispatcher> dispatcher_;
raw_ptr<DomainReliabilityUploader> uploader_;
std::list<std::unique_ptr<DomainReliabilityBeacon>> beacons_;
size_t uploading_beacons_size_;
net::IsolationInfo uploading_beacons_isolation_info_;
base::TimeTicks upload_time_;
base::TimeTicks last_upload_time_;
raw_ptr<const base::TimeTicks> last_network_change_time_;
const raw_ref<const UploadAllowedCallback> upload_allowed_callback_;
base::WeakPtrFactory<DomainReliabilityContext> weak_factory_{this};
};
}
#endif