1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_PREFS_PREF_REGISTRY_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_REGISTRY_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <set> 11*6777b538SAndroid Build Coastguard Worker #include <unordered_map> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 14*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_value_map.h" 15*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace base { 18*6777b538SAndroid Build Coastguard Worker class Value; 19*6777b538SAndroid Build Coastguard Worker } 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker class DefaultPrefStore; 22*6777b538SAndroid Build Coastguard Worker class PrefStore; 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker // Preferences need to be registered with a type and default value 25*6777b538SAndroid Build Coastguard Worker // before they are used. 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // The way you use a PrefRegistry is that you register all required 28*6777b538SAndroid Build Coastguard Worker // preferences on it (via one of its subclasses), then pass it as a 29*6777b538SAndroid Build Coastguard Worker // construction parameter to PrefService. 30*6777b538SAndroid Build Coastguard Worker // 31*6777b538SAndroid Build Coastguard Worker // Currently, registrations after constructing the PrefService will 32*6777b538SAndroid Build Coastguard Worker // also work, but this is being deprecated. 33*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefRegistry 34*6777b538SAndroid Build Coastguard Worker : public base::RefCounted<PrefRegistry> { 35*6777b538SAndroid Build Coastguard Worker public: 36*6777b538SAndroid Build Coastguard Worker // Registration flags that can be specified which impact how the pref will 37*6777b538SAndroid Build Coastguard Worker // behave or be stored. This will be passed in a bitmask when the pref is 38*6777b538SAndroid Build Coastguard Worker // registered. Subclasses of PrefRegistry can specify their own flags. Care 39*6777b538SAndroid Build Coastguard Worker // must be taken to ensure none of these overlap with the flags below. 40*6777b538SAndroid Build Coastguard Worker using PrefRegistrationFlags = uint32_t; 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // No flags are specified. 43*6777b538SAndroid Build Coastguard Worker static constexpr PrefRegistrationFlags NO_REGISTRATION_FLAGS = 0; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker // The first 8 bits are reserved for subclasses of PrefRegistry to use. 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard Worker // This marks the pref as "lossy". There is no strict time guarantee on when 48*6777b538SAndroid Build Coastguard Worker // a lossy pref will be persisted to permanent storage when it is modified. 49*6777b538SAndroid Build Coastguard Worker static constexpr PrefRegistrationFlags LOSSY_PREF = 1 << 8; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Registering a pref as public allows other services to access it. 52*6777b538SAndroid Build Coastguard Worker static constexpr PrefRegistrationFlags PUBLIC = 1 << 9; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker typedef PrefValueMap::const_iterator const_iterator; 55*6777b538SAndroid Build Coastguard Worker typedef std::unordered_map<std::string, uint32_t> PrefRegistrationFlagsMap; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker PrefRegistry(); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker PrefRegistry(const PrefRegistry&) = delete; 60*6777b538SAndroid Build Coastguard Worker PrefRegistry& operator=(const PrefRegistry&) = delete; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Retrieve the set of registration flags for the given preference. The return 63*6777b538SAndroid Build Coastguard Worker // value is a bitmask of PrefRegistrationFlags. 64*6777b538SAndroid Build Coastguard Worker uint32_t GetRegistrationFlags(const std::string& pref_name) const; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Gets the registered defaults. 67*6777b538SAndroid Build Coastguard Worker scoped_refptr<PrefStore> defaults(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Allows iteration over defaults. 70*6777b538SAndroid Build Coastguard Worker const_iterator begin() const; 71*6777b538SAndroid Build Coastguard Worker const_iterator end() const; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // Changes the default value for a preference. 74*6777b538SAndroid Build Coastguard Worker // 75*6777b538SAndroid Build Coastguard Worker // |pref_name| must be a previously registered preference. 76*6777b538SAndroid Build Coastguard Worker void SetDefaultPrefValue(const std::string& pref_name, base::Value value); 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // Registers a pref owned by another service for use with the current service. 79*6777b538SAndroid Build Coastguard Worker // The owning service must register that pref with the |PUBLIC| flag. 80*6777b538SAndroid Build Coastguard Worker void RegisterForeignPref(const std::string& path); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // Sets the default value and flags of a previously-registered foreign pref 83*6777b538SAndroid Build Coastguard Worker // value. 84*6777b538SAndroid Build Coastguard Worker void SetDefaultForeignPrefValue(const std::string& path, 85*6777b538SAndroid Build Coastguard Worker base::Value default_value, 86*6777b538SAndroid Build Coastguard Worker uint32_t flags); 87*6777b538SAndroid Build Coastguard Worker foreign_pref_keys()88*6777b538SAndroid Build Coastguard Worker const std::set<std::string>& foreign_pref_keys() const { 89*6777b538SAndroid Build Coastguard Worker return foreign_pref_keys_; 90*6777b538SAndroid Build Coastguard Worker } 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker protected: 93*6777b538SAndroid Build Coastguard Worker friend class base::RefCounted<PrefRegistry>; 94*6777b538SAndroid Build Coastguard Worker virtual ~PrefRegistry(); 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // Used by subclasses to register a default value and registration flags for 97*6777b538SAndroid Build Coastguard Worker // a preference. |flags| is a bitmask of |PrefRegistrationFlags|. 98*6777b538SAndroid Build Coastguard Worker void RegisterPreference(const std::string& path, 99*6777b538SAndroid Build Coastguard Worker base::Value default_value, 100*6777b538SAndroid Build Coastguard Worker uint32_t flags); 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // Allows subclasses to hook into pref registration. 103*6777b538SAndroid Build Coastguard Worker virtual void OnPrefRegistered(const std::string& path, 104*6777b538SAndroid Build Coastguard Worker uint32_t flags); 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker scoped_refptr<DefaultPrefStore> defaults_; 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker // A map of pref name to a bitmask of PrefRegistrationFlags. 109*6777b538SAndroid Build Coastguard Worker PrefRegistrationFlagsMap registration_flags_; 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker std::set<std::string> foreign_pref_keys_; 112*6777b538SAndroid Build Coastguard Worker }; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_PREFS_PREF_REGISTRY_H_ 115