// Copyright (c) 2012 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. #include "libcef/browser/prefs/pref_store.h" #include #include #include "base/memory/ptr_util.h" #include "base/values.h" CefPrefStore::CefPrefStore() : read_only_(true), read_success_(true), read_error_(PersistentPrefStore::PREF_READ_ERROR_NONE), block_async_read_(false), pending_async_read_(false), init_complete_(false), committed_(true) {} bool CefPrefStore::GetValue(const std::string& key, const base::Value** value) const { return prefs_.GetValue(key, value); } std::unique_ptr CefPrefStore::GetValues() const { return prefs_.AsDictionaryValue(); } bool CefPrefStore::GetMutableValue(const std::string& key, base::Value** value) { return prefs_.GetValue(key, value); } void CefPrefStore::AddObserver(PrefStore::Observer* observer) { observers_.AddObserver(observer); } void CefPrefStore::RemoveObserver(PrefStore::Observer* observer) { observers_.RemoveObserver(observer); } bool CefPrefStore::HasObservers() const { return observers_.might_have_observers(); } bool CefPrefStore::IsInitializationComplete() const { return init_complete_; } void CefPrefStore::SetValue(const std::string& key, std::unique_ptr value, uint32_t flags) { if (prefs_.SetValue(key, base::Value::FromUniquePtrValue(std::move(value)))) { committed_ = false; NotifyPrefValueChanged(key); } } void CefPrefStore::SetValueSilently(const std::string& key, std::unique_ptr value, uint32_t flags) { if (prefs_.SetValue(key, base::Value::FromUniquePtrValue(std::move(value)))) committed_ = false; } void CefPrefStore::RemoveValue(const std::string& key, uint32_t flags) { if (prefs_.RemoveValue(key)) { committed_ = false; NotifyPrefValueChanged(key); } } bool CefPrefStore::ReadOnly() const { return read_only_; } PersistentPrefStore::PrefReadError CefPrefStore::GetReadError() const { return read_error_; } PersistentPrefStore::PrefReadError CefPrefStore::ReadPrefs() { NotifyInitializationCompleted(); return read_error_; } void CefPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) { DCHECK(!pending_async_read_); error_delegate_.reset(error_delegate); if (block_async_read_) pending_async_read_ = true; else NotifyInitializationCompleted(); } void CefPrefStore::CommitPendingWrite( base::OnceClosure done_callback, base::OnceClosure synchronous_done_callback) { committed_ = true; PersistentPrefStore::CommitPendingWrite(std::move(done_callback), std::move(synchronous_done_callback)); } void CefPrefStore::SchedulePendingLossyWrites() {} void CefPrefStore::ClearMutableValues() { NOTIMPLEMENTED(); } void CefPrefStore::OnStoreDeletionFromDisk() {} void CefPrefStore::SetInitializationCompleted() { NotifyInitializationCompleted(); } void CefPrefStore::NotifyPrefValueChanged(const std::string& key) { for (Observer& observer : observers_) observer.OnPrefValueChanged(key); } void CefPrefStore::NotifyInitializationCompleted() { DCHECK(!init_complete_); init_complete_ = true; if (read_success_ && read_error_ != PREF_READ_ERROR_NONE && error_delegate_) error_delegate_->OnError(read_error_); for (Observer& observer : observers_) observer.OnInitializationCompleted(read_success_); } void CefPrefStore::ReportValueChanged(const std::string& key, uint32_t flags) { for (Observer& observer : observers_) observer.OnPrefValueChanged(key); } void CefPrefStore::SetString(const std::string& key, const std::string& value) { SetValue(key, std::make_unique(value), DEFAULT_PREF_WRITE_FLAGS); } void CefPrefStore::SetInteger(const std::string& key, int value) { SetValue(key, std::make_unique(value), DEFAULT_PREF_WRITE_FLAGS); } void CefPrefStore::SetBoolean(const std::string& key, bool value) { SetValue(key, std::make_unique(value), DEFAULT_PREF_WRITE_FLAGS); } bool CefPrefStore::GetString(const std::string& key, std::string* value) const { const base::Value* stored_value; if (!prefs_.GetValue(key, &stored_value) || !stored_value) return false; return stored_value->GetAsString(value); } bool CefPrefStore::GetInteger(const std::string& key, int* value) const { const base::Value* stored_value; if (!prefs_.GetValue(key, &stored_value) || !stored_value) return false; return stored_value->GetAsInteger(value); } bool CefPrefStore::GetBoolean(const std::string& key, bool* value) const { const base::Value* stored_value; if (!prefs_.GetValue(key, &stored_value) || !stored_value) return false; return stored_value->GetAsBoolean(value); } void CefPrefStore::SetBlockAsyncRead(bool block_async_read) { DCHECK(!init_complete_); block_async_read_ = block_async_read; if (pending_async_read_ && !block_async_read_) NotifyInitializationCompleted(); } void CefPrefStore::set_read_only(bool read_only) { read_only_ = read_only; } void CefPrefStore::set_read_success(bool read_success) { DCHECK(!init_complete_); read_success_ = read_success; } void CefPrefStore::set_read_error( PersistentPrefStore::PrefReadError read_error) { DCHECK(!init_complete_); read_error_ = read_error; } CefPrefStore::~CefPrefStore() {}