Index: chrome/browser/prefs/pref_service.cc |
diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc |
index 68edbb53df23c166634228fde75deaa204d36181..2ab04f89704f96059a3865a67e7bf74fe2f95917 100644 |
--- a/chrome/browser/prefs/pref_service.cc |
+++ b/chrome/browser/prefs/pref_service.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 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. |
@@ -20,9 +20,11 @@ |
#include "base/utf_string_conversions.h" |
#include "build/build_config.h" |
#include "chrome/browser/browser_thread.h" |
+#include "chrome/browser/extensions/extension_pref_store.h" |
#include "chrome/browser/policy/configuration_policy_pref_store.h" |
#include "chrome/browser/prefs/command_line_pref_store.h" |
#include "chrome/browser/prefs/default_pref_store.h" |
+#include "chrome/browser/prefs/overlay_persistent_pref_store.h" |
#include "chrome/browser/prefs/pref_notifier_impl.h" |
#include "chrome/browser/prefs/pref_value_store.h" |
#include "chrome/common/json_pref_store.h" |
@@ -114,9 +116,15 @@ PrefService* PrefService::CreatePrefService(const FilePath& pref_filename, |
BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); |
ConfigurationPolicyPrefStore* recommended = |
ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore(); |
+ DefaultPrefStore* default_pref_store = new DefaultPrefStore(); |
return new PrefService(managed, device_management, extension_prefs, |
- command_line, user, recommended); |
+ command_line, user, recommended, default_pref_store); |
+} |
+ |
+PrefService* PrefService::CreateIncognitoPrefService( |
+ PrefStore* incognito_extension_prefs) { |
+ return new PrefService(*this, incognito_extension_prefs); |
} |
PrefService::PrefService(PrefStore* managed_platform_prefs, |
@@ -124,10 +132,11 @@ PrefService::PrefService(PrefStore* managed_platform_prefs, |
PrefStore* extension_prefs, |
PrefStore* command_line_prefs, |
PersistentPrefStore* user_prefs, |
- PrefStore* recommended_prefs) |
- : user_pref_store_(user_prefs) { |
+ PrefStore* recommended_prefs, |
+ DefaultPrefStore* default_store) |
+ : user_pref_store_(user_prefs), |
+ default_store_(default_store) { |
pref_notifier_.reset(new PrefNotifierImpl(this)); |
- default_store_ = new DefaultPrefStore(); |
pref_value_store_ = |
new PrefValueStore(managed_platform_prefs, |
device_management_prefs, |
@@ -135,11 +144,29 @@ PrefService::PrefService(PrefStore* managed_platform_prefs, |
command_line_prefs, |
user_pref_store_, |
recommended_prefs, |
- default_store_, |
+ default_store, |
pref_notifier_.get()); |
InitFromStorage(); |
} |
+PrefService::PrefService(const PrefService& original, |
+ PrefStore* incognito_extension_prefs) |
+ : user_pref_store_( |
+ new OverlayPersistentPrefStore(original.user_pref_store_.get())), |
+ default_store_(original.default_store_.get()){ |
+ pref_notifier_.reset(new PrefNotifierImpl(this)); |
+ pref_value_store_ = original.pref_value_store_->CloneAndSpecialize( |
+ NULL, // managed_platform_prefs |
+ NULL, // device_management_prefs |
+ incognito_extension_prefs, |
+ NULL, // command_line_prefs |
+ user_pref_store_.get(), |
+ NULL, // recommended_prefs |
+ default_store_.get(), |
+ pref_notifier_.get() ); |
+ InitFromStorage(); |
+} |
+ |
PrefService::~PrefService() { |
DCHECK(CalledOnValidThread()); |
STLDeleteContainerPointers(prefs_.begin(), prefs_.end()); |
@@ -325,15 +352,23 @@ FilePath PrefService::GetFilePath(const char* path) const { |
} |
bool PrefService::HasPrefPath(const char* path) const { |
- return pref_value_store_->HasPrefPath(path); |
+ const Preference* pref = FindPreference(path); |
+ return pref && !pref->IsDefaultValue(); |
} |
const PrefService::Preference* PrefService::FindPreference( |
const char* pref_name) const { |
DCHECK(CalledOnValidThread()); |
- Preference p(this, pref_name); |
+ Preference p(this, pref_name, Value::TYPE_NULL); |
PreferenceSet::const_iterator it = prefs_.find(&p); |
- return it == prefs_.end() ? NULL : *it; |
+ if (it != prefs_.end()) |
+ return *it; |
+ const Value::ValueType type = default_store_->GetType(pref_name); |
+ if (type == Value::TYPE_NULL) |
+ return NULL; |
+ Preference* new_pref = new Preference(this, pref_name, type); |
+ prefs_.insert(new_pref); |
+ return new_pref; |
} |
bool PrefService::ReadOnly() const { |
@@ -346,10 +381,7 @@ PrefNotifier* PrefService::pref_notifier() const { |
bool PrefService::IsManagedPreference(const char* pref_name) const { |
const Preference* pref = FindPreference(pref_name); |
- if (pref && pref->IsManaged()) { |
- return true; |
- } |
- return false; |
+ return pref && pref->IsManaged(); |
} |
const DictionaryValue* PrefService::GetDictionary(const char* path) const { |
@@ -405,18 +437,8 @@ void PrefService::RegisterPreference(const char* path, Value* default_value) { |
DCHECK(orig_type != Value::TYPE_NULL && orig_type != Value::TYPE_BINARY) << |
"invalid preference type: " << orig_type; |
- // We set the default value of dictionaries and lists to be null so it's |
- // easier for callers to check for empty dict/list prefs. The PrefValueStore |
- // accepts ownership of the value (null or default_value). |
- if (Value::TYPE_LIST == orig_type || Value::TYPE_DICTIONARY == orig_type) { |
- default_store_->SetDefaultValue(path, Value::CreateNullValue()); |
- } else { |
- // Hand off ownership. |
- default_store_->SetDefaultValue(path, scoped_value.release()); |
- } |
- |
- pref_value_store_->RegisterPreferenceType(path, orig_type); |
- prefs_.insert(new Preference(this, path)); |
+ // Hand off ownership. |
+ default_store_->SetDefaultValue(path, scoped_value.release()); |
} |
void PrefService::ClearPref(const char* path) { |
@@ -439,13 +461,7 @@ void PrefService::Set(const char* path, const Value& value) { |
return; |
} |
- // Allow dictionary and list types to be set to null, which removes their |
- // user values. |
- if (value.GetType() == Value::TYPE_NULL && |
- (pref->GetType() == Value::TYPE_DICTIONARY || |
- pref->GetType() == Value::TYPE_LIST)) { |
- user_pref_store_->RemoveValue(path); |
- } else if (pref->GetType() != value.GetType()) { |
+ if (pref->GetType() != value.GetType()) { |
NOTREACHED() << "Trying to set pref " << path |
<< " of type " << pref->GetType() |
<< " to value of type " << value.GetType(); |
@@ -587,15 +603,17 @@ void PrefService::SetUserPrefValue(const char* path, Value* new_value) { |
// PrefService::Preference |
PrefService::Preference::Preference(const PrefService* service, |
- const char* name) |
+ const char* name, |
+ Value::ValueType type) |
: name_(name), |
+ type_(type), |
pref_service_(service) { |
DCHECK(name); |
DCHECK(service); |
} |
Value::ValueType PrefService::Preference::GetType() const { |
- return pref_service_->pref_value_store_->GetRegisteredType(name_); |
+ return type_; |
} |
const Value* PrefService::Preference::GetValue() const { |
@@ -603,8 +621,10 @@ const Value* PrefService::Preference::GetValue() const { |
"Must register pref before getting its value"; |
Value* found_value = NULL; |
- if (pref_service_->pref_value_store_->GetValue(name_, &found_value)) |
+ if (pref_service_->pref_value_store_->GetValue(name_, type_, &found_value)) { |
+ DCHECK(found_value->IsType(type_)); |
return found_value; |
+ } |
// Every registered preference has at least a default value. |
NOTREACHED() << "no valid value found for registered pref " << name_; |