172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_pref_value_map.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/stl_util-inl.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/pref_value_map.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstruct ExtensionPrefValueMap::ExtensionEntry { 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Installation time of the extension. 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Time install_time; 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Whether extension is enabled in the profile. 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool enabled; 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Regular preferences. 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueMap reg_preferences; 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Incognito preferences, empty for regular ExtensionPrefStore. 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueMap inc_preferences; 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenExtensionPrefValueMap::ExtensionPrefValueMap() { 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenExtensionPrefValueMap::~ExtensionPrefValueMap() { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyOfDestruction(); 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STLDeleteValues(&entries_); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entries_.clear(); 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::SetExtensionPref(const std::string& ext_id, 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& key, 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool incognito, 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Value* value) { 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, incognito); 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (prefs->SetValue(key, value)) 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyPrefValueChanged(key); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::RemoveExtensionPref(const std::string& ext_id, 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& key, 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool incognito) { 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, incognito); 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (prefs->RemoveValue(key)) 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyPrefValueChanged(key); 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ExtensionPrefValueMap::CanExtensionControlPref( 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& extension_id, 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& pref_key, 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool incognito) const { 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEntryMap::const_iterator ext = entries_.find(extension_id); 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (ext == entries_.end()) { 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED(); 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEntryMap::const_iterator winner = 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetEffectivePrefValueController(pref_key, incognito, NULL); 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (winner == entries_.end()) 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return true; 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return winner->second->install_time <= ext->second->install_time; 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ExtensionPrefValueMap::DoesExtensionControlPref( 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& extension_id, 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& pref_key, 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool incognito) const { 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEntryMap::const_iterator winner = 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetEffectivePrefValueController(pref_key, incognito, NULL); 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (winner == entries_.end()) 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return false; 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return winner->first == extension_id; 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::RegisterExtension(const std::string& ext_id, 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const base::Time& install_time, 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool is_enabled) { 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (entries_.find(ext_id) != entries_.end()) 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UnregisterExtension(ext_id); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entries_[ext_id] = new ExtensionEntry; 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entries_[ext_id]->install_time = install_time; 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entries_[ext_id]->enabled = is_enabled; 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::UnregisterExtension(const std::string& ext_id) { 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::iterator i = entries_.find(ext_id); 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i == entries_.end()) 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string> keys; // keys set by this extension 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetExtensionControlledKeys(*(i->second), &keys); 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delete i->second; 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entries_.erase(i); 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyPrefValueChanged(keys); 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::SetExtensionState(const std::string& ext_id, 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool is_enabled) { 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CHECK(i != entries_.end()); 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (i->second->enabled == is_enabled) 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string> keys; // keys set by this extension 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetExtensionControlledKeys(*(i->second), &keys); 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i->second->enabled = is_enabled; 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyPrefValueChanged(keys); 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& ext_id, 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool incognito) { 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CHECK(i != entries_.end()); 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return incognito ? &(i->second->inc_preferences) 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : &(i->second->reg_preferences); 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& ext_id, 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool incognito) const { 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::const_iterator i = entries_.find(ext_id); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CHECK(i != entries_.end()); 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return incognito ? &(i->second->inc_preferences) 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : &(i->second->reg_preferences); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::GetExtensionControlledKeys( 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const ExtensionEntry& entry, 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string>* out) const { 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen PrefValueMap::const_iterator i; 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const PrefValueMap& reg_prefs = entry.reg_preferences; 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (i = reg_prefs.begin(); i != reg_prefs.end(); ++i) 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen out->insert(i->first); 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const PrefValueMap& inc_prefs = entry.inc_preferences; 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (i = inc_prefs.begin(); i != inc_prefs.end(); ++i) 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen out->insert(i->first); 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst Value* ExtensionPrefValueMap::GetEffectivePrefValue( 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& key, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool incognito, 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool* from_incognito) const { 149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEntryMap::const_iterator winner = 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetEffectivePrefValueController(key, incognito, from_incognito); 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (winner == entries_.end()) 152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return NULL; 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value* value = NULL; 155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& ext_id = winner->first; 156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (incognito) 157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen GetExtensionPrefValueMap(ext_id, true)->GetValue(key, &value); 158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!value) 159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen GetExtensionPrefValueMap(ext_id, false)->GetValue(key, &value); 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return value; 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 163dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionPrefValueMap::ExtensionEntryMap::const_iterator 164dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionPrefValueMap::GetEffectivePrefValueController( 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& key, 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool incognito, 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool* from_incognito) const { 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEntryMap::const_iterator winner = entries_.end(); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::Time winners_install_time; 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::const_iterator i; 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (i = entries_.begin(); i != entries_.end(); ++i) { 17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& ext_id = i->first; 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const base::Time& install_time = i->second->install_time; 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const bool enabled = i->second->enabled; 17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!enabled) 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (install_time < winners_install_time) 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Value* value = NULL; 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const PrefValueMap* prefs = GetExtensionPrefValueMap(ext_id, false); 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (prefs->GetValue(key, &value)) { 185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen winner = i; 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen winners_install_time = install_time; 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (from_incognito) 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *from_incognito = false; 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!incognito) 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen continue; 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen prefs = GetExtensionPrefValueMap(ext_id, true); 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (prefs->GetValue(key, &value)) { 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen winner = i; 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen winners_install_time = install_time; 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (from_incognito) 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *from_incognito = true; 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return winner; 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::AddObserver( 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionPrefValueMap::Observer* observer) { 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen observers_.AddObserver(observer); 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Collect all currently used keys and notify the new observer. 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string> keys; 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionEntryMap::const_iterator i; 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (i = entries_.begin(); i != entries_.end(); ++i) 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetExtensionControlledKeys(*(i->second), &keys); 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string>::const_iterator j; 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (j = keys.begin(); j != keys.end(); ++j) 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen observer->OnPrefValueChanged(*j); 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::RemoveObserver( 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionPrefValueMap::Observer* observer) { 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen observers_.RemoveObserver(observer); 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::NotifyInitializationCompleted() { 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnInitializationCompleted()); 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::NotifyPrefValueChanged( 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::set<std::string>& keys) { 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<std::string>::const_iterator i; 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (i = keys.begin(); i != keys.end(); ++i) 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotifyPrefValueChanged(*i); 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::NotifyPrefValueChanged(const std::string& key) { 23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnPrefValueChanged(key)); 24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ExtensionPrefValueMap::NotifyOfDestruction() { 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen OnExtensionPrefValueMapDestruction()); 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 246