| Index: chrome/browser/prefs/pref_value_store.h
 | 
| diff --git a/chrome/browser/prefs/pref_value_store.h b/chrome/browser/prefs/pref_value_store.h
 | 
| index f4884e26edcd779a402fd41b8fde0f5273b2ea31..1724bbc4b48f0d0a8ed3efffe13f6aac0461c109 100644
 | 
| --- a/chrome/browser/prefs/pref_value_store.h
 | 
| +++ b/chrome/browser/prefs/pref_value_store.h
 | 
| @@ -17,10 +17,12 @@
 | 
|  #include "base/scoped_ptr.h"
 | 
|  #include "base/values.h"
 | 
|  #include "chrome/browser/browser_thread.h"
 | 
| -#include "chrome/browser/prefs/pref_notifier.h"
 | 
| +#include "chrome/common/notification_observer.h"
 | 
| +#include "chrome/common/notification_registrar.h"
 | 
|  #include "chrome/common/pref_store.h"
 | 
|  
 | 
|  class FilePath;
 | 
| +class PrefNotifier;
 | 
|  class PrefStore;
 | 
|  class Profile;
 | 
|  
 | 
| @@ -28,26 +30,47 @@ class Profile;
 | 
|  // (e.g., configuration policies, extensions, and user settings). It returns
 | 
|  // the value of a Preference from the source with the highest priority, and
 | 
|  // allows setting user-defined values for preferences that are not managed.
 | 
| -// See PrefNotifier for a list of the available preference sources (PrefStores)
 | 
| -// and their descriptions.
 | 
|  //
 | 
|  // Unless otherwise explicitly noted, all of the methods of this class must
 | 
|  // be called on the UI thread.
 | 
| -class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
| +class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore>,
 | 
| +                       public NotificationObserver {
 | 
|   public:
 | 
| -  // Returns a new PrefValueStore with all applicable PrefStores. The
 | 
| -  // |pref_filename| points to the user preference file. The |profile| is the
 | 
| -  // one to which these preferences apply; it may be NULL if we're dealing
 | 
| -  // with the local state. If |pref_filename| is empty, the user PrefStore will
 | 
| -  // not be created. If |user_only| is true, no PrefStores will be created
 | 
| -  // other than the user and default PrefStores. This should not normally be
 | 
| -  // called directly: the usual way to create a PrefValueStore is by creating a
 | 
| -  // PrefService.
 | 
| -  static PrefValueStore* CreatePrefValueStore(const FilePath& pref_filename,
 | 
| -                                              Profile* profile,
 | 
| -                                              bool user_only);
 | 
| -
 | 
| -  ~PrefValueStore();
 | 
| +  // In decreasing order of precedence:
 | 
| +  //   |managed_platform_prefs| contains all managed platform (non-cloud policy)
 | 
| +  //        preference values.
 | 
| +  //   |device_management_prefs| contains all device management (cloud policy)
 | 
| +  //        preference values.
 | 
| +  //   |extension_prefs| contains preference values set by extensions.
 | 
| +  //   |command_line_prefs| contains preference values set by command-line
 | 
| +  //        switches.
 | 
| +  //   |user_prefs| contains all user-set preference values.
 | 
| +  //   |recommended_prefs| contains all recommended (policy) preference values.
 | 
| +  //   |default_prefs| contains application-default preference values. It must
 | 
| +  //        be non-null if any preferences are to be registered.
 | 
| +  //
 | 
| +  // |pref_notifier| facilitates broadcasting preference change notifications
 | 
| +  // to the world.
 | 
| +  //
 | 
| +  // The |profile| parameter is used to construct a replacement device
 | 
| +  // management pref store. This is done after policy refresh when we swap out
 | 
| +  // the policy pref stores for new ones, so the |profile| pointer needs to be
 | 
| +  // kept around for then. It is safe to pass a NULL pointer for local state
 | 
| +  // preferences.
 | 
| +  //
 | 
| +  // TODO(mnissler, danno): Refactor the pref store interface and refresh logic
 | 
| +  // so refreshes can be handled by the pref store itself without swapping
 | 
| +  // stores. This way we can get rid of the profile pointer here.
 | 
| +  PrefValueStore(PrefStore* managed_platform_prefs,
 | 
| +                 PrefStore* device_management_prefs,
 | 
| +                 PrefStore* extension_prefs,
 | 
| +                 PrefStore* command_line_prefs,
 | 
| +                 PrefStore* user_prefs,
 | 
| +                 PrefStore* recommended_prefs,
 | 
| +                 PrefStore* default_prefs,
 | 
| +                 PrefNotifier* pref_notifier,
 | 
| +                 Profile* profile);
 | 
| +  virtual ~PrefValueStore();
 | 
|  
 | 
|    // Gets the value for the given preference name that has a valid value type;
 | 
|    // that is, the same type the preference was registered with, or NULL for
 | 
| @@ -56,7 +79,7 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    // Preference::GetValue() instead of calling this method directly.
 | 
|    bool GetValue(const std::string& name, Value** out_value) const;
 | 
|  
 | 
| -  // Same as GetValue but only searches USER_STORE.
 | 
| +  // Same as GetValue but only searches the user store.
 | 
|    bool GetUserValue(const std::string& name, Value** out_value) const;
 | 
|  
 | 
|    // Adds a preference to the mapping of names to types.
 | 
| @@ -74,10 +97,12 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    // Persists prefs (to disk or elsewhere). Returns true if writing values was
 | 
|    // successful. In practice, only the user prefs are expected to be written
 | 
|    // out.
 | 
| +  // TODO(mnissler, danno): Handle writes through PrefService and remove.
 | 
|    bool WritePrefs();
 | 
|  
 | 
|    // Calls the method ScheduleWritePrefs on the PrefStores. In practice, only
 | 
|    // the user prefs are expected to be written out.
 | 
| +  // TODO(mnissler, danno): Handle writes through PrefService and remove.
 | 
|    void ScheduleWritePrefs();
 | 
|  
 | 
|    // Returns true if the PrefValueStore contains the given preference (i.e.,
 | 
| @@ -87,37 +112,35 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    // store setting a value that happens to be equal to the default does.
 | 
|    bool HasPrefPath(const char* name) const;
 | 
|  
 | 
| -  // Called by the PrefNotifier when the value of the preference at |path| has
 | 
| -  // changed, been added, or been removed in one of the PrefStores. The
 | 
| -  // |new_store| is the PrefStoreType of the caller. Returns true if the
 | 
| -  // effective value of the preference has changed, or if the store controlling
 | 
| -  // the pref has changed. Virtual so it can be mocked for a unit test.
 | 
| -  virtual bool PrefHasChanged(const char* path,
 | 
| -                              PrefNotifier::PrefStoreType new_store);
 | 
| -
 | 
|    // Returns true if the PrefValueStore is read-only.  Because the managed
 | 
|    // platform, device management and recommended PrefStores are always
 | 
|    // read-only, the PrefValueStore as a whole is read-only if the PrefStore
 | 
|    // containing the user preferences is read-only.
 | 
| -  bool ReadOnly();
 | 
| +  bool ReadOnly() const;
 | 
|  
 | 
|    // Alters the user-defined value of a preference. Even if the preference is
 | 
|    // managed this method allows the user-defined value of the preference to be
 | 
| -  // set. But GetValue calls will not return this value as long as the
 | 
| -  // preference is managed. Instead GetValue will return the managed value
 | 
| -  // of the preference. Note that the PrefValueStore takes the ownership of
 | 
| -  // the value referenced by |in_value|. It is an error to call this when no
 | 
| -  // user PrefStore has been set. Returns true if the user-set value of the
 | 
| -  // preference was newly added or changed.
 | 
| -  bool SetUserPrefValue(const char* name, Value* in_value);
 | 
| -
 | 
| -  // Removes a value from the user PrefStore. If a preference is managed
 | 
| -  // this function should have no visible effect. Returns true if there was a
 | 
| -  // user-set value to be removed.
 | 
| -  bool RemoveUserPrefValue(const char* name);
 | 
| -
 | 
| -  // Sets a value in the DefaultPrefStore, which takes ownership of the Value.
 | 
| -  void SetDefaultPrefValue(const char* name, Value* in_value);
 | 
| +  // set. However, GetValue calls will not return this value as long as the
 | 
| +  // preference is overriden by a store of higher precedence. Note that the
 | 
| +  // PrefValueStore takes the ownership of the value referenced by |in_value|.
 | 
| +  // It is an error to call this when no user PrefStore has been set. Triggers
 | 
| +  // notifications if the user-visible value changes.
 | 
| +  // TODO(mnissler, danno): Handle writes in PrefService and notifications in
 | 
| +  // the pref store implementation, so we can remove this call.
 | 
| +  void SetUserPrefValue(const char* name, Value* in_value);
 | 
| +
 | 
| +  // Like SetUserPrefValue, but silently puts the value without triggering
 | 
| +  // notifications.
 | 
| +  // TODO(mnissler, danno): Handle writes in PrefService and notifications in
 | 
| +  // the pref store implementation, so we can remove this call.
 | 
| +  void SetUserPrefValueSilently(const char* name, Value* in_value);
 | 
| +
 | 
| +  // Removes a value from the user PrefStore. If a preference is overriden by a
 | 
| +  // store of higher precedence, this function will have no immediately visible
 | 
| +  // effect. Triggers notifications if the user-visible value changes.
 | 
| +  // TODO(mnissler, danno): Handle writes in PrefService and notifications in
 | 
| +  // the pref store implementation, so we can remove this call.
 | 
| +  void RemoveUserPrefValue(const char* name);
 | 
|  
 | 
|    // These methods return true if a preference with the given name is in the
 | 
|    // indicated pref store, even if that value is currently being overridden by
 | 
| @@ -127,14 +150,6 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    bool PrefValueInExtensionStore(const char* name) const;
 | 
|    bool PrefValueInUserStore(const char* name) const;
 | 
|  
 | 
| -  // Returns true if a preference has an explicit value in any of the
 | 
| -  // stores in the range specified by |first_checked_store| and
 | 
| -  // |last_checked_store|, even if that value is currently being
 | 
| -  // overridden by a higher-priority store.
 | 
| -  bool PrefValueInStoreRange(const char* name,
 | 
| -                             PrefNotifier::PrefStoreType first_checked_store,
 | 
| -                             PrefNotifier::PrefStoreType last_checked_store);
 | 
| -
 | 
|    // These methods return true if a preference with the given name is actually
 | 
|    // being controlled by the indicated pref store and not being overridden by
 | 
|    // a higher-priority source.
 | 
| @@ -146,98 +161,129 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    // there is no higher-priority source controlling it.
 | 
|    bool PrefValueUserModifiable(const char* name) const;
 | 
|  
 | 
| -  // Returns the pref store type identifying the source that controls the
 | 
| -  // Preference identified by |name|. If none of the sources has a value,
 | 
| -  // PrefNotifier::INVALID_STORE is returned. In practice, the default PrefStore
 | 
| -  // should always have a value for any registered preferencem, so INVALID_STORE
 | 
| -  // indicates an error.
 | 
| -  PrefNotifier::PrefStoreType ControllingPrefStoreForPref(
 | 
| -      const char* name) const;
 | 
| -
 | 
| -  // Signature of callback triggered after policy refresh. Parameter is not
 | 
| -  // passed as reference to prevent passing along a pointer to a set whose
 | 
| -  // lifecycle is managed in another thread.
 | 
| -  typedef Callback1<std::vector<std::string> >::Type AfterRefreshCallback;
 | 
| -
 | 
| -  // Called as a result of a notification of policy change. Triggers a reload of
 | 
| -  // managed platform, device management and recommended preferences from policy
 | 
| -  // from a Task on the FILE thread. The Task will take ownership of the
 | 
| -  // |callback|. |callback| is called with the set of preferences changed by the
 | 
| -  // policy refresh. |callback| is called on the caller's thread as a Task
 | 
| -  // after RefreshPolicyPrefs has returned.
 | 
| -  void RefreshPolicyPrefs(AfterRefreshCallback* callback);
 | 
| -
 | 
|    // Returns true if there are proxy preferences in user-modifiable
 | 
|    // preference stores (e.g. CommandLinePrefStore, ExtensionPrefStore)
 | 
|    // that conflict with proxy settings specified by proxy policy.
 | 
| -  bool HasPolicyConflictingUserProxySettings();
 | 
| -
 | 
| -  // TODO(mnissler) delete after applying your patch.
 | 
| -  // This is only called only by PrefService.
 | 
| -  PrefStore* GetExtensionPrefStore() const;
 | 
| -
 | 
| - protected:
 | 
| -  // In decreasing order of precedence:
 | 
| -  //   |managed_platform_prefs| contains all managed platform (non-cloud policy)
 | 
| -  //        preference values.
 | 
| -  //   |device_management_prefs| contains all device management (cloud policy)
 | 
| -  //        preference values.
 | 
| -  //   |extension_prefs| contains preference values set by extensions.
 | 
| -  //   |command_line_prefs| contains preference values set by command-line
 | 
| -  //        switches.
 | 
| -  //   |user_prefs| contains all user-set preference values.
 | 
| -  //   |recommended_prefs| contains all recommended (policy) preference values.
 | 
| -  //   |default_prefs| contains application-default preference values. It must
 | 
| -  //        be non-null if any preferences are to be registered.
 | 
| -  //
 | 
| -  // The |profile| parameter is used to construct a replacement device
 | 
| -  // management pref store. This is done after policy refresh when we swap out
 | 
| -  // the policy pref stores for new ones, so the |profile| pointer needs to be
 | 
| -  // kept around for then. It is safe to pass a NULL pointer for local state
 | 
| -  // preferences.
 | 
| -  //
 | 
| -  // TODO(mnissler, danno): Refactor the pref store interface and refresh logic
 | 
| -  // so refreshes can be handled by the pref store itself without swapping
 | 
| -  // stores. This way we can get rid of the profile pointer here.
 | 
| -  //
 | 
| -  // This constructor should only be used internally, or by subclasses in
 | 
| -  // testing. The usual way to create a PrefValueStore is by creating a
 | 
| -  // PrefService.
 | 
| -  PrefValueStore(PrefStore* managed_platform_prefs,
 | 
| -                 PrefStore* device_management_prefs,
 | 
| -                 PrefStore* extension_prefs,
 | 
| -                 PrefStore* command_line_prefs,
 | 
| -                 PrefStore* user_prefs,
 | 
| -                 PrefStore* recommended_prefs,
 | 
| -                 PrefStore* default_prefs,
 | 
| -                 Profile* profile);
 | 
| +  bool HasPolicyConflictingUserProxySettings() const;
 | 
|  
 | 
|   private:
 | 
| +  // PrefStores must be listed here in order from highest to lowest priority.
 | 
| +  //   MANAGED_PLATFORM contains all managed preference values that are
 | 
| +  //       provided by a platform-specific policy mechanism (e.g. Windows
 | 
| +  //       Group Policy).
 | 
| +  //   DEVICE_MANAGEMENT contains all managed preference values supplied
 | 
| +  //       by the device management server (cloud policy).
 | 
| +  //   EXTENSION contains preference values set by extensions.
 | 
| +  //   COMMAND_LINE contains preference values set by command-line switches.
 | 
| +  //   USER contains all user-set preference values.
 | 
| +  //   RECOMMENDED contains all recommended (policy) preference values.
 | 
| +  //   DEFAULT contains all application default preference values.
 | 
| +  enum PrefStoreType {
 | 
| +    // INVALID_STORE is not associated with an actual PrefStore but used as
 | 
| +    // an invalid marker, e.g. as a return value.
 | 
| +    INVALID_STORE = -1,
 | 
| +    MANAGED_PLATFORM_STORE = 0,
 | 
| +    DEVICE_MANAGEMENT_STORE,
 | 
| +    EXTENSION_STORE,
 | 
| +    COMMAND_LINE_STORE,
 | 
| +    USER_STORE,
 | 
| +    RECOMMENDED_STORE,
 | 
| +    DEFAULT_STORE,
 | 
| +    PREF_STORE_TYPE_MAX = DEFAULT_STORE
 | 
| +  };
 | 
| +
 | 
| +  // Keeps a PrefStore reference on behalf of the PrefValueStore and monitors
 | 
| +  // the PrefStore for changes, forwarding notifications to PrefValueStore. This
 | 
| +  // indirection is here for the sake of disambiguating notifications from the
 | 
| +  // individual PrefStores.
 | 
| +  class PrefStoreKeeper : public PrefStore::ObserverInterface {
 | 
| +   public:
 | 
| +    PrefStoreKeeper();
 | 
| +    virtual ~PrefStoreKeeper();
 | 
| +
 | 
| +    // Takes ownership of |pref_store|.
 | 
| +    void Initialize(PrefValueStore* store,
 | 
| +                    PrefStore* pref_store,
 | 
| +                    PrefStoreType type);
 | 
| +
 | 
| +    PrefStore* store() { return pref_store_.get(); }
 | 
| +    const PrefStore* store() const { return pref_store_.get(); }
 | 
| +
 | 
| +   private:
 | 
| +    // PrefStore::ObserverInterface implementation.
 | 
| +    virtual void OnPrefValueChanged(const std::string& key);
 | 
| +    virtual void OnInitializationCompleted();
 | 
| +
 | 
| +    // PrefValueStore this keeper is part of.
 | 
| +    PrefValueStore* pref_value_store_;
 | 
| +
 | 
| +    // The PrefStore managed by this keeper.
 | 
| +    scoped_ptr<PrefStore> pref_store_;
 | 
| +
 | 
| +    // Type of the pref store.
 | 
| +    PrefStoreType type_;
 | 
| +
 | 
| +    DISALLOW_COPY_AND_ASSIGN(PrefStoreKeeper);
 | 
| +  };
 | 
| +
 | 
|    typedef std::map<std::string, Value::ValueType> PrefTypeMap;
 | 
|  
 | 
|    friend class PrefValueStoreTest;
 | 
| +  FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest, TestPolicyRefresh);
 | 
|    FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest,
 | 
|                             TestRefreshPolicyPrefsCompletion);
 | 
| +  FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest,
 | 
| +                           TestConcurrentPolicyRefresh);
 | 
| +
 | 
| +  // Returns true if the actual type is a valid type for the expected type when
 | 
| +  // found in the given store.
 | 
| +  static bool IsValidType(Value::ValueType expected,
 | 
| +                          Value::ValueType actual,
 | 
| +                          PrefStoreType store);
 | 
|  
 | 
|    // Returns true if the preference with the given name has a value in the
 | 
|    // given PrefStoreType, of the same value type as the preference was
 | 
|    // registered with.
 | 
| -  bool PrefValueInStore(const char* name,
 | 
| -                        PrefNotifier::PrefStoreType store) const;
 | 
| +  bool PrefValueInStore(const char* name, PrefStoreType store) const;
 | 
| +
 | 
| +  // Returns true if a preference has an explicit value in any of the
 | 
| +  // stores in the range specified by |first_checked_store| and
 | 
| +  // |last_checked_store|, even if that value is currently being
 | 
| +  // overridden by a higher-priority store.
 | 
| +  bool PrefValueInStoreRange(const char* name,
 | 
| +                             PrefStoreType first_checked_store,
 | 
| +                             PrefStoreType last_checked_store) const;
 | 
| +
 | 
| +  // Returns the pref store type identifying the source that controls the
 | 
| +  // Preference identified by |name|. If none of the sources has a value,
 | 
| +  // INVALID_STORE is returned. In practice, the default PrefStore
 | 
| +  // should always have a value for any registered preferencem, so INVALID_STORE
 | 
| +  // indicates an error.
 | 
| +  PrefStoreType ControllingPrefStoreForPref(const char* name) const;
 | 
|  
 | 
|    // Get a value from the specified store type.
 | 
|    bool GetValueFromStore(const char* name,
 | 
| -                         PrefNotifier::PrefStoreType store,
 | 
| +                         PrefStoreType store,
 | 
|                           Value** out_value) const;
 | 
|  
 | 
| +  // Called upon changes in individual pref stores in order to determine whether
 | 
| +  // the user-visible pref value has changed. Triggers the change notification
 | 
| +  // if the effective value of the preference has changed, or if the store
 | 
| +  // controlling the pref has changed.
 | 
| +  void NotifyPrefChanged(const char* path, PrefStoreType new_store);
 | 
| +
 | 
| +  // Called as a result of a notification of policy change. Triggers a reload of
 | 
| +  // managed platform, device management and recommended preferences from policy
 | 
| +  // from a Task on the FILE thread.
 | 
| +  void RefreshPolicyPrefs();
 | 
| +
 | 
|    // Called during policy refresh after ReadPrefs completes on the thread
 | 
|    // that initiated the policy refresh. RefreshPolicyPrefsCompletion takes
 | 
|    // ownership of the |callback| object.
 | 
|    void RefreshPolicyPrefsCompletion(
 | 
|        PrefStore* new_managed_platform_pref_store,
 | 
|        PrefStore* new_device_management_pref_store,
 | 
| -      PrefStore* new_recommended_pref_store,
 | 
| -      AfterRefreshCallback* callback);
 | 
| +      PrefStore* new_recommended_pref_store);
 | 
|  
 | 
|    // Called during policy refresh to do the ReadPrefs on the FILE thread.
 | 
|    // RefreshPolicyPrefsOnFileThread takes ownership of the |callback| object.
 | 
| @@ -245,10 +291,44 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|        BrowserThread::ID calling_thread_id,
 | 
|        PrefStore* new_managed_platform_pref_store,
 | 
|        PrefStore* new_device_management_pref_store,
 | 
| -      PrefStore* new_recommended_pref_store,
 | 
| -      AfterRefreshCallback* callback);
 | 
| +      PrefStore* new_recommended_pref_store);
 | 
| +
 | 
| +  // NotificationObserver methods:
 | 
| +  virtual void Observe(NotificationType type,
 | 
| +                       const NotificationSource& source,
 | 
| +                       const NotificationDetails& details);
 | 
| +
 | 
| +  // Called from the PrefStoreKeeper implementation when a pref value for |key|
 | 
| +  // changed in the pref store for |type|.
 | 
| +  void OnPrefValueChanged(PrefStoreType type, const std::string& key);
 | 
|  
 | 
| -  scoped_ptr<PrefStore> pref_stores_[PrefNotifier::PREF_STORE_TYPE_MAX + 1];
 | 
| +  // Handle the event that the store for |type| has completed initialization.
 | 
| +  void OnInitializationCompleted(PrefStoreType type);
 | 
| +
 | 
| +  // Initializes a pref store keeper. Sets up a PrefStoreKeeper that will take
 | 
| +  // ownership of the passed |pref_store|.
 | 
| +  void InitPrefStore(PrefStoreType type, PrefStore* pref_store);
 | 
| +
 | 
| +  // Checks whether initialization is completed and tells the notifier if that
 | 
| +  // is the case.
 | 
| +  void CheckInitializationCompleted();
 | 
| +
 | 
| +  // Get the PrefStore pointer for the given type. May return NULL if there is
 | 
| +  // no PrefStore for that type.
 | 
| +  PrefStore* GetPrefStore(PrefStoreType type) {
 | 
| +    return pref_stores_[type].store();
 | 
| +  }
 | 
| +  const PrefStore* GetPrefStore(PrefStoreType type) const {
 | 
| +    return pref_stores_[type].store();
 | 
| +  }
 | 
| +
 | 
| +  // Keeps the PrefStore references in order of precedence.
 | 
| +  PrefStoreKeeper pref_stores_[PREF_STORE_TYPE_MAX + 1];
 | 
| +
 | 
| +  // Used for generating PREF_CHANGED and PREF_INITIALIZATION_COMPLETED
 | 
| +  // notifications. This is a weak reference, since the notifier is owned by the
 | 
| +  // corresponding PrefService.
 | 
| +  PrefNotifier* pref_notifier_;
 | 
|  
 | 
|    // A mapping of preference names to their registered types.
 | 
|    PrefTypeMap pref_types_;
 | 
| @@ -258,6 +338,9 @@ class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore> {
 | 
|    // upon policy refresh.
 | 
|    Profile* profile_;
 | 
|  
 | 
| +  // TODO(mnissler): Remove this after cleaning up policy refresh handling.
 | 
| +  NotificationRegistrar registrar_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(PrefValueStore);
 | 
|  };
 | 
|  
 | 
| 
 |