15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/testing_pref_store.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestingPrefStore::TestingPrefStore() 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : read_only_(true), 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch read_success_(true), 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch read_error_(PersistentPrefStore::PREF_READ_ERROR_NONE), 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch block_async_read_(false), 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_async_read_(false), 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch init_complete_(false), 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch committed_(true) {} 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::GetValue(const std::string& key, 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value** value) const { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prefs_.GetValue(key, value); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::GetMutableValue(const std::string& key, 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value** value) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prefs_.GetValue(key, value); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::AddObserver(PrefStore::Observer* observer) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::RemoveObserver(PrefStore::Observer* observer) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool TestingPrefStore::HasObservers() const { 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return observers_.might_have_observers(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::IsInitializationComplete() const { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return init_complete_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TestingPrefStore::SetValue(const std::string& key, base::Value* value) { 46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (prefs_.SetValue(key, value)) { 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch committed_ = false; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyPrefValueChanged(key); 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TestingPrefStore::SetValueSilently(const std::string& key, 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Value* value) { 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (prefs_.SetValue(key, value)) 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch committed_ = false; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::RemoveValue(const std::string& key) { 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (prefs_.RemoveValue(key)) { 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch committed_ = false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyPrefValueChanged(key); 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::ReadOnly() const { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return read_only_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PersistentPrefStore::PrefReadError TestingPrefStore::GetReadError() const { 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return read_error_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PersistentPrefStore::PrefReadError TestingPrefStore::ReadPrefs() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyInitializationCompleted(); 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return read_error_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TestingPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) { 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!pending_async_read_); 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch error_delegate_.reset(error_delegate); 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (block_async_read_) 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_async_read_ = true; 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch else 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NotifyInitializationCompleted(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TestingPrefStore::CommitPendingWrite() { committed_ = true; } 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::SetInitializationCompleted() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyInitializationCompleted(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::NotifyPrefValueChanged(const std::string& key) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(Observer, observers_, OnPrefValueChanged(key)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::NotifyInitializationCompleted() { 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!init_complete_); 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch init_complete_ = true; 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (read_success_ && read_error_ != PREF_READ_ERROR_NONE && error_delegate_) 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch error_delegate_->OnError(read_error_); 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FOR_EACH_OBSERVER( 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Observer, observers_, OnInitializationCompleted(read_success_)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::ReportValueChanged(const std::string& key) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(Observer, observers_, OnPrefValueChanged(key)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::SetString(const std::string& key, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& value) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetValue(key, new base::StringValue(value)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::SetInteger(const std::string& key, int value) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetValue(key, new base::FundamentalValue(value)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::SetBoolean(const std::string& key, bool value) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetValue(key, new base::FundamentalValue(value)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::GetString(const std::string& key, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* value) const { 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* stored_value; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs_.GetValue(key, &stored_value) || !stored_value) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stored_value->GetAsString(value); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::GetInteger(const std::string& key, int* value) const { 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* stored_value; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs_.GetValue(key, &stored_value) || !stored_value) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stored_value->GetAsInteger(value); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestingPrefStore::GetBoolean(const std::string& key, bool* value) const { 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::Value* stored_value; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!prefs_.GetValue(key, &stored_value) || !stored_value) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stored_value->GetAsBoolean(value); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TestingPrefStore::SetBlockAsyncRead(bool block_async_read) { 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!init_complete_); 150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch block_async_read_ = block_async_read; 151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (pending_async_read_ && !block_async_read_) 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NotifyInitializationCompleted(); 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestingPrefStore::set_read_only(bool read_only) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_only_ = read_only; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TestingPrefStore::set_read_success(bool read_success) { 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!init_complete_); 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch read_success_ = read_success; 162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TestingPrefStore::set_read_error( 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PersistentPrefStore::PrefReadError read_error) { 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(!init_complete_); 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch read_error_ = read_error; 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestingPrefStore::~TestingPrefStore() {} 171