// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_METRICS_STRUCTURED_KEY_DATA_PREFS_DELEGATE_H_ #define COMPONENTS_METRICS_STRUCTURED_KEY_DATA_PREFS_DELEGATE_H_ #include #include #include #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "base/time/time.h" #include "components/metrics/structured/lib/key_data.h" #include "components/prefs/pref_service.h" namespace metrics::structured { class KeyDataPrefsDelegateTest; FORWARD_DECLARE_TEST(KeyDataPrefsDelegateTest, Purge); // Storages Structured Metrics key data in the devices preferences. // // The keys are stored as a dictionary keyed by the project name and the value // is a base::Value representation of KeyProto. // // Note: users are responsible for registering the preference. class KeyDataPrefsDelegate : public KeyData::StorageDelegate { public: KeyDataPrefsDelegate(PrefService* local_state, std::string_view pref_name); ~KeyDataPrefsDelegate() override; // KeyData::StorageDelegate: bool IsReady() const override; const KeyProto* GetKey(uint64_t project_name_hash) const override; void UpsertKey(uint64_t project_name_hash, base::TimeDelta last_key_rotation, base::TimeDelta key_rotation_period) override; void Purge() override; private: FRIEND_TEST_ALL_PREFIXES(KeyDataPrefsDelegateTest, Purge); void LoadKeysFromPrefs(); // Updates the prefs stored for |project_name_hash|. void UpdatePrefsByProject(uint64_t project_name_hash, const KeyProto& key_proto); raw_ptr local_state_; // Name of the preference to store the std::string pref_name_; // In-memory representation of the keys. Due to the StorageDelegate interface, // the prefs value is unable to be used directly. KeyDataProto proto_; SEQUENCE_CHECKER(sequence_checker_); }; } // namespace metrics::structured #endif // COMPONENTS_METRICS_STRUCTURED_KEY_DATA_PREFS_DELEGATE_H_