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 db819503fae901d63349f772b8e35724177f5e05..660cefa0b2c6310f44c59b35c7f44c2062cf5fbe 100644 |
--- a/components/content_settings/core/browser/host_content_settings_map.cc |
+++ b/components/content_settings/core/browser/host_content_settings_map.cc |
@@ -251,32 +251,70 @@ void HostContentSettingsMap::SetWebsiteSetting( |
NOTREACHED(); |
} |
-void HostContentSettingsMap::SetNarrowestWebsiteSetting( |
- const ContentSettingsPattern& primary_pattern, |
- const ContentSettingsPattern& secondary_pattern, |
- ContentSettingsType content_type, |
- const std::string& resource_identifier, |
- ContentSetting setting, |
- content_settings::SettingInfo existing_info) { |
+void HostContentSettingsMap::SetNarrowestContentSetting( |
+ const GURL& primary_url, |
+ const GURL& secondary_url, |
+ ContentSettingsType type, |
+ ContentSetting setting) { |
+ // TODO(raymes): The scoping here should be a property of ContentSettingsInfo. |
+ // Make this happen! crbug.com/444742. |
+ ContentSettingsPattern primary_pattern; |
+ ContentSettingsPattern secondary_pattern; |
+ if (type == CONTENT_SETTINGS_TYPE_GEOLOCATION || |
+ type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX || |
+ type == CONTENT_SETTINGS_TYPE_FULLSCREEN) { |
+ // TODO(markusheintz): The rule we create here should also change the |
+ // location permission for iframed content. |
+ primary_pattern = ContentSettingsPattern::FromURLNoWildcard(primary_url); |
+ secondary_pattern = |
+ ContentSettingsPattern::FromURLNoWildcard(secondary_url); |
+ } else if (type == CONTENT_SETTINGS_TYPE_IMAGES || |
+ type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || |
+ type == CONTENT_SETTINGS_TYPE_PLUGINS || |
+ type == CONTENT_SETTINGS_TYPE_POPUPS || |
+ type == CONTENT_SETTINGS_TYPE_MOUSELOCK || |
+ type == CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS || |
+ type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) { |
+ primary_pattern = ContentSettingsPattern::FromURL(primary_url); |
+ secondary_pattern = ContentSettingsPattern::Wildcard(); |
+ } else if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC || |
+ type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA || |
+ type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) { |
+ primary_pattern = ContentSettingsPattern::FromURLNoWildcard(primary_url); |
+ secondary_pattern = ContentSettingsPattern::Wildcard(); |
+ } else { |
+ NOTREACHED() << "ContentSettingsType " << type << "is not supported."; |
+ } |
+ |
+ // Permission settings are specified via rules. There exists always at least |
+ // one rule for the default setting. Get the rule that currently defines |
+ // the permission for the given permission |type|. Then test whether the |
+ // existing rule is more specific than the rule we are about to create. If |
+ // the existing rule is more specific, than change the existing rule instead |
+ // of creating a new rule that would be hidden behind the existing rule. |
+ content_settings::SettingInfo info; |
+ scoped_ptr<base::Value> v = |
+ GetWebsiteSetting(primary_url, secondary_url, type, std::string(), &info); |
+ DCHECK_EQ(content_settings::SETTING_SOURCE_USER, info.source); |
+ |
ContentSettingsPattern narrow_primary = primary_pattern; |
ContentSettingsPattern narrow_secondary = secondary_pattern; |
- DCHECK_EQ(content_settings::SETTING_SOURCE_USER, existing_info.source); |
ContentSettingsPattern::Relation r1 = |
- existing_info.primary_pattern.Compare(primary_pattern); |
+ info.primary_pattern.Compare(primary_pattern); |
if (r1 == ContentSettingsPattern::PREDECESSOR) { |
- narrow_primary = existing_info.primary_pattern; |
+ narrow_primary = info.primary_pattern; |
} else if (r1 == ContentSettingsPattern::IDENTITY) { |
ContentSettingsPattern::Relation r2 = |
- existing_info.secondary_pattern.Compare(secondary_pattern); |
+ info.secondary_pattern.Compare(secondary_pattern); |
DCHECK(r2 != ContentSettingsPattern::DISJOINT_ORDER_POST && |
r2 != ContentSettingsPattern::DISJOINT_ORDER_PRE); |
if (r2 == ContentSettingsPattern::PREDECESSOR) |
- narrow_secondary = existing_info.secondary_pattern; |
+ narrow_secondary = info.secondary_pattern; |
} |
- SetContentSetting( |
- narrow_primary, narrow_secondary, content_type, std::string(), setting); |
+ SetContentSetting(narrow_primary, narrow_secondary, type, std::string(), |
+ setting); |
} |
void HostContentSettingsMap::SetContentSetting( |
@@ -390,32 +428,6 @@ void HostContentSettingsMap::SetPrefClockForTesting( |
GetPrefProvider()->SetClockForTesting(clock.Pass()); |
} |
-void HostContentSettingsMap::AddExceptionForURL( |
- const GURL& primary_url, |
- const GURL& secondary_url, |
- ContentSettingsType content_type, |
- ContentSetting setting) { |
- // TODO(markusheintz): Until the UI supports pattern pairs, both urls must |
- // match. |
- DCHECK(primary_url == secondary_url); |
- DCHECK(content_settings::ContentSettingsRegistry::GetInstance()->Get( |
- content_type)); |
- |
- // Make sure there is no entry that would override the pattern we are about |
- // to insert for exactly this URL. |
- SetContentSetting(ContentSettingsPattern::FromURLNoWildcard(primary_url), |
- ContentSettingsPattern::Wildcard(), |
- content_type, |
- std::string(), |
- CONTENT_SETTING_DEFAULT); |
- |
- SetContentSetting(ContentSettingsPattern::FromURL(primary_url), |
- ContentSettingsPattern::Wildcard(), |
- content_type, |
- std::string(), |
- setting); |
-} |
- |
void HostContentSettingsMap::ClearSettingsForOneType( |
ContentSettingsType content_type) { |
UsedContentSettingsProviders(); |