blob: bec2aeff3106c804c87f1a2168da63b81fa79ffe [file] [log] [blame]
// Copyright 2017 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.
#ifndef SERVICES_PREFERENCES_PUBLIC_CPP_PREF_STORE_CLIENT_MIXIN_H_
#define SERVICES_PREFERENCES_PUBLIC_CPP_PREF_STORE_CLIENT_MIXIN_H_
#include <memory>
#include <string>
#include <vector>
#include "base/macros.h"
#include "base/observer_list.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "services/preferences/public/mojom/preferences.mojom.h"
namespace base {
class DictionaryValue;
class Value;
}
namespace prefs {
// An mixin implementation of PrefStore which uses prefs::mojom::PrefStore as
// the backing store of the preferences.
//
// PrefStoreClientMixin provides synchronous access to the preferences stored by
// the backing store by caching them locally.
template <typename BasePrefStore>
class PrefStoreClientMixin : public BasePrefStore,
public mojom::PrefStoreObserver {
public:
PrefStoreClientMixin();
// BasePrefStore:
void AddObserver(PrefStore::Observer* observer) override;
void RemoveObserver(PrefStore::Observer* observer) override;
bool HasObservers() const override;
bool IsInitializationComplete() const override;
bool GetValue(const std::string& key,
const base::Value** result) const override;
std::unique_ptr<base::DictionaryValue> GetValues() const override;
protected:
~PrefStoreClientMixin() override;
// Initializes |this|. This must be called before any of the other public or
// protected member functions.
void Init(std::unique_ptr<base::DictionaryValue> initial_prefs,
bool initialized,
mojom::PrefStoreObserverRequest observer_request);
base::DictionaryValue& GetMutableValues();
void ReportPrefValueChanged(const std::string& key);
private:
// prefs::mojom::PreferenceObserver:
void OnPrefsChanged(std::vector<mojom::PrefUpdatePtr> updates) override;
void OnInitializationCompleted(bool succeeded) override;
void OnPrefChangeAck() override;
void OnPrefChanged(const std::string& key,
mojom::PrefUpdateValuePtr update_value);
// Should this client ignore a write received from the service? The default
// implementation never skips writes.
virtual bool ShouldSkipWrite(const std::string& key,
const std::vector<std::string>& path,
const base::Value* new_value);
// Cached preferences.
// If null, indicates that initialization failed.
std::unique_ptr<base::DictionaryValue> cached_prefs_;
base::ObserverList<PrefStore::Observer, true>::Unchecked observers_;
// Has the PrefStore we're observing been initialized?
bool initialized_ = false;
mojo::Binding<mojom::PrefStoreObserver> observer_binding_;
DISALLOW_COPY_AND_ASSIGN(PrefStoreClientMixin);
};
extern template class PrefStoreClientMixin<::PrefStore>;
extern template class PrefStoreClientMixin<::PersistentPrefStore>;
} // namespace prefs
#endif // SERVICES_PREFERENCES_PUBLIC_CPP_PREF_STORE_CLIENT_MIXIN_H_