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 // A helper class that stays in sync with a preference (bool, int, real, 6*6777b538SAndroid Build Coastguard Worker // string or filepath). For example: 7*6777b538SAndroid Build Coastguard Worker // 8*6777b538SAndroid Build Coastguard Worker // class MyClass { 9*6777b538SAndroid Build Coastguard Worker // public: 10*6777b538SAndroid Build Coastguard Worker // MyClass(PrefService* prefs) { 11*6777b538SAndroid Build Coastguard Worker // my_string_.Init(prefs::kHomePage, prefs); 12*6777b538SAndroid Build Coastguard Worker // } 13*6777b538SAndroid Build Coastguard Worker // private: 14*6777b538SAndroid Build Coastguard Worker // StringPrefMember my_string_; 15*6777b538SAndroid Build Coastguard Worker // }; 16*6777b538SAndroid Build Coastguard Worker // 17*6777b538SAndroid Build Coastguard Worker // my_string_ should stay in sync with the prefs::kHomePage pref and will 18*6777b538SAndroid Build Coastguard Worker // update if either the pref changes or if my_string_.SetValue is called. 19*6777b538SAndroid Build Coastguard Worker // 20*6777b538SAndroid Build Coastguard Worker // An optional observer can be passed into the Init method which can be used to 21*6777b538SAndroid Build Coastguard Worker // notify MyClass of changes. Note that if you use SetValue(), the observer 22*6777b538SAndroid Build Coastguard Worker // will not be notified. 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_PREFS_PREF_MEMBER_H_ 25*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_MEMBER_H_ 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker #include <string> 28*6777b538SAndroid Build Coastguard Worker #include <vector> 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 31*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 32*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h" 33*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_forward.h" 34*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 35*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 36*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 37*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 38*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_observer.h" 39*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h" 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker class PrefService; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker namespace subtle { 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefMemberBase : public PrefObserver { 46*6777b538SAndroid Build Coastguard Worker public: 47*6777b538SAndroid Build Coastguard Worker // Type of callback you can register if you need to know the name of 48*6777b538SAndroid Build Coastguard Worker // the pref that is changing. 49*6777b538SAndroid Build Coastguard Worker using NamedChangeCallback = base::RepeatingCallback<void(const std::string&)>; 50*6777b538SAndroid Build Coastguard Worker prefs()51*6777b538SAndroid Build Coastguard Worker PrefService* prefs() { return prefs_; } prefs()52*6777b538SAndroid Build Coastguard Worker const PrefService* prefs() const { return prefs_; } 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker protected: 55*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT Internal 56*6777b538SAndroid Build Coastguard Worker : public base::RefCountedThreadSafe<Internal> { 57*6777b538SAndroid Build Coastguard Worker public: 58*6777b538SAndroid Build Coastguard Worker Internal(); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker Internal(const Internal&) = delete; 61*6777b538SAndroid Build Coastguard Worker Internal& operator=(const Internal&) = delete; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // Update the value, either by calling |UpdateValueInternal| directly 64*6777b538SAndroid Build Coastguard Worker // or by dispatching to the right sequence. 65*6777b538SAndroid Build Coastguard Worker // Takes ownership of |value|. 66*6777b538SAndroid Build Coastguard Worker void UpdateValue(base::Value* value, 67*6777b538SAndroid Build Coastguard Worker bool is_managed, 68*6777b538SAndroid Build Coastguard Worker bool is_user_modifiable, 69*6777b538SAndroid Build Coastguard Worker bool is_default_value, 70*6777b538SAndroid Build Coastguard Worker base::OnceClosure callback) const; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker void MoveToSequence(scoped_refptr<base::SequencedTaskRunner> task_runner); 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // See PrefMember<> for description. IsManaged()75*6777b538SAndroid Build Coastguard Worker bool IsManaged() const { return is_managed_; } IsUserModifiable()76*6777b538SAndroid Build Coastguard Worker bool IsUserModifiable() const { return is_user_modifiable_; } IsDefaultValue()77*6777b538SAndroid Build Coastguard Worker bool IsDefaultValue() const { return is_default_value_; } 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker protected: 80*6777b538SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<Internal>; 81*6777b538SAndroid Build Coastguard Worker virtual ~Internal(); 82*6777b538SAndroid Build Coastguard Worker CheckOnCorrectSequence()83*6777b538SAndroid Build Coastguard Worker void CheckOnCorrectSequence() const { DCHECK(IsOnCorrectSequence()); } 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker private: 86*6777b538SAndroid Build Coastguard Worker // This method actually updates the value. It should only be called from 87*6777b538SAndroid Build Coastguard Worker // the sequence the PrefMember is on. 88*6777b538SAndroid Build Coastguard Worker virtual bool UpdateValueInternal(const base::Value& value) const = 0; 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker bool IsOnCorrectSequence() const; 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> owning_task_runner_; 93*6777b538SAndroid Build Coastguard Worker mutable bool is_managed_ = false; 94*6777b538SAndroid Build Coastguard Worker mutable bool is_user_modifiable_ = false; 95*6777b538SAndroid Build Coastguard Worker mutable bool is_default_value_ = false; 96*6777b538SAndroid Build Coastguard Worker }; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker PrefMemberBase(); 99*6777b538SAndroid Build Coastguard Worker virtual ~PrefMemberBase(); 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker // See PrefMember<> for description. 102*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, 103*6777b538SAndroid Build Coastguard Worker PrefService* prefs, 104*6777b538SAndroid Build Coastguard Worker const NamedChangeCallback& observer); 105*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, PrefService* prefs); 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker virtual void CreateInternal() const = 0; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker // See PrefMember<> for description. 110*6777b538SAndroid Build Coastguard Worker void Destroy(); 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker void MoveToSequence(scoped_refptr<base::SequencedTaskRunner> task_runner); 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // PrefObserver 115*6777b538SAndroid Build Coastguard Worker void OnPreferenceChanged(PrefService* service, 116*6777b538SAndroid Build Coastguard Worker const std::string& pref_name) override; 117*6777b538SAndroid Build Coastguard Worker VerifyValuePrefName()118*6777b538SAndroid Build Coastguard Worker void VerifyValuePrefName() const { 119*6777b538SAndroid Build Coastguard Worker DCHECK(!pref_name_.empty()); 120*6777b538SAndroid Build Coastguard Worker } 121*6777b538SAndroid Build Coastguard Worker 122*6777b538SAndroid Build Coastguard Worker // This method is used to do the actual sync with the preference. 123*6777b538SAndroid Build Coastguard Worker // Note: it is logically const, because it doesn't modify the state 124*6777b538SAndroid Build Coastguard Worker // seen by the outside world. It is just doing a lazy load behind the scenes. 125*6777b538SAndroid Build Coastguard Worker void UpdateValueFromPref(base::OnceClosure callback) const; 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker // Verifies the preference name, and lazily loads the preference value if 128*6777b538SAndroid Build Coastguard Worker // it hasn't been loaded yet. 129*6777b538SAndroid Build Coastguard Worker void VerifyPref() const; 130*6777b538SAndroid Build Coastguard Worker pref_name()131*6777b538SAndroid Build Coastguard Worker const std::string& pref_name() const { return pref_name_; } 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker virtual Internal* internal() const = 0; 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker // Used to allow registering plain base::RepeatingClosure callbacks. 136*6777b538SAndroid Build Coastguard Worker static void InvokeUnnamedCallback(const base::RepeatingClosure& callback, 137*6777b538SAndroid Build Coastguard Worker const std::string& pref_name); 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker private: 140*6777b538SAndroid Build Coastguard Worker // Ordered the members to compact the class instance. 141*6777b538SAndroid Build Coastguard Worker std::string pref_name_; 142*6777b538SAndroid Build Coastguard Worker NamedChangeCallback observer_; 143*6777b538SAndroid Build Coastguard Worker raw_ptr<PrefService> prefs_; 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker protected: 146*6777b538SAndroid Build Coastguard Worker bool setting_value_; 147*6777b538SAndroid Build Coastguard Worker }; 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker // This function implements StringListPrefMember::UpdateValue(). 150*6777b538SAndroid Build Coastguard Worker // It is exposed here for testing purposes. 151*6777b538SAndroid Build Coastguard Worker bool COMPONENTS_PREFS_EXPORT PrefMemberVectorStringUpdate( 152*6777b538SAndroid Build Coastguard Worker const base::Value& value, 153*6777b538SAndroid Build Coastguard Worker std::vector<std::string>* string_vector); 154*6777b538SAndroid Build Coastguard Worker 155*6777b538SAndroid Build Coastguard Worker } // namespace subtle 156*6777b538SAndroid Build Coastguard Worker 157*6777b538SAndroid Build Coastguard Worker template <typename ValueType> 158*6777b538SAndroid Build Coastguard Worker class PrefMember : public subtle::PrefMemberBase { 159*6777b538SAndroid Build Coastguard Worker public: 160*6777b538SAndroid Build Coastguard Worker // Defer initialization to an Init method so it's easy to make this class be 161*6777b538SAndroid Build Coastguard Worker // a member variable. PrefMember()162*6777b538SAndroid Build Coastguard Worker PrefMember() {} 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker PrefMember(const PrefMember&) = delete; 165*6777b538SAndroid Build Coastguard Worker PrefMember& operator=(const PrefMember&) = delete; 166*6777b538SAndroid Build Coastguard Worker ~PrefMember()167*6777b538SAndroid Build Coastguard Worker virtual ~PrefMember() {} 168*6777b538SAndroid Build Coastguard Worker 169*6777b538SAndroid Build Coastguard Worker // Do the actual initialization of the class. Use the two-parameter 170*6777b538SAndroid Build Coastguard Worker // version if you don't want any notifications of changes. This 171*6777b538SAndroid Build Coastguard Worker // method should only be called on the UI thread. Init(const std::string & pref_name,PrefService * prefs,const NamedChangeCallback & observer)172*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, 173*6777b538SAndroid Build Coastguard Worker PrefService* prefs, 174*6777b538SAndroid Build Coastguard Worker const NamedChangeCallback& observer) { 175*6777b538SAndroid Build Coastguard Worker subtle::PrefMemberBase::Init(pref_name, prefs, observer); 176*6777b538SAndroid Build Coastguard Worker } Init(const std::string & pref_name,PrefService * prefs,const base::RepeatingClosure & observer)177*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, 178*6777b538SAndroid Build Coastguard Worker PrefService* prefs, 179*6777b538SAndroid Build Coastguard Worker const base::RepeatingClosure& observer) { 180*6777b538SAndroid Build Coastguard Worker subtle::PrefMemberBase::Init( 181*6777b538SAndroid Build Coastguard Worker pref_name, prefs, 182*6777b538SAndroid Build Coastguard Worker base::BindRepeating(&PrefMemberBase::InvokeUnnamedCallback, observer)); 183*6777b538SAndroid Build Coastguard Worker } Init(const std::string & pref_name,PrefService * prefs)184*6777b538SAndroid Build Coastguard Worker void Init(const std::string& pref_name, PrefService* prefs) { 185*6777b538SAndroid Build Coastguard Worker subtle::PrefMemberBase::Init(pref_name, prefs); 186*6777b538SAndroid Build Coastguard Worker } 187*6777b538SAndroid Build Coastguard Worker 188*6777b538SAndroid Build Coastguard Worker // Unsubscribes the PrefMember from the PrefService. After calling this 189*6777b538SAndroid Build Coastguard Worker // function, the PrefMember may not be used any more on the UI thread. 190*6777b538SAndroid Build Coastguard Worker // Assuming |MoveToSequence| was previously called, |GetValue|, |IsManaged|, 191*6777b538SAndroid Build Coastguard Worker // and |IsUserModifiable| can still be called from the other sequence but 192*6777b538SAndroid Build Coastguard Worker // the results will no longer update from the PrefService. 193*6777b538SAndroid Build Coastguard Worker // This method should only be called on the UI thread. Destroy()194*6777b538SAndroid Build Coastguard Worker void Destroy() { 195*6777b538SAndroid Build Coastguard Worker subtle::PrefMemberBase::Destroy(); 196*6777b538SAndroid Build Coastguard Worker } 197*6777b538SAndroid Build Coastguard Worker 198*6777b538SAndroid Build Coastguard Worker // Moves the PrefMember to another sequence, allowing read accesses from 199*6777b538SAndroid Build Coastguard Worker // there. Changes from the PrefService will be propagated asynchronously 200*6777b538SAndroid Build Coastguard Worker // via PostTask. 201*6777b538SAndroid Build Coastguard Worker // This method should only be used from the sequence the PrefMember is 202*6777b538SAndroid Build Coastguard Worker // currently on, which is the UI thread by default. MoveToSequence(scoped_refptr<base::SequencedTaskRunner> task_runner)203*6777b538SAndroid Build Coastguard Worker void MoveToSequence(scoped_refptr<base::SequencedTaskRunner> task_runner) { 204*6777b538SAndroid Build Coastguard Worker subtle::PrefMemberBase::MoveToSequence(task_runner); 205*6777b538SAndroid Build Coastguard Worker } 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard Worker // Check whether the pref is managed, i.e. controlled externally through 208*6777b538SAndroid Build Coastguard Worker // enterprise configuration management (e.g. windows group policy). Returns 209*6777b538SAndroid Build Coastguard Worker // false for unknown prefs. 210*6777b538SAndroid Build Coastguard Worker // This method should only be used from the sequence the PrefMember is 211*6777b538SAndroid Build Coastguard Worker // currently on, which is the UI thread unless changed by |MoveToSequence|. IsManaged()212*6777b538SAndroid Build Coastguard Worker bool IsManaged() const { 213*6777b538SAndroid Build Coastguard Worker VerifyPref(); 214*6777b538SAndroid Build Coastguard Worker return internal_->IsManaged(); 215*6777b538SAndroid Build Coastguard Worker } 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker // Checks whether the pref can be modified by the user. This returns false 218*6777b538SAndroid Build Coastguard Worker // when the pref is managed by a policy or an extension, and when a command 219*6777b538SAndroid Build Coastguard Worker // line flag overrides the pref. 220*6777b538SAndroid Build Coastguard Worker // This method should only be used from the sequence the PrefMember is 221*6777b538SAndroid Build Coastguard Worker // currently on, which is the UI thread unless changed by |MoveToSequence|. IsUserModifiable()222*6777b538SAndroid Build Coastguard Worker bool IsUserModifiable() const { 223*6777b538SAndroid Build Coastguard Worker VerifyPref(); 224*6777b538SAndroid Build Coastguard Worker return internal_->IsUserModifiable(); 225*6777b538SAndroid Build Coastguard Worker } 226*6777b538SAndroid Build Coastguard Worker 227*6777b538SAndroid Build Coastguard Worker // Checks whether the pref is currently using its default value, and has not 228*6777b538SAndroid Build Coastguard Worker // been set by any higher-priority source (even with the same value). This 229*6777b538SAndroid Build Coastguard Worker // method should only be used from the sequence the PrefMember is currently 230*6777b538SAndroid Build Coastguard Worker // on, which is the UI thread unless changed by |MoveToSequence|. IsDefaultValue()231*6777b538SAndroid Build Coastguard Worker bool IsDefaultValue() const { 232*6777b538SAndroid Build Coastguard Worker VerifyPref(); 233*6777b538SAndroid Build Coastguard Worker return internal_->IsDefaultValue(); 234*6777b538SAndroid Build Coastguard Worker } 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Worker // Retrieve the value of the member variable. 237*6777b538SAndroid Build Coastguard Worker // This method should only be used from the sequence the PrefMember is 238*6777b538SAndroid Build Coastguard Worker // currently on, which is the UI thread unless changed by |MoveToSequence|. GetValue()239*6777b538SAndroid Build Coastguard Worker ValueType GetValue() const { 240*6777b538SAndroid Build Coastguard Worker VerifyPref(); 241*6777b538SAndroid Build Coastguard Worker return internal_->value(); 242*6777b538SAndroid Build Coastguard Worker } 243*6777b538SAndroid Build Coastguard Worker 244*6777b538SAndroid Build Coastguard Worker // Provided as a convenience. 245*6777b538SAndroid Build Coastguard Worker ValueType operator*() const { 246*6777b538SAndroid Build Coastguard Worker return GetValue(); 247*6777b538SAndroid Build Coastguard Worker } 248*6777b538SAndroid Build Coastguard Worker 249*6777b538SAndroid Build Coastguard Worker // Set the value of the member variable. 250*6777b538SAndroid Build Coastguard Worker // This method should only be called on the UI thread. SetValue(const ValueType & value)251*6777b538SAndroid Build Coastguard Worker void SetValue(const ValueType& value) { 252*6777b538SAndroid Build Coastguard Worker VerifyValuePrefName(); 253*6777b538SAndroid Build Coastguard Worker setting_value_ = true; 254*6777b538SAndroid Build Coastguard Worker UpdatePref(value); 255*6777b538SAndroid Build Coastguard Worker setting_value_ = false; 256*6777b538SAndroid Build Coastguard Worker } 257*6777b538SAndroid Build Coastguard Worker 258*6777b538SAndroid Build Coastguard Worker // Returns the pref name. GetPrefName()259*6777b538SAndroid Build Coastguard Worker const std::string& GetPrefName() const { 260*6777b538SAndroid Build Coastguard Worker return pref_name(); 261*6777b538SAndroid Build Coastguard Worker } 262*6777b538SAndroid Build Coastguard Worker 263*6777b538SAndroid Build Coastguard Worker private: 264*6777b538SAndroid Build Coastguard Worker class Internal : public subtle::PrefMemberBase::Internal { 265*6777b538SAndroid Build Coastguard Worker public: Internal()266*6777b538SAndroid Build Coastguard Worker Internal() : value_(ValueType()) {} 267*6777b538SAndroid Build Coastguard Worker 268*6777b538SAndroid Build Coastguard Worker Internal(const Internal&) = delete; 269*6777b538SAndroid Build Coastguard Worker Internal& operator=(const Internal&) = delete; 270*6777b538SAndroid Build Coastguard Worker value()271*6777b538SAndroid Build Coastguard Worker ValueType value() { 272*6777b538SAndroid Build Coastguard Worker CheckOnCorrectSequence(); 273*6777b538SAndroid Build Coastguard Worker return value_; 274*6777b538SAndroid Build Coastguard Worker } 275*6777b538SAndroid Build Coastguard Worker 276*6777b538SAndroid Build Coastguard Worker protected: ~Internal()277*6777b538SAndroid Build Coastguard Worker ~Internal() override {} 278*6777b538SAndroid Build Coastguard Worker 279*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool UpdateValueInternal( 280*6777b538SAndroid Build Coastguard Worker const base::Value& value) const override; 281*6777b538SAndroid Build Coastguard Worker 282*6777b538SAndroid Build Coastguard Worker // We cache the value of the pref so we don't have to keep walking the pref 283*6777b538SAndroid Build Coastguard Worker // tree. 284*6777b538SAndroid Build Coastguard Worker mutable ValueType value_; 285*6777b538SAndroid Build Coastguard Worker }; 286*6777b538SAndroid Build Coastguard Worker internal()287*6777b538SAndroid Build Coastguard Worker Internal* internal() const override { return internal_.get(); } CreateInternal()288*6777b538SAndroid Build Coastguard Worker void CreateInternal() const override { internal_ = new Internal(); } 289*6777b538SAndroid Build Coastguard Worker 290*6777b538SAndroid Build Coastguard Worker // This method is used to do the actual sync with pref of the specified type. 291*6777b538SAndroid Build Coastguard Worker void COMPONENTS_PREFS_EXPORT UpdatePref(const ValueType& value); 292*6777b538SAndroid Build Coastguard Worker 293*6777b538SAndroid Build Coastguard Worker mutable scoped_refptr<Internal> internal_; 294*6777b538SAndroid Build Coastguard Worker }; 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker // Declaration of template specialization need to be repeated here 297*6777b538SAndroid Build Coastguard Worker // specifically for each specialization (rather than just once above) 298*6777b538SAndroid Build Coastguard Worker // or at least one of our compilers won't be happy in all cases. 299*6777b538SAndroid Build Coastguard Worker // Specifically, it was failing on ChromeOS with a complaint about 300*6777b538SAndroid Build Coastguard Worker // PrefMember<FilePath>::UpdateValueInternal not being defined when 301*6777b538SAndroid Build Coastguard Worker // built in a chroot with the following parameters: 302*6777b538SAndroid Build Coastguard Worker // 303*6777b538SAndroid Build Coastguard Worker // FEATURES="noclean nostrip" USE="-chrome_debug -chrome_remoting 304*6777b538SAndroid Build Coastguard Worker // -chrome_internal -chrome_pdf component_build" 305*6777b538SAndroid Build Coastguard Worker // ~/trunk/goma/goma-wrapper cros_chrome_make --board=${BOARD} 306*6777b538SAndroid Build Coastguard Worker // --install --runhooks 307*6777b538SAndroid Build Coastguard Worker 308*6777b538SAndroid Build Coastguard Worker template <> 309*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void PrefMember<bool>::UpdatePref(const bool& value); 310*6777b538SAndroid Build Coastguard Worker 311*6777b538SAndroid Build Coastguard Worker template <> 312*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool PrefMember<bool>::Internal::UpdateValueInternal( 313*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 314*6777b538SAndroid Build Coastguard Worker 315*6777b538SAndroid Build Coastguard Worker template <> 316*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void PrefMember<int>::UpdatePref(const int& value); 317*6777b538SAndroid Build Coastguard Worker 318*6777b538SAndroid Build Coastguard Worker template <> 319*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool PrefMember<int>::Internal::UpdateValueInternal( 320*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 321*6777b538SAndroid Build Coastguard Worker 322*6777b538SAndroid Build Coastguard Worker template <> 323*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void 324*6777b538SAndroid Build Coastguard Worker PrefMember<double>::UpdatePref(const double& value); 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker template <> 327*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool PrefMember<double>::Internal::UpdateValueInternal( 328*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker template <> 331*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void PrefMember<std::string>::UpdatePref( 332*6777b538SAndroid Build Coastguard Worker const std::string& value); 333*6777b538SAndroid Build Coastguard Worker 334*6777b538SAndroid Build Coastguard Worker template <> 335*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool 336*6777b538SAndroid Build Coastguard Worker PrefMember<std::string>::Internal::UpdateValueInternal( 337*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 338*6777b538SAndroid Build Coastguard Worker 339*6777b538SAndroid Build Coastguard Worker template <> 340*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void PrefMember<base::FilePath>::UpdatePref( 341*6777b538SAndroid Build Coastguard Worker const base::FilePath& value); 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker template <> 344*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool 345*6777b538SAndroid Build Coastguard Worker PrefMember<base::FilePath>::Internal::UpdateValueInternal( 346*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 347*6777b538SAndroid Build Coastguard Worker 348*6777b538SAndroid Build Coastguard Worker template <> 349*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT void PrefMember<std::vector<std::string>>::UpdatePref( 350*6777b538SAndroid Build Coastguard Worker const std::vector<std::string>& value); 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker template <> 353*6777b538SAndroid Build Coastguard Worker COMPONENTS_PREFS_EXPORT bool 354*6777b538SAndroid Build Coastguard Worker PrefMember<std::vector<std::string>>::Internal::UpdateValueInternal( 355*6777b538SAndroid Build Coastguard Worker const base::Value& value) const; 356*6777b538SAndroid Build Coastguard Worker 357*6777b538SAndroid Build Coastguard Worker typedef PrefMember<bool> BooleanPrefMember; 358*6777b538SAndroid Build Coastguard Worker typedef PrefMember<int> IntegerPrefMember; 359*6777b538SAndroid Build Coastguard Worker typedef PrefMember<double> DoublePrefMember; 360*6777b538SAndroid Build Coastguard Worker typedef PrefMember<std::string> StringPrefMember; 361*6777b538SAndroid Build Coastguard Worker typedef PrefMember<base::FilePath> FilePathPrefMember; 362*6777b538SAndroid Build Coastguard Worker // This preference member is expensive for large string arrays. 363*6777b538SAndroid Build Coastguard Worker typedef PrefMember<std::vector<std::string>> StringListPrefMember; 364*6777b538SAndroid Build Coastguard Worker 365*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_PREFS_PREF_MEMBER_H_ 366