Chromium Code Reviews| Index: chrome/browser/content_settings/content_settings_pref_provider.cc |
| diff --git a/chrome/browser/content_settings/content_settings_pref_provider.cc b/chrome/browser/content_settings/content_settings_pref_provider.cc |
| index 37f60c1fd50a52a961af2375517afed99094a2e2..2cf5a066ccf49873ee692962ddbd665ad85e20c6 100644 |
| --- a/chrome/browser/content_settings/content_settings_pref_provider.cc |
| +++ b/chrome/browser/content_settings/content_settings_pref_provider.cc |
| @@ -44,7 +44,7 @@ const char* kResourceTypeNames[] = { |
| NULL, |
| NULL, |
| NULL, // Not used for Notifications |
| - NULL, // Not used for Intents. |
| + NULL, |
| NULL, |
| }; |
| COMPILE_ASSERT(arraysize(kResourceTypeNames) == CONTENT_SETTINGS_NUM_TYPES, |
| @@ -73,9 +73,7 @@ const char* kTypeNames[] = { |
| "plugins", |
| "popups", |
| "geolocation", |
| - // TODO(markusheintz): Refactoring in progress. Content settings exceptions |
| - // for notifications added next. |
| - "notifications", // Only used for default Notifications settings. |
| + "notifications", |
| "intents", |
| "auto-select-certificate" |
| }; |
| @@ -123,6 +121,24 @@ ContentSetting FixObsoleteCookiePromptMode(ContentSettingsType content_type, |
| return setting; |
| } |
| +// Clears all settings for the given |type| in the given |pattern_pairs| |
| +// dictionary. |
| +void ClearSettings(ContentSettingsType type, |
| + DictionaryValue* pattern_pairs) { |
| + std::string type_name(kTypeNames[type]); |
| + for (DictionaryValue::key_iterator i = pattern_pairs->begin_keys(); |
| + i != pattern_pairs->end_keys(); |
| + ++i) { |
| + const std::string& pattern_pair(*i); |
| + |
| + DictionaryValue* settings = NULL; |
| + pattern_pairs->GetDictionaryWithoutPathExpansion( |
| + pattern_pair, &settings); |
| + |
| + settings->RemoveWithoutPathExpansion(type_name, NULL); |
| + } |
| +} |
| + |
| } // namespace |
| namespace content_settings { |
| @@ -371,6 +387,10 @@ void PrefProvider::RegisterUserPrefs(PrefService* prefs) { |
| PrefService::SYNCABLE_PREF); |
| prefs->RegisterDictionaryPref(prefs::kContentSettingsPatterns, |
| PrefService::SYNCABLE_PREF); |
| + prefs->RegisterListPref(prefs::kDesktopNotificationAllowedOrigins, |
| + PrefService::SYNCABLE_PREF); |
| + prefs->RegisterListPref(prefs::kDesktopNotificationDeniedOrigins, |
| + PrefService::SYNCABLE_PREF); |
| prefs->RegisterListPref(prefs::kPopupWhitelistedHosts, |
| PrefService::UNSYNCABLE_PREF); |
| prefs->RegisterDictionaryPref(prefs::kPerHostContentSettings, |
| @@ -389,6 +409,7 @@ PrefProvider::PrefProvider(PrefService* prefs, |
| MigrateObsoletePopupsPref(); |
| MigrateObsoleteContentSettingsPatternPref(); |
| MigrateObsoleteGeolocationPref(); |
| + MigrateObsoleteNotificationsPrefs(); |
| } |
| // Verify preferences version. |
| @@ -413,6 +434,8 @@ PrefProvider::PrefProvider(PrefService* prefs, |
| pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this); |
| pref_change_registrar_.Add(prefs::kContentSettingsPatternPairs, this); |
| pref_change_registrar_.Add(prefs::kGeolocationContentSettings, this); |
| + pref_change_registrar_.Add(prefs::kDesktopNotificationAllowedOrigins, this); |
| + pref_change_registrar_.Add(prefs::kDesktopNotificationDeniedOrigins, this); |
| } |
| ContentSetting PrefProvider::GetContentSetting( |
| @@ -511,6 +534,7 @@ void PrefProvider::SetContentSetting( |
| content_type, |
| resource_identifier, |
| setting); |
| + prefs_->ScheduleSavePersistentPrefs(); |
| } |
| NotifyObservers( |
| @@ -545,7 +569,7 @@ void PrefProvider::ClearAllContentSettingsRules( |
| } |
| } |
| } |
| - |
| + prefs_->ScheduleSavePersistentPrefs(); |
| NotifyObservers(ContentSettingsPattern(), |
| ContentSettingsPattern(), |
| content_type, |
| @@ -568,16 +592,20 @@ void PrefProvider::Observe( |
| std::string* name = Details<std::string>(details).ptr(); |
| if (*name == prefs::kContentSettingsPatternPairs) { |
| SyncObsoletePatternPref(); |
| - SyncObsoleteGeolocationPref(); |
| + SyncObsoletePrefs(); |
| } else if (*name == prefs::kContentSettingsPatterns) { |
| MigrateObsoleteContentSettingsPatternPref(); |
| } else if (*name == prefs::kGeolocationContentSettings) { |
| MigrateObsoleteGeolocationPref(); |
| + } else if (*name == prefs::kDesktopNotificationAllowedOrigins || |
| + *name == prefs::kDesktopNotificationDeniedOrigins) { |
| + MigrateObsoleteNotificationsPrefs(); |
| } else { |
| NOTREACHED() << "Unexpected preference observed"; |
| return; |
| } |
| } |
| + prefs_->ScheduleSavePersistentPrefs(); |
| ReadContentSettingsFromPref(true); |
| NotifyObservers(ContentSettingsPattern(), |
| @@ -603,11 +631,17 @@ void PrefProvider::UpdatePref( |
| const ResourceIdentifier& resource_identifier, |
| ContentSetting setting) { |
| AutoReset<bool> auto_reset(&updating_preferences_, true); |
| - UpdatePatternPairsPref(primary_pattern, |
| - secondary_pattern, |
| - content_type, |
| - resource_identifier, |
| - setting); |
| + { |
| + DictionaryPrefUpdate update(prefs_, |
| + prefs::kContentSettingsPatternPairs); |
| + DictionaryValue* pattern_pairs_settings = update.Get(); |
| + UpdatePatternPairsSettings(primary_pattern, |
| + secondary_pattern, |
| + content_type, |
| + resource_identifier, |
| + setting, |
| + pattern_pairs_settings); |
| + } |
| if (content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION && |
| content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
| UpdateObsoletePatternsPref(primary_pattern, |
| @@ -615,9 +649,18 @@ void PrefProvider::UpdatePref( |
| content_type, |
| resource_identifier, |
| setting); |
| - } |
| - if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
| + } else if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) { |
| UpdateObsoleteGeolocationPref(primary_pattern, secondary_pattern, setting); |
| + } else if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
| + ListPrefUpdate update_allowed_sites( |
| + prefs_, prefs::kDesktopNotificationAllowedOrigins); |
| + ListPrefUpdate update_denied_sites( |
| + prefs_, prefs::kDesktopNotificationDeniedOrigins); |
| + UpdateObsoleteNotificationsSettings(primary_pattern, |
| + secondary_pattern, |
| + setting, |
| + update_allowed_sites.Get(), |
| + update_denied_sites.Get()); |
| } |
| } |
| @@ -779,26 +822,23 @@ void PrefProvider::UpdateObsoletePatternsPref( |
| } |
| } |
| -void PrefProvider::UpdatePatternPairsPref( |
| +void PrefProvider::UpdatePatternPairsSettings( |
| const ContentSettingsPattern& primary_pattern, |
| const ContentSettingsPattern& secondary_pattern, |
| ContentSettingsType content_type, |
| const ResourceIdentifier& resource_identifier, |
| - ContentSetting setting) { |
| - DictionaryPrefUpdate update(prefs_, |
| - prefs::kContentSettingsPatternPairs); |
| - DictionaryValue* all_settings_dictionary = update.Get(); |
| - |
| + ContentSetting setting, |
| + DictionaryValue* pattern_pairs_settings) { |
| // Get settings dictionary for the given patterns. |
| std::string pattern_str(CreatePatternString(primary_pattern, |
| secondary_pattern)); |
| DictionaryValue* settings_dictionary = NULL; |
| - bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion( |
| + bool found = pattern_pairs_settings->GetDictionaryWithoutPathExpansion( |
| pattern_str, &settings_dictionary); |
| if (!found && (setting != CONTENT_SETTING_DEFAULT)) { |
| settings_dictionary = new DictionaryValue; |
| - all_settings_dictionary->SetWithoutPathExpansion( |
| + pattern_pairs_settings->SetWithoutPathExpansion( |
| pattern_str, settings_dictionary); |
| } |
| @@ -840,7 +880,7 @@ void PrefProvider::UpdatePatternPairsPref( |
| } |
| // Remove the settings dictionary if it is empty. |
| if (settings_dictionary->empty()) { |
| - all_settings_dictionary->RemoveWithoutPathExpansion( |
| + pattern_pairs_settings->RemoveWithoutPathExpansion( |
| pattern_str, NULL); |
| } |
| } |
| @@ -883,6 +923,31 @@ void PrefProvider::UpdateObsoleteGeolocationPref( |
| } |
| } |
| +void PrefProvider::UpdateObsoleteNotificationsSettings( |
| + const ContentSettingsPattern& primary_pattern, |
| + const ContentSettingsPattern& secondary_pattern, |
| + ContentSetting setting, |
| + ListValue* allowed_sites, |
| + ListValue* denied_sites) { |
| + DCHECK_EQ(secondary_pattern, ContentSettingsPattern::Wildcard()); |
| + GURL origin(primary_pattern.ToString()); |
| + DCHECK(origin.is_valid()); |
| + scoped_ptr<StringValue> value(new StringValue(origin.spec())); |
| + if (setting == CONTENT_SETTING_ALLOW) { |
| + denied_sites->Remove(*value, NULL); |
| + allowed_sites->AppendIfNotPresent(value.release()); |
| + } else if (setting == CONTENT_SETTING_BLOCK) { |
| + allowed_sites->Remove(*value, NULL); |
| + denied_sites->AppendIfNotPresent(value.release()); |
| + } else if (setting == CONTENT_SETTING_DEFAULT) { |
| + denied_sites->Remove(*value, NULL); |
| + allowed_sites->Remove(*value, NULL); |
| + } else { |
| + NOTREACHED() << "Setting value: " << setting |
| + << " is not supported for notifications"; |
| + } |
| +} |
| + |
| // static |
| void PrefProvider::CanonicalizeContentSettingsExceptions( |
| DictionaryValue* all_settings_dictionary) { |
| @@ -1160,6 +1225,10 @@ void PrefProvider::MigrateObsoleteGeolocationPref() { |
| if (!prefs_->HasPrefPath(prefs::kGeolocationContentSettings)) |
| return; |
| + DictionaryPrefUpdate update(prefs_, |
| + prefs::kContentSettingsPatternPairs); |
| + DictionaryValue* pattern_pairs_settings = update.Get(); |
| + |
| const DictionaryValue* geolocation_settings = |
| prefs_->GetDictionary(prefs::kGeolocationContentSettings); |
| for (DictionaryValue::key_iterator i = |
| @@ -1194,22 +1263,78 @@ void PrefProvider::MigrateObsoleteGeolocationPref() { |
| ContentSettingsPattern::FromURLNoWildcard(secondary_url); |
| DCHECK(primary_pattern.IsValid() && secondary_pattern.IsValid()); |
| - UpdatePatternPairsPref(primary_pattern, |
| - secondary_pattern, |
| - CONTENT_SETTINGS_TYPE_GEOLOCATION, |
| - std::string(), |
| - IntToContentSetting(setting_value)); |
| + UpdatePatternPairsSettings(primary_pattern, |
| + secondary_pattern, |
| + CONTENT_SETTINGS_TYPE_GEOLOCATION, |
| + std::string(), |
| + IntToContentSetting(setting_value), |
| + pattern_pairs_settings); |
| } |
| } |
| } |
| -void PrefProvider::SyncObsoleteGeolocationPref() { |
| +void PrefProvider::MigrateObsoleteNotificationsPrefs() { |
| + // The notifications settings in the preferences |
| + // prefs::kContentSettingsPatternPairs do not contain the latest |
| + // notifications settings. So all notification settings are cleared and |
| + // migrated from the obsolete preferences for notifications settings that |
| + // contain the latest settings. |
| + DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs); |
| + DictionaryValue* pattern_pairs_settings = update.Get(); |
| + ClearSettings(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, pattern_pairs_settings); |
| + |
| + const ListValue* allow_sites = |
|
battre
2011/08/29 17:44:04
nit: rename to allowed_origins (+ed, sites-->origi
markusheintz_
2011/08/30 15:14:02
Done.
|
| + prefs_->GetList(prefs::kDesktopNotificationAllowedOrigins); |
| + for (size_t i = 0; i < allow_sites->GetSize(); ++i) { |
| + std::string url_string; |
| + bool status = allow_sites->GetString(i, &url_string); |
| + DCHECK(status); |
| + ContentSettingsPattern primary_pattern = |
| + ContentSettingsPattern::FromURLNoWildcard(GURL(url_string)); |
| + DCHECK(primary_pattern.IsValid()); |
| + UpdatePatternPairsSettings(primary_pattern, |
| + ContentSettingsPattern::Wildcard(), |
| + CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| + std::string(), |
| + CONTENT_SETTING_ALLOW, |
| + pattern_pairs_settings); |
| + } |
| + |
| + const ListValue* denied_sites = |
|
battre
2011/08/29 17:44:04
dito
markusheintz_
2011/08/30 15:14:02
Done.
|
| + prefs_->GetList(prefs::kDesktopNotificationDeniedOrigins); |
| + for (size_t i = 0; i < denied_sites->GetSize(); ++i) { |
| + std::string url_string; |
| + bool status = denied_sites->GetString(i, &url_string); |
| + DCHECK(status); |
| + ContentSettingsPattern primary_pattern = |
| + ContentSettingsPattern::FromURLNoWildcard(GURL(url_string)); |
| + DCHECK(primary_pattern.IsValid()); |
| + UpdatePatternPairsSettings(primary_pattern, |
| + ContentSettingsPattern::Wildcard(), |
| + CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| + std::string(), |
| + CONTENT_SETTING_BLOCK, |
| + pattern_pairs_settings); |
| + } |
| +} |
| + |
| +void PrefProvider::SyncObsoletePrefs() { |
| DCHECK(prefs_); |
| DCHECK(prefs_->HasPrefPath(prefs::kContentSettingsPatternPairs)); |
| - // Clear the obsolete preference for geolocation settings. Then copy all |
| - // geolocation settings from the new preference to the obsolete one. |
| + // Clear obsolete preferences first. Then copy the settings from the new |
| + // preference to the obsolete ones. |
| prefs_->ClearPref(prefs::kGeolocationContentSettings); |
| + prefs_->ClearPref(prefs::kDesktopNotificationAllowedOrigins); |
| + prefs_->ClearPref(prefs::kDesktopNotificationDeniedOrigins); |
| + |
| + ListPrefUpdate update_allowed_sites( |
|
battre
2011/08/29 17:44:04
dito
markusheintz_
2011/08/30 15:14:02
Done.
|
| + prefs_, prefs::kDesktopNotificationAllowedOrigins); |
| + ListPrefUpdate update_denied_sites( |
| + prefs_, prefs::kDesktopNotificationDeniedOrigins); |
| + ListValue* allowed_sites = update_allowed_sites.Get(); |
| + ListValue* denied_sites = update_denied_sites.Get(); |
| + |
| const DictionaryValue* pattern_pairs_dictionary = |
| prefs_->GetDictionary(prefs::kContentSettingsPatternPairs); |
| for (DictionaryValue::key_iterator i = |
| @@ -1222,16 +1347,22 @@ void PrefProvider::SyncObsoleteGeolocationPref() { |
| DCHECK(pattern_pair.first.IsValid() && pattern_pair.second.IsValid()); |
| DictionaryValue* settings_dictionary = NULL; |
| - bool found = pattern_pairs_dictionary->GetDictionaryWithoutPathExpansion( |
| + pattern_pairs_dictionary->GetDictionaryWithoutPathExpansion( |
| key, &settings_dictionary); |
| - DCHECK(found); |
| - if (settings_dictionary->HasKey( |
| - kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION])) { |
| - int setting_value; |
| - settings_dictionary->GetInteger( |
| - kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION], &setting_value); |
| + int setting_value = 0; |
| + if (settings_dictionary->GetInteger( |
| + kTypeNames[CONTENT_SETTINGS_TYPE_NOTIFICATIONS], &setting_value)) { |
| + UpdateObsoleteNotificationsSettings(pattern_pair.first, |
| + pattern_pair.second, |
| + ContentSetting(setting_value), |
| + allowed_sites, |
| + denied_sites); |
| + } |
| + setting_value = 0; |
| + if (settings_dictionary->GetInteger( |
| + kTypeNames[CONTENT_SETTINGS_TYPE_GEOLOCATION], &setting_value)) { |
| UpdateObsoleteGeolocationPref(pattern_pair.first, |
| pattern_pair.second, |
| ContentSetting(setting_value)); |