| Index: base/prefs/scoped_user_pref_update.h
|
| diff --git a/base/prefs/scoped_user_pref_update.h b/base/prefs/scoped_user_pref_update.h
|
| index ce03c6a830da2e493eb8d80ed574832bae58914a..29ad8526cd3c3c91630cd58a71f631be136e371a 100644
|
| --- a/base/prefs/scoped_user_pref_update.h
|
| +++ b/base/prefs/scoped_user_pref_update.h
|
| @@ -1,7 +1,108 @@
|
| // Copyright 2013 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
| +//
|
| +// A helper class that assists preferences in firing notifications when lists
|
| +// or dictionaries are changed.
|
|
|
| -// TODO(brettw) remove this forwarding header when prefs is completely moved to
|
| -// components.
|
| -#include "components/prefs/scoped_user_pref_update.h"
|
| +#ifndef BASE_PREFS_SCOPED_USER_PREF_UPDATE_H_
|
| +#define BASE_PREFS_SCOPED_USER_PREF_UPDATE_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/prefs/base_prefs_export.h"
|
| +#include "base/prefs/pref_service.h"
|
| +#include "base/threading/non_thread_safe.h"
|
| +#include "base/values.h"
|
| +
|
| +class PrefService;
|
| +
|
| +namespace base {
|
| +class DictionaryValue;
|
| +class ListValue;
|
| +}
|
| +
|
| +namespace subtle {
|
| +
|
| +// Base class for ScopedUserPrefUpdateTemplate that contains the parts
|
| +// that do not depend on ScopedUserPrefUpdateTemplate's template parameter.
|
| +//
|
| +// We need this base class mostly for making it a friend of PrefService
|
| +// and getting access to PrefService::GetMutableUserPref and
|
| +// PrefService::ReportUserPrefChanged.
|
| +class BASE_PREFS_EXPORT ScopedUserPrefUpdateBase : public base::NonThreadSafe {
|
| + protected:
|
| + ScopedUserPrefUpdateBase(PrefService* service, const std::string& path);
|
| +
|
| + // Calls Notify().
|
| + ~ScopedUserPrefUpdateBase();
|
| +
|
| + // Sets |value_| to |service_|->GetMutableUserPref and returns it.
|
| + base::Value* GetValueOfType(base::Value::Type type);
|
| +
|
| + private:
|
| + // If |value_| is not null, triggers a notification of PrefObservers and
|
| + // resets |value_|.
|
| + void Notify();
|
| +
|
| + // Weak pointer.
|
| + PrefService* service_;
|
| + // Path of the preference being updated.
|
| + std::string path_;
|
| + // Cache of value from user pref store (set between Get() and Notify() calls).
|
| + base::Value* value_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedUserPrefUpdateBase);
|
| +};
|
| +
|
| +} // namespace subtle
|
| +
|
| +// Class to support modifications to DictionaryValues and ListValues while
|
| +// guaranteeing that PrefObservers are notified of changed values.
|
| +//
|
| +// This class may only be used on the UI thread as it requires access to the
|
| +// PrefService.
|
| +template <typename T, base::Value::Type type_enum_value>
|
| +class ScopedUserPrefUpdate : public subtle::ScopedUserPrefUpdateBase {
|
| + public:
|
| + ScopedUserPrefUpdate(PrefService* service, const std::string& path)
|
| + : ScopedUserPrefUpdateBase(service, path) {}
|
| +
|
| + // Triggers an update notification if Get() was called.
|
| + virtual ~ScopedUserPrefUpdate() {}
|
| +
|
| + // Returns a mutable |T| instance that
|
| + // - is already in the user pref store, or
|
| + // - is (silently) created and written to the user pref store if none existed
|
| + // before.
|
| + //
|
| + // Calling Get() implies that an update notification is necessary at
|
| + // destruction time.
|
| + //
|
| + // The ownership of the return value remains with the user pref store.
|
| + // Virtual so it can be overriden in subclasses that transform the value
|
| + // before returning it (for example to return a subelement of a dictionary).
|
| + virtual T* Get() {
|
| + return static_cast<T*>(GetValueOfType(type_enum_value));
|
| + }
|
| +
|
| + T& operator*() {
|
| + return *Get();
|
| + }
|
| +
|
| + T* operator->() {
|
| + return Get();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedUserPrefUpdate);
|
| +};
|
| +
|
| +typedef ScopedUserPrefUpdate<base::DictionaryValue,
|
| + base::Value::TYPE_DICTIONARY>
|
| + DictionaryPrefUpdate;
|
| +typedef ScopedUserPrefUpdate<base::ListValue, base::Value::TYPE_LIST>
|
| + ListPrefUpdate;
|
| +
|
| +#endif // BASE_PREFS_SCOPED_USER_PREF_UPDATE_H_
|
|
|