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