Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: chrome/browser/extensions/extension_pref_value_map.cc

Issue 7067040: Enable incognito_session_only preferences (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698