#include "content/browser/private_aggregation/private_aggregation_budgeter.h"
#include <stdint.h>
#include <algorithm>
#include <functional>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "base/check.h"
#include "base/check_op.h"
#include "base/files/file_path.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/metrics/histogram_functions.h"
#include "base/notreached.h"
#include "base/numerics/checked_math.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/updateable_sequenced_task_runner.h"
#include "base/time/time.h"
#include "content/browser/private_aggregation/private_aggregation_budget_key.h"
#include "content/browser/private_aggregation/private_aggregation_budget_storage.h"
#include "content/browser/private_aggregation/proto/private_aggregation_budgets.pb.h"
#include "content/public/browser/private_aggregation_data_model.h"
#include "net/base/schemeful_site.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/common/storage_key/storage_key.h"
#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
namespace {
ValidityStatus;
int64_t SerializeTimeForStorage(base::Time time) { … }
void RecordBudgetValidity(ValidityStatus status) { … }
void ComputeAndRecordBudgetValidity(
google::protobuf::RepeatedPtrField<proto::PrivateAggregationBudgetEntry>*
budget_entries,
int64_t earliest_window_in_larger_scope_start,
int64_t current_window_start) { … }
google::protobuf::RepeatedPtrField<proto::PrivateAggregationBudgetEntry>*
GetBudgetEntries(PrivateAggregationBudgetKey::Api api,
proto::PrivateAggregationBudgets& budgets) { … }
bool CleanUpStaleBudgetEntries(
google::protobuf::RepeatedPtrField<proto::PrivateAggregationBudgetEntry>*
budget_entries,
const int64_t earliest_window_in_larger_scope_start) { … }
bool CleanUpStaleReportingOrigins(
google::protobuf::RepeatedPtrField<proto::ReportingOrigin>*
reporting_origins,
const int64_t earliest_window_in_larger_scope_start) { … }
int64_t CalculateEarliestWindowStartInScope(
int64_t current_window_start,
base::TimeDelta budget_scope_duration) { … }
PrivateAggregationBudgeter::RequestResult TestBudgetUsageAgainstLimits(
base::CheckedNumeric<int> total_budget_used_smaller_scope,
base::CheckedNumeric<int> total_budget_used_larger_scope) { … }
}
PrivateAggregationBudgeter::PrivateAggregationBudgeter(
scoped_refptr<base::UpdateableSequencedTaskRunner> db_task_runner,
bool exclusively_run_in_memory,
const base::FilePath& path_to_db_dir)
: … { … }
PrivateAggregationBudgeter::PrivateAggregationBudgeter() = default;
PrivateAggregationBudgeter::~PrivateAggregationBudgeter() { … }
void PrivateAggregationBudgeter::EnsureStorageInitializationBegun() { … }
void PrivateAggregationBudgeter::InitializeStorage(
bool exclusively_run_in_memory,
base::FilePath path_to_db_dir) { … }
void PrivateAggregationBudgeter::ConsumeBudget(
int budget,
const PrivateAggregationBudgetKey& budget_key,
base::OnceCallback<void(RequestResult)> on_done) { … }
void PrivateAggregationBudgeter::ConsumeBudget(
int budget,
const PrivateAggregationBudgetKey& budget_key,
int minimum_value_for_metrics,
base::OnceCallback<void(RequestResult)> on_done) { … }
void PrivateAggregationBudgeter::OnUserVisibleTaskStarted() { … }
void PrivateAggregationBudgeter::ClearData(
base::Time delete_begin,
base::Time delete_end,
StoragePartition::StorageKeyMatcherFunction filter,
base::OnceClosure done) { … }
void PrivateAggregationBudgeter::OnUserVisibleTaskComplete() { … }
void PrivateAggregationBudgeter::OnStorageDoneInitializing(
std::unique_ptr<PrivateAggregationBudgetStorage> storage) { … }
void PrivateAggregationBudgeter::ProcessAllPendingCalls() { … }
void PrivateAggregationBudgeter::GetAllDataKeys(
base::OnceCallback<void(std::set<PrivateAggregationDataModel::DataKey>)>
callback) { … }
void PrivateAggregationBudgeter::GetAllDataKeysImpl(
base::OnceCallback<void(std::set<PrivateAggregationDataModel::DataKey>)>
callback) { … }
void PrivateAggregationBudgeter::DeleteByDataKey(
const PrivateAggregationDataModel::DataKey& key,
base::OnceClosure callback) { … }
void PrivateAggregationBudgeter::ConsumeBudgetImpl(
int additional_budget,
const PrivateAggregationBudgetKey& budget_key,
int minimum_value_for_metrics,
base::OnceCallback<void(RequestResult)> on_done) { … }
void PrivateAggregationBudgeter::ClearDataImpl(
base::Time delete_begin,
base::Time delete_end,
StoragePartition::StorageKeyMatcherFunction filter,
base::OnceClosure done) { … }
void PrivateAggregationBudgeter::CleanUpStaleDataSoon() { … }
void PrivateAggregationBudgeter::CleanUpStaleData() { … }
bool PrivateAggregationBudgeter::DidStorageInitializationSucceed() { … }
}