| Index: chrome/browser/extensions/extension_pref_value_map.cc
|
| diff --git a/chrome/browser/extensions/extension_pref_value_map.cc b/chrome/browser/extensions/extension_pref_value_map.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3ae4ca95cc4ca8126796965a47e4dfd9794d06c7
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/extension_pref_value_map.cc
|
| @@ -0,0 +1,181 @@
|
| +// 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.
|
| +
|
| +#include "chrome/browser/extensions/extension_pref_value_map.h"
|
| +
|
| +#include "base/stl_util-inl.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/prefs/pref_value_map.h"
|
| +
|
| +ExtensionPrefValueMap::ExtensionPrefValueMap() {
|
| +}
|
| +
|
| +ExtensionPrefValueMap::~ExtensionPrefValueMap() {
|
| + NotifyOfDestruction();
|
| + STLDeleteValues(&entries_);
|
| + entries_.clear();
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::SetExtensionPref(const std::string& ext_id,
|
| + const std::string& key,
|
| + bool incognito,
|
| + Value* value) {
|
| + PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, incognito);
|
| +
|
| + if (prefs->SetValue(key, value))
|
| + NotifyPrefValueChanged(key);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::RemoveExtensionPref(const std::string& ext_id,
|
| + const std::string& key,
|
| + bool incognito) {
|
| + PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, incognito);
|
| + if (prefs->RemoveValue(key))
|
| + NotifyPrefValueChanged(key);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::RegisterExtension(const std::string& ext_id,
|
| + const base::Time& install_time,
|
| + bool is_enabled) {
|
| + if (entries_.find(ext_id) != entries_.end())
|
| + UnregisterExtension(ext_id);
|
| + entries_[ext_id] = new ExtensionEntry;
|
| + entries_[ext_id]->install_time = install_time;
|
| + entries_[ext_id]->enabled = is_enabled;
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::UnregisterExtension(const std::string& ext_id) {
|
| + ExtensionEntryMap::iterator i = entries_.find(ext_id);
|
| + if (i == entries_.end())
|
| + return;
|
| + std::set<std::string> keys; // keys set by this extension
|
| + GetExtensionControlledKeys(*(i->second), &keys);
|
| +
|
| + delete i->second;
|
| + entries_.erase(i);
|
| +
|
| + NotifyPrefValueChanged(keys);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::SetExtensionState(const std::string& ext_id,
|
| + bool is_enabled) {
|
| + ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
|
| + CHECK(i != entries_.end());
|
| + if (i->second->enabled == is_enabled)
|
| + return;
|
| + std::set<std::string> keys; // keys set by this extension
|
| + GetExtensionControlledKeys(*(i->second), &keys);
|
| + i->second->enabled = is_enabled;
|
| + NotifyPrefValueChanged(keys);
|
| +}
|
| +
|
| +PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap(
|
| + const std::string& ext_id,
|
| + bool incognito) {
|
| + ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
|
| + CHECK(i != entries_.end());
|
| + return incognito ? &(i->second->inc_preferences)
|
| + : &(i->second->reg_preferences);
|
| +}
|
| +
|
| +const PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap(
|
| + const std::string& ext_id,
|
| + bool incognito) const {
|
| + ExtensionEntryMap::const_iterator i = entries_.find(ext_id);
|
| + CHECK(i != entries_.end());
|
| + return incognito ? &(i->second->inc_preferences)
|
| + : &(i->second->reg_preferences);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::GetExtensionControlledKeys(
|
| + const ExtensionEntry& entry,
|
| + std::set<std::string>* out) const {
|
| + PrefValueMap::const_iterator i;
|
| +
|
| + const PrefValueMap& reg_prefs = entry.reg_preferences;
|
| + for (i = reg_prefs.begin(); i != reg_prefs.end(); ++i)
|
| + out->insert(i->first);
|
| +
|
| + const PrefValueMap& inc_prefs = entry.inc_preferences;
|
| + for (i = inc_prefs.begin(); i != inc_prefs.end(); ++i)
|
| + out->insert(i->first);
|
| +}
|
| +
|
| +const Value* ExtensionPrefValueMap::GetEffectivePrefValue(
|
| + const std::string& key,
|
| + bool incognito) const {
|
| + Value *winner = NULL;
|
| + base::Time winners_install_time;
|
| +
|
| + ExtensionEntryMap::const_iterator i;
|
| + for (i = entries_.begin(); i != entries_.end(); ++i) {
|
| + const std::string& ext_id = i->first;
|
| + const base::Time& install_time = i->second->install_time;
|
| + const bool enabled = i->second->enabled;
|
| +
|
| + if (!enabled)
|
| + continue;
|
| + if (install_time < winners_install_time)
|
| + continue;
|
| +
|
| + Value* value = NULL;
|
| + const PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, false);
|
| + if (prefs->GetValue(key, &value)) {
|
| + winner = value;
|
| + winners_install_time = install_time;
|
| + }
|
| +
|
| + if (!incognito)
|
| + continue;
|
| +
|
| + prefs = GetExtensionPrefValueMap(ext_id, true);
|
| + if (prefs->GetValue(key, &value)) {
|
| + winner = value;
|
| + winners_install_time = install_time;
|
| + }
|
| + }
|
| + return winner;
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::AddObserver(
|
| + ExtensionPrefValueMap::Observer* observer) {
|
| + observers_.AddObserver(observer);
|
| +
|
| + // Collect all currently used keys and notify the new observer.
|
| + std::set<std::string> keys;
|
| + ExtensionEntryMap::const_iterator i;
|
| + for (i = entries_.begin(); i != entries_.end(); ++i)
|
| + GetExtensionControlledKeys(*(i->second), &keys);
|
| +
|
| + std::set<std::string>::const_iterator j;
|
| + for (j = keys.begin(); j != keys.end(); ++j)
|
| + observer->OnPrefValueChanged(*j);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::RemoveObserver(
|
| + ExtensionPrefValueMap::Observer* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::NotifyInitializationCompleted() {
|
| + FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_,
|
| + OnInitializationCompleted());
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::NotifyPrefValueChanged(
|
| + const std::set<std::string>& keys) {
|
| + std::set<std::string>::const_iterator i;
|
| + for (i = keys.begin(); i != keys.end(); ++i)
|
| + NotifyPrefValueChanged(*i);
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::NotifyPrefValueChanged(const std::string& key) {
|
| + FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_,
|
| + OnPrefValueChanged(key));
|
| +}
|
| +
|
| +void ExtensionPrefValueMap::NotifyOfDestruction() {
|
| + FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_,
|
| + OnExtensionPrefValueMapDestruction());
|
| +}
|
|
|