#ifndef CONTENT_BROWSER_BTM_BTM_STORAGE_H_
#define CONTENT_BROWSER_BTM_BTM_STORAGE_H_
#include <cstddef>
#include <map>
#include <string>
#include "base/files/file_path.h"
#include "base/functional/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "content/browser/btm/btm_database.h"
#include "content/browser/btm/btm_state.h"
#include "content/browser/btm/btm_utils.h"
#include "content/common/content_export.h"
#include "services/network/public/mojom/clear_data_filter.mojom-forward.h"
class GURL;
namespace content {
class CONTENT_EXPORT BtmStorage {
public:
explicit BtmStorage(const std::optional<base::FilePath>& path);
~BtmStorage();
BtmState Read(const GURL& url);
std::optional<PopupsStateValue> ReadPopup(const std::string& first_party_site,
const std::string& tracking_site);
std::vector<PopupWithTime> ReadRecentPopupsWithInteraction(
const base::TimeDelta& lookback);
bool WritePopup(const std::string& first_party_site,
const std::string& tracking_site,
const uint64_t access_id,
const base::Time& popup_time,
bool is_current_interaction,
bool is_authentication_interaction);
void RemoveEvents(base::Time delete_begin,
base::Time delete_end,
network::mojom::ClearDataFilterPtr filter,
const BtmEventRemovalType type);
void RemoveRows(const std::vector<std::string>& sites);
void RemoveRowsWithoutProtectiveEvent(const std::set<std::string>& sites);
void RecordUserActivation(const GURL& url, base::Time time);
void RecordWebAuthnAssertion(const GURL& url, base::Time time);
void RecordBounce(const GURL& url, base::Time time);
std::pair<std::set<std::string>, std::set<std::string>>
FilterSitesWithProtectiveEvent(const std::set<std::string>& sites) const;
std::set<std::string> FilterSitesWithoutProtectiveEvent(
std::set<std::string> sites) const;
std::vector<std::string> GetSitesThatBounced(
base::TimeDelta grace_period) const;
std::vector<std::string> GetSitesToClear(
std::optional<base::TimeDelta> grace_period) const;
bool DidSiteHaveUserActivationSince(const GURL& url, base::Time bound);
std::optional<base::Time> LastUserActivationTime(const GURL& url);
std::optional<base::Time> LastWebAuthnAssertionTime(const GURL& url);
std::optional<base::Time> LastUserActivationOrAuthnAssertionTime(
const GURL& url);
std::pair<std::optional<base::Time>, BtmInteractionType>
LastInteractionTimeAndType(const GURL& url);
std::optional<base::Time> GetTimerLastFired();
bool SetTimerLastFired(base::Time time);
static void DeleteDatabaseFiles(base::FilePath path,
base::OnceClosure on_complete);
void SetClockForTesting(base::Clock* clock) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
db_->SetClockForTesting(clock);
}
protected:
void Write(const BtmState& state);
private:
friend class BtmState;
BtmState ReadSite(std::string site);
std::unique_ptr<BtmDatabase> db_ GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<BtmStorage> weak_factory_{this};
};
}
#endif