xref: /aosp_15_r20/external/cronet/components/prefs/pref_member.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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