| Index: components/content_settings/core/browser/host_content_settings_map.cc
|
| diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc
|
| index e023a79de22361915f1499f27f64f05dca79beb0..945014840cd8f8893c2dcaf0a6b0ec938cf503f6 100644
|
| --- a/components/content_settings/core/browser/host_content_settings_map.cc
|
| +++ b/components/content_settings/core/browser/host_content_settings_map.cc
|
| @@ -53,6 +53,7 @@ const ProviderNamesSourceMapEntry kProviderNamesSourceMap[] = {
|
| {"supervised_user", content_settings::SETTING_SOURCE_SUPERVISED},
|
| {"extension", content_settings::SETTING_SOURCE_EXTENSION},
|
| {"preference", content_settings::SETTING_SOURCE_USER},
|
| + {"recommended", content_settings::SETTING_SOURCE_RECOMMENDED_POLICY},
|
| {"default", content_settings::SETTING_SOURCE_USER},
|
| };
|
|
|
| @@ -147,10 +148,24 @@ HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs,
|
| prefs_(prefs),
|
| is_off_the_record_(is_incognito_profile || is_guest_profile) {
|
| DCHECK(!(is_incognito_profile && is_guest_profile));
|
| - content_settings::ObservableProvider* policy_provider =
|
| - new content_settings::PolicyProvider(prefs_);
|
| - policy_provider->AddObserver(this);
|
| - content_settings_providers_[POLICY_PROVIDER] = policy_provider;
|
| +
|
| + // Mandatory policies.
|
| + content_settings::ObservableProvider* mandatory_policy_provider =
|
| + new content_settings::PolicyProvider(prefs_, false);
|
| + content_settings_providers_[POLICY_PROVIDER] = mandatory_policy_provider;
|
| +
|
| + // Recommended policies.
|
| + content_settings::ObservableProvider* recommended_policy_provider =
|
| + new content_settings::PolicyProvider(prefs_, true);
|
| + content_settings_providers_[RECOMMENDED_POLICY_PROVIDER] =
|
| + recommended_policy_provider;
|
| +
|
| + // FIXME(huangs): |policy_provider| and |recommended_policy_provider| both
|
| + // observe the same events, and sends trivial data to its observers. To
|
| + // prevent redundancy, we call AddObserver() for only one of them. Refactoring
|
| + // is needed for a cleaner solution.
|
| + mandatory_policy_provider->AddObserver(this);
|
| + recommended_policy_provider->AddObserver(this);
|
|
|
| content_settings::PrefProvider* pref_provider =
|
| new content_settings::PrefProvider(prefs_, is_off_the_record_);
|
| @@ -221,6 +236,8 @@ ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
|
| ContentSettingsType content_type,
|
| std::string* provider_id) const {
|
| UsedContentSettingsProviders();
|
| + ContentSetting recommended_default_setting = CONTENT_SETTING_DEFAULT;
|
| + ContentSetting default_default_setting = CONTENT_SETTING_DEFAULT;
|
|
|
| // Iterate through the list of providers and return the first non-NULL value
|
| // that matches |primary_url| and |secondary_url|.
|
| @@ -239,13 +256,57 @@ ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
|
| .get());
|
| }
|
| if (default_setting != CONTENT_SETTING_DEFAULT) {
|
| - if (provider_id)
|
| - *provider_id = kProviderNamesSourceMap[provider->first].provider_name;
|
| - return default_setting;
|
| + if (provider->first == RECOMMENDED_POLICY_PROVIDER) {
|
| + recommended_default_setting = default_setting;
|
| + } else if (provider->first == DEFAULT_PROVIDER) {
|
| + default_default_setting = default_setting;
|
| + } else {
|
| + if (provider_id)
|
| + *provider_id = kProviderNamesSourceMap[provider->first].provider_name;
|
| + return default_setting;
|
| + }
|
| }
|
| }
|
|
|
| - return CONTENT_SETTING_DEFAULT;
|
| + // Eearly exit if we found nothing.
|
| + if (recommended_default_setting == CONTENT_SETTING_DEFAULT &&
|
| + default_default_setting == CONTENT_SETTING_DEFAULT) {
|
| + return CONTENT_SETTING_DEFAULT;
|
| + }
|
| +
|
| + // Recommended policy provider subsumes default provider.
|
| + if (default_default_setting == CONTENT_SETTING_DEFAULT ||
|
| + default_default_setting == recommended_default_setting) {
|
| + if (provider_id) {
|
| + *provider_id =
|
| + kProviderNamesSourceMap[RECOMMENDED_POLICY_PROVIDER].provider_name;
|
| + }
|
| + return recommended_default_setting;
|
| + }
|
| +
|
| + // Default provider.
|
| + if (provider_id)
|
| + *provider_id = kProviderNamesSourceMap[DEFAULT_PROVIDER].provider_name;
|
| + return default_default_setting;
|
| +}
|
| +
|
| +ContentSetting HostContentSettingsMap::GetRecommendedDefaultContentSetting(
|
| + ContentSettingsType content_type) const {
|
| + ConstProviderIterator provider = content_settings_providers_.find(
|
| + RECOMMENDED_POLICY_PROVIDER);
|
| + if (provider == content_settings_providers_.end())
|
| + return CONTENT_SETTING_DEFAULT;
|
| +
|
| + ContentSetting default_setting =
|
| + GetDefaultContentSettingFromProvider(content_type, provider->second);
|
| + if (is_off_the_record_) {
|
| + default_setting = content_settings::ValueToContentSetting(
|
| + ProcessIncognitoInheritanceBehavior(
|
| + content_type,
|
| + content_settings::ContentSettingToValue(default_setting))
|
| + .get());
|
| + }
|
| + return default_setting;
|
| }
|
|
|
| ContentSetting HostContentSettingsMap::GetContentSetting(
|
|
|