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

Unified Diff: components/content_settings/core/browser/host_content_settings_map.cc

Issue 1865803002: [Policy Experimental] Add policies to allow Cookies and Pop-ups exceptions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add another test to exercise main logic; renames from review. Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
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 5307adea4accab3db64c9445ad8e715bf5ec0bed..3a20e6b2acddbde960fa5bc86f4fe2e4087d1cd8 100644
--- a/components/content_settings/core/browser/host_content_settings_map.cc
+++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -147,20 +147,21 @@ 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;
-
- content_settings::PrefProvider* pref_provider =
- new content_settings::PrefProvider(prefs_, is_off_the_record_);
- pref_provider->AddObserver(this);
- content_settings_providers_[PREF_PROVIDER] = pref_provider;
+ content_settings_providers_[POLICY_PROVIDER] =
+ policy_provider_ =
+ new content_settings::PolicyProvider(prefs_);
+ policy_provider_->AddObserver(this);
+
+ content_settings_providers_[PREF_PROVIDER] =
+ pref_provider_ =
+ new content_settings::PrefProvider(prefs_, is_off_the_record_);
+
+ pref_provider_->AddObserver(this);
// This ensures that content settings are cleared for the guest profile. This
// wouldn't be needed except that we used to allow settings to be stored for
// the guest profile and so we need to ensure those get cleared.
if (is_guest_profile)
- pref_provider->ClearPrefs();
+ pref_provider_->ClearPrefs();
content_settings::ObservableProvider* default_provider =
new content_settings::DefaultProvider(prefs_, is_off_the_record_);
@@ -219,9 +220,10 @@ ContentSetting HostContentSettingsMap::GetDefaultContentSettingFromProvider(
return CONTENT_SETTING_DEFAULT;
}
-ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
- ContentSettingsType content_type,
- std::string* provider_id) const {
+HostContentSettingsMap::ContentSettingWithProviderType
+HostContentSettingsMap::GetDefaultContentSetting(
+ ContentSettingsType content_type) const {
+ ContentSettingWithProviderType ret; // Initialized.
UsedContentSettingsProviders();
// Iterate through the list of providers and return the first non-NULL value
@@ -241,13 +243,46 @@ ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
.get());
}
if (default_setting != CONTENT_SETTING_DEFAULT) {
- if (provider_id)
- *provider_id = kProviderNamesSourceMap[provider->first].provider_name;
- return default_setting;
+ ret.content_setting = default_setting;
+ ret.provider_type = provider->first;
+ break;
}
}
- return CONTENT_SETTING_DEFAULT;
+ return ret;
+}
+
+// FIXME(huangs): Remove this and fix callers.
+ContentSetting HostContentSettingsMap::GetDefaultContentSetting(
+ ContentSettingsType content_type,
+ std::string* provider_name) const {
+ ContentSettingWithProviderType result =
+ GetDefaultContentSetting(content_type);
+ if (result.provider_type != NUM_PROVIDER_TYPES && provider_name) {
+ *provider_name = kProviderNamesSourceMap[
+ result.provider_type].provider_name;
+ }
+ return result.content_setting;
+}
+
+bool HostContentSettingsMap::GetMaybeEnablePrefExceptionsForType(
+ ContentSettingsType content_type) const {
+ switch (policy_provider_->AllowUserExceptionsForType(content_type)) {
+ case CONTENT_SETTING_ALLOW:
+ return true;
+
+ case CONTENT_SETTING_BLOCK:
+ return false;
+
+ case CONTENT_SETTING_DEFAULT: {
+ // Disable if default setting came from policy provider.
+ ProviderType default_settings_provider =
+ GetDefaultContentSetting(content_type).provider_type;
+ return default_settings_provider != POLICY_PROVIDER;
+ }
+ }
+ NOTREACHED();
+ return false;
}
ContentSetting HostContentSettingsMap::GetContentSetting(
@@ -520,7 +555,7 @@ void HostContentSettingsMap::UpdateLastUsageByPattern(
ContentSettingsType content_type) {
UsedContentSettingsProviders();
- GetPrefProvider()->UpdateLastUsage(
+ pref_provider_->UpdateLastUsage(
primary_pattern, secondary_pattern, content_type);
}
@@ -540,7 +575,7 @@ base::Time HostContentSettingsMap::GetLastUsageByPattern(
ContentSettingsType content_type) {
UsedContentSettingsProviders();
- return GetPrefProvider()->GetLastUsage(
+ return pref_provider_->GetLastUsage(
primary_pattern, secondary_pattern, content_type);
}
@@ -561,7 +596,7 @@ void HostContentSettingsMap::SetPrefClockForTesting(
scoped_ptr<base::Clock> clock) {
UsedContentSettingsProviders();
- GetPrefProvider()->SetClockForTesting(std::move(clock));
+ pref_provider_->SetClockForTesting(std::move(clock));
}
void HostContentSettingsMap::ClearSettingsForOneType(
@@ -726,11 +761,6 @@ HostContentSettingsMap::GetProviderTypeFromSource(const std::string& source) {
return DEFAULT_PROVIDER;
}
-content_settings::PrefProvider* HostContentSettingsMap::GetPrefProvider() {
- return static_cast<content_settings::PrefProvider*>(
- content_settings_providers_[PREF_PROVIDER]);
-}
-
scoped_ptr<base::Value> HostContentSettingsMap::GetWebsiteSettingInternal(
const GURL& primary_url,
const GURL& secondary_url,
@@ -738,27 +768,64 @@ scoped_ptr<base::Value> HostContentSettingsMap::GetWebsiteSettingInternal(
const std::string& resource_identifier,
content_settings::SettingInfo* info) const {
UsedContentSettingsProviders();
- ContentSettingsPattern* primary_pattern = NULL;
- ContentSettingsPattern* secondary_pattern = NULL;
- if (info) {
- primary_pattern = &info->primary_pattern;
- secondary_pattern = &info->secondary_pattern;
- }
+ ContentSettingsPattern primary_pattern;
+ ContentSettingsPattern secondary_pattern;
+
+ scoped_ptr<base::Value> value_found;
+ ProviderType type_found = NUM_PROVIDER_TYPES;
+ const content_settings::ProviderInterface* provider_found = nullptr;
+
+ ContentSetting allow_user_exceptions =
+ policy_provider_->AllowUserExceptionsForType(content_type);
// The list of |content_settings_providers_| is ordered according to their
// precedence.
- for (ConstProviderIterator provider = content_settings_providers_.begin();
- provider != content_settings_providers_.end();
- ++provider) {
+ for (ConstProviderIterator it = content_settings_providers_.begin();
+ it != content_settings_providers_.end();
+ ++it) {
+ // Skip pref provider if its usage is disabled.
+ if (it->first == PREF_PROVIDER &&
+ allow_user_exceptions == CONTENT_SETTING_BLOCK) {
+ continue;
+ }
scoped_ptr<base::Value> value = GetContentSettingValueAndPatterns(
- provider->second, primary_url, secondary_url, content_type,
- resource_identifier, is_off_the_record_, primary_pattern,
- secondary_pattern);
+ it->second, primary_url, secondary_url, content_type,
+ resource_identifier, is_off_the_record_, &primary_pattern,
+ &secondary_pattern);
if (value) {
- if (info)
- info->source = kProviderNamesSourceMap[provider->first].provider_source;
- return value;
+ provider_found = it->second;
+ type_found = it->first;
+ value_found.reset(value.release());
Bernhard Bauer 2016/04/07 15:30:13 value_found = std::move(value);
huangs 2016/04/07 21:44:07 Done.
+ break;
+ }
+ }
+
+ if (value_found) {
+ // If we match a PolicyProvider that allows user to specify exceptions,
+ // and that we hit the default setting of the PolicyProvider, then use
+ // the test
+ if (type_found == POLICY_PROVIDER) {
+ DCHECK_EQ(policy_provider_, provider_found);
+ if (allow_user_exceptions == CONTENT_SETTING_ALLOW &&
+ primary_pattern == ContentSettingsPattern::Wildcard() &&
+ secondary_pattern == ContentSettingsPattern::Wildcard()) {
+ scoped_ptr<base::Value> value = GetContentSettingValueAndPatterns(
+ pref_provider_, primary_url, secondary_url, content_type,
+ resource_identifier, is_off_the_record_, &primary_pattern,
+ &secondary_pattern);
+ if (value) {
+ type_found = PREF_PROVIDER;
+ value_found.reset(value.release());
+ }
+ }
+ }
+
+ if (info) {
+ info->source = kProviderNamesSourceMap[type_found].provider_source;
+ info->primary_pattern = primary_pattern;
+ info->secondary_pattern = secondary_pattern;
}
+ return value_found;
}
if (info) {

Powered by Google App Engine
This is Rietveld 408576698