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 |