12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/default_pref_store.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_store.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry::PrefRegistry()
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : defaults_(new DefaultPrefStore()) {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry::~PrefRegistry() {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<PrefStore> PrefRegistry::defaults() {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return defaults_.get();
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry::const_iterator PrefRegistry::begin() const {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return defaults_->begin();
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PrefRegistry::const_iterator PrefRegistry::end() const {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return defaults_->end();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefRegistry::SetDefaultPrefValue(const char* pref_name,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       base::Value* value) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(value);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const base::Value* current_value = NULL;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(defaults_->GetValue(pref_name, &current_value))
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      << "Setting default for unregistered pref: " << pref_name;
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(value->IsType(current_value->GetType()))
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      << "Wrong type for new default: " << pref_name;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  defaults_->ReplaceDefaultValue(pref_name, make_scoped_ptr(value));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefRegistry::RegisterPreference(const char* path,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::Value* default_value) {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Value::Type orig_type = default_value->GetType();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(orig_type != base::Value::TYPE_NULL &&
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         orig_type != base::Value::TYPE_BINARY) <<
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         "invalid preference type: " << orig_type;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!defaults_->GetValue(path, NULL)) <<
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "Trying to register a previously registered pref: " << path;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  defaults_->SetDefaultValue(path, make_scoped_ptr(default_value));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
54