Chromium Code Reviews| Index: chrome/browser/extensions/extension_prefs.cc |
| diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc |
| index 1f128ab2f7ce218be0f3f783fd8bbde5b772d424..e1919d3c5ea3d5ec313218c21e7d1fcfd5103178 100644 |
| --- a/chrome/browser/extensions/extension_prefs.cc |
| +++ b/chrome/browser/extensions/extension_prefs.cc |
| @@ -141,12 +141,17 @@ static void ExtentToStringSet(const ExtensionExtent& host_extent, |
| } // namespace |
| -ExtensionPrefs::ExtensionPrefs(PrefService* prefs, |
| - const FilePath& root_dir, |
| - ExtensionPrefStore* pref_store) |
| +ExtensionPrefs::ExtensionPrefs( |
| + PrefService* prefs, |
| + PrefService* incognito_prefs, |
| + const FilePath& root_dir, |
| + ExtensionPrefStore* pref_store, |
| + ExtensionPrefStore* incognito_pref_store) |
| : prefs_(prefs), |
| + incognito_prefs_(incognito_prefs), |
| install_directory_(root_dir), |
| - pref_store_(pref_store) { |
| + pref_store_(pref_store), |
| + incognito_pref_store_(incognito_pref_store) { |
| // TODO(asargent) - Remove this in a couple of months. (See comment above |
| // CleanupBadExtensionKeys). |
| CleanupBadExtensionKeys(prefs_); |
| @@ -823,10 +828,15 @@ void ExtensionPrefs::UpdateExtensionPref(const std::string& extension_id, |
| } |
| void ExtensionPrefs::DeleteExtensionPrefs(const std::string& extension_id) { |
| - DictionaryValue* dict = prefs_->GetMutableDictionary(kExtensionsPref); |
| - if (dict->HasKey(extension_id)) { |
| - dict->Remove(extension_id, NULL); |
| - SavePrefsAndNotify(); |
| + for (int incognito = 0; incognito <= 1; ++incognito) { |
|
danno
2010/12/22 10:48:21
Ouch. This fast-and-loose use of boolean/int conve
battre
2010/12/22 18:34:53
Done. - Though with "boolean incognito" instead of
|
| + PrefService* prefs = incognito ? incognito_prefs_ : prefs_; |
| + if (!prefs) // May be null for unit tests. |
| + continue; |
| + DictionaryValue* dict = prefs->GetMutableDictionary(kExtensionsPref); |
| + if (dict->HasKey(extension_id)) { |
| + dict->Remove(extension_id, NULL); |
| + SavePrefsAndNotify(); |
| + } |
| } |
| } |
| @@ -854,14 +864,32 @@ DictionaryValue* ExtensionPrefs::GetExtensionPref( |
| } |
| DictionaryValue* ExtensionPrefs::GetExtensionControlledPrefs( |
| - const std::string& extension_id) const { |
| - DictionaryValue* extension = GetExtensionPref(extension_id); |
| - if (!extension) { |
| - NOTREACHED(); |
| + const std::string& extension_id, |
| + bool incognito) const { |
| + PrefService* source = incognito ? incognito_prefs_ : prefs_; |
| + if (source == NULL) // May be null for unit tests. |
| return NULL; |
| + DictionaryValue* source_dict = source->GetMutableDictionary(kExtensionsPref); |
| + |
| + // The user pref store of incognito_prefs_ should have a kExtensionsPref |
| + // dictionary. The request must not fall through to the underlying |
| + // PrefService. |
| + if (incognito && |
| + source_dict == prefs_->GetMutableDictionary(kExtensionsPref)) { |
| + DictionaryValue empty; |
| + incognito_prefs_->Set(kExtensionsPref, empty); |
| + source_dict = source->GetMutableDictionary(kExtensionsPref); |
| } |
| + DCHECK(!incognito || |
| + source_dict != prefs_->GetMutableDictionary(kExtensionsPref)); |
| + |
| DictionaryValue* preferences = NULL; |
| - extension->GetDictionary(kPrefPreferences, &preferences); |
| + std::string key = extension_id + std::string(".") + kPrefPreferences; |
| + if (!source_dict->GetDictionary(key, &preferences)) { |
| + source_dict->Set(key, new DictionaryValue); |
| + bool success = source_dict->GetDictionary(key, &preferences); |
| + DCHECK(success); |
| + } |
| return preferences; |
| } |
| @@ -1194,11 +1222,12 @@ void ExtensionPrefs::InitPrefStore() { |
| // Store winning preference for each extension controlled preference. |
| UpdatePrefStore(ext_controlled_prefs); |
| - pref_store_->OnInitializationCompleted(); |
| + if (pref_store_) |
| + pref_store_->OnInitializationCompleted(); |
| } |
| const Value* ExtensionPrefs::GetWinningExtensionControlledPrefValue( |
| - const std::string& key) const { |
| + const std::string& key, bool incognito) const { |
| Value *winner = NULL; |
| base::Time winners_install_time = base::Time(); |
| @@ -1213,12 +1242,14 @@ const Value* ExtensionPrefs::GetWinningExtensionControlledPrefValue( |
| if (extension_install_time < winners_install_time) |
| continue; |
| - DictionaryValue* preferences = GetExtensionControlledPrefs(*ext_id); |
| - Value *value = NULL; |
| - if (preferences && preferences->GetWithoutPathExpansion(key, &value)) { |
| - // This extension is more recent than the last one providing this pref. |
| - winner = value; |
| - winners_install_time = extension_install_time; |
| + for (int i = 0; i <= (incognito ? 1 : 0); ++i) { |
| + DictionaryValue* preferences = GetExtensionControlledPrefs(*ext_id, !!i); |
|
danno
2010/12/22 10:48:21
whoa. !!!(likes(danno, this)). Is this really more
battre
2010/12/22 18:34:53
Philistine! This is art. ;-)
Done.
|
| + Value *value = NULL; |
| + if (preferences && preferences->GetWithoutPathExpansion(key, &value)) { |
| + // This extension is more recent than the last one providing this pref. |
| + winner = value; |
| + winners_install_time = extension_install_time; |
| + } |
| } |
| } |
| @@ -1229,42 +1260,44 @@ void ExtensionPrefs::UpdatePrefStore( |
| const ExtensionPrefs::PrefKeySet& pref_keys) { |
| for (PrefKeySet::const_iterator i = pref_keys.begin(); |
| i != pref_keys.end(); ++i) { |
| - UpdatePrefStore(*i); |
| + UpdatePrefStore(*i, false); // Regular PrefService. |
| + UpdatePrefStore(*i, true); // Incognito PrefService. |
| } |
| } |
| -void ExtensionPrefs::UpdatePrefStore(const std::string& pref_key) { |
| - if (pref_store_ == NULL) |
| +void ExtensionPrefs::UpdatePrefStore(const std::string& pref_key, |
| + bool incognito) { |
| + scoped_refptr<ExtensionPrefStore> destination = |
| + incognito ? incognito_pref_store_ : pref_store_; |
| + if (destination == NULL) // May be null for unit tests. |
| return; |
| const Value* winning_pref_value = |
| - GetWinningExtensionControlledPrefValue(pref_key); |
| + GetWinningExtensionControlledPrefValue(pref_key, incognito); |
| if (winning_pref_value) |
| - pref_store_->SetExtensionPref(pref_key, winning_pref_value->DeepCopy()); |
| + destination->SetExtensionPref(pref_key, winning_pref_value->DeepCopy()); |
| else |
| - pref_store_->RemoveExtensionPref(pref_key); |
| + destination->RemoveExtensionPref(pref_key); |
| } |
| void ExtensionPrefs::SetExtensionControlledPref(const std::string& extension_id, |
| const std::string& pref_key, |
| + bool incognito, |
| Value* value) { |
| scoped_ptr<Value> scoped_value(value); |
| DCHECK(pref_service()->FindPreference(pref_key.c_str())) |
| << "Extension controlled preference key " << pref_key |
| << " not registered."; |
| - DictionaryValue* extension_preferences = |
| - GetExtensionControlledPrefs(extension_id); |
| - if (extension_preferences == NULL) { // May be pruned when writing to disk. |
| - DictionaryValue* extension = GetExtensionPref(extension_id); |
| - if (extension == NULL) { |
| - LOG(ERROR) << "Extension preference for " << extension_id << " undefined"; |
| - return; |
| - } |
| - extension_preferences = new DictionaryValue; |
| - extension->Set(kPrefPreferences, extension_preferences); |
| + if (incognito && !incognito_pref_store_) { |
| + LOG(WARNING) << "Ignoring SetExtensionControlledPref for incognito " |
| + << "preferences, missing an incognito_pref_store."; |
| + return; |
| } |
| + DictionaryValue* extension_preferences = |
| + GetExtensionControlledPrefs(extension_id, incognito); |
| + |
| Value* oldValue = NULL; |
| extension_preferences->GetWithoutPathExpansion(pref_key, &oldValue); |
| bool modified = !Value::Equals(oldValue, scoped_value.get()); |
| @@ -1276,19 +1309,25 @@ void ExtensionPrefs::SetExtensionControlledPref(const std::string& extension_id, |
| else |
| extension_preferences->SetWithoutPathExpansion(pref_key, |
| scoped_value.release()); |
| - pref_service()->ScheduleSavePersistentPrefs(); |
| + if (!incognito) |
| + pref_service()->ScheduleSavePersistentPrefs(); |
| - UpdatePrefStore(pref_key); |
| + if (!incognito) |
| + UpdatePrefStore(pref_key, false); // Update regular prefs. |
| + UpdatePrefStore(pref_key, true); // Update incognito prefs. |
| } |
| void ExtensionPrefs::GetExtensionControlledPrefKeys( |
| const std::string& extension_id, PrefKeySet *out) const { |
| DCHECK(out != NULL); |
| - DictionaryValue* ext_prefs = GetExtensionControlledPrefs(extension_id); |
| - if (ext_prefs) { |
| - for (DictionaryValue::key_iterator i = ext_prefs->begin_keys(); |
| - i != ext_prefs->end_keys(); ++i) { |
| - out->insert(*i); |
| + for (int incognito = 0; incognito <= 1; ++incognito) { |
| + DictionaryValue* ext_prefs = GetExtensionControlledPrefs(extension_id, |
| + !!incognito); |
|
danno
2010/12/22 10:48:21
!!!(still_likes(danno, this))
battre
2010/12/22 18:34:53
Done.
|
| + if (ext_prefs) { |
| + for (DictionaryValue::key_iterator i = ext_prefs->begin_keys(); |
| + i != ext_prefs->end_keys(); ++i) { |
| + out->insert(*i); |
| + } |
| } |
| } |
| } |