Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_pref_value_map.h" | 5 #include "chrome/browser/extensions/extension_pref_value_map.h" |
| 6 | 6 |
| 7 #include "base/stl_util-inl.h" | 7 #include "base/stl_util-inl.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "chrome/browser/prefs/pref_value_map.h" | 9 #include "chrome/browser/prefs/pref_value_map.h" |
| 10 | 10 |
| 11 struct ExtensionPrefValueMap::ExtensionEntry { | 11 struct ExtensionPrefValueMap::ExtensionEntry { |
| 12 // Installation time of the extension. | 12 // Installation time of the extension. |
| 13 base::Time install_time; | 13 base::Time install_time; |
| 14 // Whether extension is enabled in the profile. | 14 // Whether extension is enabled in the profile. |
| 15 bool enabled; | 15 bool enabled; |
| 16 // Regular preferences. | 16 // Regular preferences. |
| 17 PrefValueMap reg_preferences; | 17 PrefValueMap reg_preferences; |
| 18 // Persistent incognito preferences, empty for regular ExtensionPrefStore. | 18 // Persistent incognito preferences, empty for regular ExtensionPrefStore. |
| 19 PrefValueMap inc_preferences_persistent; | 19 PrefValueMap inc_preferences_persistent; |
| 20 // Incognito preferences that are bound to a single incognito session. | |
| 21 PrefValueMap inc_preferences_session; | |
| 20 }; | 22 }; |
| 21 | 23 |
| 22 ExtensionPrefValueMap::ExtensionPrefValueMap() { | 24 ExtensionPrefValueMap::ExtensionPrefValueMap() { |
| 23 } | 25 } |
| 24 | 26 |
| 25 ExtensionPrefValueMap::~ExtensionPrefValueMap() { | 27 ExtensionPrefValueMap::~ExtensionPrefValueMap() { |
| 26 NotifyOfDestruction(); | 28 NotifyOfDestruction(); |
| 27 STLDeleteValues(&entries_); | 29 STLDeleteValues(&entries_); |
| 28 entries_.clear(); | 30 entries_.clear(); |
| 29 } | 31 } |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 58 } | 60 } |
| 59 | 61 |
| 60 ExtensionEntryMap::const_iterator winner = | 62 ExtensionEntryMap::const_iterator winner = |
| 61 GetEffectivePrefValueController(pref_key, incognito, NULL); | 63 GetEffectivePrefValueController(pref_key, incognito, NULL); |
| 62 if (winner == entries_.end()) | 64 if (winner == entries_.end()) |
| 63 return true; | 65 return true; |
| 64 | 66 |
| 65 return winner->second->install_time <= ext->second->install_time; | 67 return winner->second->install_time <= ext->second->install_time; |
| 66 } | 68 } |
| 67 | 69 |
| 70 void ExtensionPrefValueMap::ClearAllIncognitoSessionOnlyPreferences() { | |
| 71 typedef std::set<std::string> KeySet; | |
| 72 KeySet deleted_keys; | |
| 73 | |
| 74 ExtensionEntryMap::iterator i; | |
| 75 for (i = entries_.begin(); i != entries_.end(); ++i) { | |
| 76 PrefValueMap& inc_prefs = i->second->inc_preferences_session; | |
| 77 PrefValueMap::iterator j; | |
| 78 for (j = inc_prefs.begin(); j != inc_prefs.end(); ++j) | |
| 79 deleted_keys.insert(j->first); | |
| 80 inc_prefs.Clear(); | |
| 81 } | |
| 82 | |
| 83 KeySet::iterator k; | |
| 84 for (k = deleted_keys.begin(); k != deleted_keys.end(); ++k) | |
| 85 NotifyPrefValueChanged(*k); | |
|
Matt Perry
2011/05/24 22:07:17
Is it necessarily true that the effective pref val
Bernhard Bauer
2011/05/24 22:28:06
Hm, for an extension it might also be interesting
Matt Perry
2011/05/24 22:35:02
I agree with that (if the controlling extension ch
battre
2011/05/25 11:51:30
This is exactly what happens.
| |
| 86 } | |
| 87 | |
| 68 bool ExtensionPrefValueMap::DoesExtensionControlPref( | 88 bool ExtensionPrefValueMap::DoesExtensionControlPref( |
| 69 const std::string& extension_id, | 89 const std::string& extension_id, |
| 70 const std::string& pref_key, | 90 const std::string& pref_key, |
| 71 bool incognito) const { | 91 bool incognito) const { |
| 72 ExtensionEntryMap::const_iterator winner = | 92 ExtensionEntryMap::const_iterator winner = |
| 73 GetEffectivePrefValueController(pref_key, incognito, NULL); | 93 GetEffectivePrefValueController(pref_key, incognito, NULL); |
| 74 if (winner == entries_.end()) | 94 if (winner == entries_.end()) |
| 75 return false; | 95 return false; |
| 76 return winner->first == extension_id; | 96 return winner->first == extension_id; |
| 77 } | 97 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( | 137 PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( |
| 118 const std::string& ext_id, | 138 const std::string& ext_id, |
| 119 extension_prefs_scope::Scope scope) { | 139 extension_prefs_scope::Scope scope) { |
| 120 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); | 140 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); |
| 121 CHECK(i != entries_.end()); | 141 CHECK(i != entries_.end()); |
| 122 switch (scope) { | 142 switch (scope) { |
| 123 case extension_prefs_scope::kRegular: | 143 case extension_prefs_scope::kRegular: |
| 124 return &(i->second->reg_preferences); | 144 return &(i->second->reg_preferences); |
| 125 case extension_prefs_scope::kIncognitoPersistent: | 145 case extension_prefs_scope::kIncognitoPersistent: |
| 126 return &(i->second->inc_preferences_persistent); | 146 return &(i->second->inc_preferences_persistent); |
| 147 case extension_prefs_scope::kIncognitoSessionOnly: | |
| 148 return &(i->second->inc_preferences_session); | |
| 127 } | 149 } |
| 128 NOTREACHED(); | 150 NOTREACHED(); |
| 129 return NULL; | 151 return NULL; |
| 130 } | 152 } |
| 131 | 153 |
| 132 const PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( | 154 const PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( |
| 133 const std::string& ext_id, | 155 const std::string& ext_id, |
| 134 extension_prefs_scope::Scope scope) const { | 156 extension_prefs_scope::Scope scope) const { |
| 135 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); | 157 ExtensionEntryMap::const_iterator i = entries_.find(ext_id); |
| 136 CHECK(i != entries_.end()); | 158 CHECK(i != entries_.end()); |
| 137 switch (scope) { | 159 switch (scope) { |
| 138 case extension_prefs_scope::kRegular: | 160 case extension_prefs_scope::kRegular: |
| 139 return &(i->second->reg_preferences); | 161 return &(i->second->reg_preferences); |
| 140 case extension_prefs_scope::kIncognitoPersistent: | 162 case extension_prefs_scope::kIncognitoPersistent: |
| 141 return &(i->second->inc_preferences_persistent); | 163 return &(i->second->inc_preferences_persistent); |
| 164 case extension_prefs_scope::kIncognitoSessionOnly: | |
| 165 return &(i->second->inc_preferences_session); | |
| 142 } | 166 } |
| 143 NOTREACHED(); | 167 NOTREACHED(); |
| 144 return NULL; | 168 return NULL; |
| 145 } | 169 } |
| 146 | 170 |
| 147 void ExtensionPrefValueMap::GetExtensionControlledKeys( | 171 void ExtensionPrefValueMap::GetExtensionControlledKeys( |
| 148 const ExtensionEntry& entry, | 172 const ExtensionEntry& entry, |
| 149 std::set<std::string>* out) const { | 173 std::set<std::string>* out) const { |
| 150 PrefValueMap::const_iterator i; | 174 PrefValueMap::const_iterator i; |
| 151 | 175 |
| 152 const PrefValueMap& reg_prefs = entry.reg_preferences; | 176 const PrefValueMap& reg_prefs = entry.reg_preferences; |
| 153 for (i = reg_prefs.begin(); i != reg_prefs.end(); ++i) | 177 for (i = reg_prefs.begin(); i != reg_prefs.end(); ++i) |
| 154 out->insert(i->first); | 178 out->insert(i->first); |
| 155 | 179 |
| 156 const PrefValueMap& inc_prefs_pers = entry.inc_preferences_persistent; | 180 const PrefValueMap& inc_prefs_pers = entry.inc_preferences_persistent; |
| 157 for (i = inc_prefs_pers.begin(); i != inc_prefs_pers.end(); ++i) | 181 for (i = inc_prefs_pers.begin(); i != inc_prefs_pers.end(); ++i) |
| 158 out->insert(i->first); | 182 out->insert(i->first); |
| 183 | |
| 184 const PrefValueMap& inc_prefs_session = entry.inc_preferences_session; | |
| 185 for (i = inc_prefs_session.begin(); i != inc_prefs_session.end(); ++i) | |
| 186 out->insert(i->first); | |
| 159 } | 187 } |
| 160 | 188 |
| 161 const Value* ExtensionPrefValueMap::GetEffectivePrefValue( | 189 const Value* ExtensionPrefValueMap::GetEffectivePrefValue( |
| 162 const std::string& key, | 190 const std::string& key, |
| 163 bool incognito, | 191 bool incognito, |
| 164 bool* from_incognito) const { | 192 bool* from_incognito) const { |
| 165 ExtensionEntryMap::const_iterator winner = | 193 ExtensionEntryMap::const_iterator winner = |
| 166 GetEffectivePrefValueController(key, incognito, from_incognito); | 194 GetEffectivePrefValueController(key, incognito, from_incognito); |
| 167 if (winner == entries_.end()) | 195 if (winner == entries_.end()) |
| 168 return NULL; | 196 return NULL; |
| 169 | 197 |
| 170 const Value* value = NULL; | 198 const Value* value = NULL; |
| 171 const std::string& ext_id = winner->first; | 199 const std::string& ext_id = winner->first; |
| 200 | |
| 201 // First search for incognito session only preferences. | |
| 172 if (incognito) { | 202 if (incognito) { |
| 173 const PrefValueMap* prefs = GetExtensionPrefValueMap( | 203 const PrefValueMap* prefs = GetExtensionPrefValueMap( |
| 204 ext_id, extension_prefs_scope::kIncognitoSessionOnly); | |
| 205 prefs->GetValue(key, &value); | |
| 206 } | |
| 207 | |
| 208 // If no incognito session only preference exists, fall back to persistent | |
| 209 // incognito preference. | |
| 210 if (incognito && !value) { | |
| 211 const PrefValueMap* prefs = GetExtensionPrefValueMap( | |
| 174 ext_id, extension_prefs_scope::kIncognitoPersistent); | 212 ext_id, extension_prefs_scope::kIncognitoPersistent); |
| 175 prefs->GetValue(key, &value); | 213 prefs->GetValue(key, &value); |
| 176 } | 214 } |
| 215 | |
| 216 // Finally consider a regular preference. | |
| 177 if (!value) { | 217 if (!value) { |
| 178 const PrefValueMap* prefs = GetExtensionPrefValueMap( | 218 const PrefValueMap* prefs = GetExtensionPrefValueMap( |
| 179 ext_id, extension_prefs_scope::kRegular); | 219 ext_id, extension_prefs_scope::kRegular); |
| 180 prefs->GetValue(key, &value); | 220 prefs->GetValue(key, &value); |
| 181 } | 221 } |
| 182 return value; | 222 return value; |
| 183 } | 223 } |
| 184 | 224 |
| 185 ExtensionPrefValueMap::ExtensionEntryMap::const_iterator | 225 ExtensionPrefValueMap::ExtensionEntryMap::const_iterator |
| 186 ExtensionPrefValueMap::GetEffectivePrefValueController( | 226 ExtensionPrefValueMap::GetEffectivePrefValueController( |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 215 continue; | 255 continue; |
| 216 | 256 |
| 217 prefs = GetExtensionPrefValueMap( | 257 prefs = GetExtensionPrefValueMap( |
| 218 ext_id, extension_prefs_scope::kIncognitoPersistent); | 258 ext_id, extension_prefs_scope::kIncognitoPersistent); |
| 219 if (prefs->GetValue(key, &value)) { | 259 if (prefs->GetValue(key, &value)) { |
| 220 winner = i; | 260 winner = i; |
| 221 winners_install_time = install_time; | 261 winners_install_time = install_time; |
| 222 if (from_incognito) | 262 if (from_incognito) |
| 223 *from_incognito = true; | 263 *from_incognito = true; |
| 224 } | 264 } |
| 265 | |
| 266 prefs = GetExtensionPrefValueMap( | |
| 267 ext_id, extension_prefs_scope::kIncognitoSessionOnly); | |
| 268 if (prefs->GetValue(key, &value)) { | |
| 269 winner = i; | |
| 270 winners_install_time = install_time; | |
| 271 if (from_incognito) | |
| 272 *from_incognito = true; | |
| 273 } | |
| 225 } | 274 } |
| 226 return winner; | 275 return winner; |
| 227 } | 276 } |
| 228 | 277 |
| 229 void ExtensionPrefValueMap::AddObserver( | 278 void ExtensionPrefValueMap::AddObserver( |
| 230 ExtensionPrefValueMap::Observer* observer) { | 279 ExtensionPrefValueMap::Observer* observer) { |
| 231 observers_.AddObserver(observer); | 280 observers_.AddObserver(observer); |
| 232 | 281 |
| 233 // Collect all currently used keys and notify the new observer. | 282 // Collect all currently used keys and notify the new observer. |
| 234 std::set<std::string> keys; | 283 std::set<std::string> keys; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 260 | 309 |
| 261 void ExtensionPrefValueMap::NotifyPrefValueChanged(const std::string& key) { | 310 void ExtensionPrefValueMap::NotifyPrefValueChanged(const std::string& key) { |
| 262 FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, | 311 FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, |
| 263 OnPrefValueChanged(key)); | 312 OnPrefValueChanged(key)); |
| 264 } | 313 } |
| 265 | 314 |
| 266 void ExtensionPrefValueMap::NotifyOfDestruction() { | 315 void ExtensionPrefValueMap::NotifyOfDestruction() { |
| 267 FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, | 316 FOR_EACH_OBSERVER(ExtensionPrefValueMap::Observer, observers_, |
| 268 OnExtensionPrefValueMapDestruction()); | 317 OnExtensionPrefValueMapDestruction()); |
| 269 } | 318 } |
| OLD | NEW |