Chromium Code Reviews| Index: chrome/browser/extensions/extension_pref_value_map.cc |
| diff --git a/chrome/browser/extensions/extension_pref_value_map.cc b/chrome/browser/extensions/extension_pref_value_map.cc |
| index 2fa1483e2ea79cd0128cfd6a2cbcb04ab86f0711..68d185e9f420c31bb6c9000d018612a3bda3bc11 100644 |
| --- a/chrome/browser/extensions/extension_pref_value_map.cc |
| +++ b/chrome/browser/extensions/extension_pref_value_map.cc |
| @@ -17,6 +17,8 @@ struct ExtensionPrefValueMap::ExtensionEntry { |
| PrefValueMap reg_preferences; |
| // Persistent incognito preferences, empty for regular ExtensionPrefStore. |
| PrefValueMap inc_preferences_persistent; |
| + // Incognito preferences that are bound to a single incognito session. |
| + PrefValueMap inc_preferences_session; |
| }; |
| ExtensionPrefValueMap::ExtensionPrefValueMap() { |
| @@ -65,6 +67,24 @@ bool ExtensionPrefValueMap::CanExtensionControlPref( |
| return winner->second->install_time <= ext->second->install_time; |
| } |
| +void ExtensionPrefValueMap::ClearAllIncognitoSessionOnlyPreferences() { |
| + typedef std::set<std::string> KeySet; |
| + KeySet deleted_keys; |
| + |
| + ExtensionEntryMap::iterator i; |
| + for (i = entries_.begin(); i != entries_.end(); ++i) { |
| + PrefValueMap& inc_prefs = i->second->inc_preferences_session; |
| + PrefValueMap::iterator j; |
| + for (j = inc_prefs.begin(); j != inc_prefs.end(); ++j) |
| + deleted_keys.insert(j->first); |
| + inc_prefs.Clear(); |
| + } |
| + |
| + KeySet::iterator k; |
| + for (k = deleted_keys.begin(); k != deleted_keys.end(); ++k) |
| + 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.
|
| +} |
| + |
| bool ExtensionPrefValueMap::DoesExtensionControlPref( |
| const std::string& extension_id, |
| const std::string& pref_key, |
| @@ -124,6 +144,8 @@ PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( |
| return &(i->second->reg_preferences); |
| case extension_prefs_scope::kIncognitoPersistent: |
| return &(i->second->inc_preferences_persistent); |
| + case extension_prefs_scope::kIncognitoSessionOnly: |
| + return &(i->second->inc_preferences_session); |
| } |
| NOTREACHED(); |
| return NULL; |
| @@ -139,6 +161,8 @@ const PrefValueMap* ExtensionPrefValueMap::GetExtensionPrefValueMap( |
| return &(i->second->reg_preferences); |
| case extension_prefs_scope::kIncognitoPersistent: |
| return &(i->second->inc_preferences_persistent); |
| + case extension_prefs_scope::kIncognitoSessionOnly: |
| + return &(i->second->inc_preferences_session); |
| } |
| NOTREACHED(); |
| return NULL; |
| @@ -156,6 +180,10 @@ void ExtensionPrefValueMap::GetExtensionControlledKeys( |
| const PrefValueMap& inc_prefs_pers = entry.inc_preferences_persistent; |
| for (i = inc_prefs_pers.begin(); i != inc_prefs_pers.end(); ++i) |
| out->insert(i->first); |
| + |
| + const PrefValueMap& inc_prefs_session = entry.inc_preferences_session; |
| + for (i = inc_prefs_session.begin(); i != inc_prefs_session.end(); ++i) |
| + out->insert(i->first); |
| } |
| const Value* ExtensionPrefValueMap::GetEffectivePrefValue( |
| @@ -169,11 +197,23 @@ const Value* ExtensionPrefValueMap::GetEffectivePrefValue( |
| const Value* value = NULL; |
| const std::string& ext_id = winner->first; |
| + |
| + // First search for incognito session only preferences. |
| if (incognito) { |
| const PrefValueMap* prefs = GetExtensionPrefValueMap( |
| + ext_id, extension_prefs_scope::kIncognitoSessionOnly); |
| + prefs->GetValue(key, &value); |
| + } |
| + |
| + // If no incognito session only preference exists, fall back to persistent |
| + // incognito preference. |
| + if (incognito && !value) { |
| + const PrefValueMap* prefs = GetExtensionPrefValueMap( |
| ext_id, extension_prefs_scope::kIncognitoPersistent); |
| prefs->GetValue(key, &value); |
| } |
| + |
| + // Finally consider a regular preference. |
| if (!value) { |
| const PrefValueMap* prefs = GetExtensionPrefValueMap( |
| ext_id, extension_prefs_scope::kRegular); |
| @@ -222,6 +262,15 @@ ExtensionPrefValueMap::GetEffectivePrefValueController( |
| if (from_incognito) |
| *from_incognito = true; |
| } |
| + |
| + prefs = GetExtensionPrefValueMap( |
| + ext_id, extension_prefs_scope::kIncognitoSessionOnly); |
| + if (prefs->GetValue(key, &value)) { |
| + winner = i; |
| + winners_install_time = install_time; |
| + if (from_incognito) |
| + *from_incognito = true; |
| + } |
| } |
| return winner; |
| } |