Index: chrome/browser/extensions/extension_pref_store.cc |
=================================================================== |
--- chrome/browser/extensions/extension_pref_store.cc (revision 0) |
+++ chrome/browser/extensions/extension_pref_store.cc (revision 0) |
@@ -0,0 +1,105 @@ |
+// Copyright (c) 2010 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 "chrome/browser/extensions/extension_pref_store.h" |
+ |
+#include "base/logging.h" |
+#include "base/values.h" |
+#include "chrome/browser/pref_service.h" |
+ |
+ExtensionPrefStore::ExtensionPrefStore(PrefService* pref_service) |
+ : pref_service_(pref_service), |
+ prefs_(new DictionaryValue()) { |
+} |
+ |
+// This could be sped up by keeping track of which extension currently controls |
+// a given preference, among other optimizations. But we estimate that fewer |
+// than 10 installed extensions will be trying to control any preferences, so |
+// stick with this simpler algorithm until it causes a problem. |
+void ExtensionPrefStore::UpdateOnePref(const wchar_t* path) { |
+ // Query the PrefService to find the current value for this pref. |
+ // pref_service_ might be null in unit tests. |
+ scoped_ptr<Value> old_value; |
+ if (pref_service_) { |
+ old_value.reset( |
+ pref_service_->FindPreference(path)->GetValue()->DeepCopy()); |
+ } |
+ |
+ // DictionaryValue::Set complains if a key is overwritten with the same |
+ // value, so delete it first. |
+ prefs_->Remove(path, NULL); |
+ |
+ // Find the first extension that wants to set this pref and use its value. |
+ for (ExtensionStack::iterator ext_iter = extension_stack_.begin(); |
+ ext_iter != extension_stack_.end(); ++ext_iter) { |
+ PrefValueMap::iterator value_iter = (*ext_iter)->pref_values->find(path); |
+ if (value_iter != (*ext_iter)->pref_values->end()) { |
+ prefs_->Set(path, (*value_iter).second->DeepCopy()); |
+ break; |
+ } |
+ } |
+ if (pref_service_) |
+ pref_service_->FireObserversIfChanged(path, old_value.get()); |
+} |
+ |
+void ExtensionPrefStore::UpdatePrefs(const PrefValueMap* pref_values) { |
+ for (PrefValueMap::const_iterator i = pref_values->begin(); |
+ i != pref_values->end(); ++i) { |
+ UpdateOnePref(i->first); |
+ } |
+} |
+ |
+void ExtensionPrefStore::InstallExtensionPref(std::string extension_id, |
+ const wchar_t* pref_path, |
+ Value* pref_value) { |
+ ExtensionStack::iterator i; |
+ for (i = extension_stack_.begin(); i != extension_stack_.end(); ++i) { |
+ if ((*i)->extension_id == extension_id) |
+ break; |
+ } |
+ |
+ // If this extension is already in the stack, update or add the value of this |
+ // preference, but don't change the extension's position in the stack. |
+ // Otherwise, push the new extension onto the stack. |
+ PrefValueMap* pref_values; |
+ if (i != extension_stack_.end()) { |
+ pref_values = (*i)->pref_values; |
+ (*pref_values)[pref_path] = pref_value; |
+ } else { |
+ pref_values = new PrefValueMap(); |
+ (*pref_values)[pref_path] = pref_value; |
+ |
+ ExtensionPrefs* extension_prefs = new ExtensionPrefs(); |
+ extension_prefs->extension_id = extension_id; |
+ extension_prefs->pref_values = pref_values; |
+ extension_stack_.push_front(extension_prefs); |
+ } |
+ |
+ // Look for an old value with the same type as the one we're modifying. |
+ UpdateOnePref(pref_path); |
+} |
+ |
+void ExtensionPrefStore::UninstallExtension(std::string extension_id) { |
+ // Remove this extension from the stack. |
+ scoped_ptr<PrefValueMap> pref_values; |
+ for (ExtensionStack::iterator i = extension_stack_.begin(); |
+ i != extension_stack_.end(); ++i) { |
+ if ((*i)->extension_id == extension_id) { |
+ pref_values.reset((*i)->pref_values); |
+ extension_stack_.erase(i); |
+ break; |
+ } |
+ } |
+ if (!pref_values.get()) |
+ return; |
+ |
+ UpdatePrefs(pref_values.get()); |
+} |
+ |
+void ExtensionPrefStore::GetExtensionIDs(std::vector<std::string>* result) { |
+ for (ExtensionStack::iterator i = extension_stack_.begin(); |
+ i != extension_stack_.end(); ++i) { |
+ (*result).push_back((*i)->extension_id); |
+ } |
+} |
Property changes on: chrome\browser\extensions\extension_pref_store.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |