OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/content_settings/host_content_settings_map.h" | 5 #include "chrome/browser/content_settings/host_content_settings_map.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "content/browser/user_metrics.h" | 30 #include "content/browser/user_metrics.h" |
31 #include "content/public/browser/notification_service.h" | 31 #include "content/public/browser/notification_service.h" |
32 #include "content/public/browser/notification_source.h" | 32 #include "content/public/browser/notification_source.h" |
33 #include "content/public/common/content_switches.h" | 33 #include "content/public/common/content_switches.h" |
34 #include "googleurl/src/gurl.h" | 34 #include "googleurl/src/gurl.h" |
35 #include "net/base/net_errors.h" | 35 #include "net/base/net_errors.h" |
36 #include "net/base/static_cookie_policy.h" | 36 #include "net/base/static_cookie_policy.h" |
37 | 37 |
38 namespace { | 38 namespace { |
39 | 39 |
40 // Returns true if we should allow all content types for this URL. This is | |
41 // true for various internal objects like chrome:// URLs, so UI and other | |
42 // things users think of as "not webpages" don't break. | |
43 bool ShouldAllowAllContent(const GURL& url, ContentSettingsType content_type) { | |
44 if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) | |
45 return false; | |
46 return url.SchemeIs(chrome::kChromeDevToolsScheme) || | |
47 url.SchemeIs(chrome::kChromeInternalScheme) || | |
48 url.SchemeIs(chrome::kChromeUIScheme) || | |
49 url.SchemeIs(chrome::kExtensionScheme); | |
50 } | |
51 | |
52 typedef std::vector<content_settings::Rule> Rules; | 40 typedef std::vector<content_settings::Rule> Rules; |
53 | 41 |
54 typedef std::pair<std::string, std::string> StringPair; | 42 typedef std::pair<std::string, std::string> StringPair; |
55 | 43 |
56 const char* kProviderNames[] = { | 44 const char* kProviderNames[] = { |
57 "policy", | 45 "policy", |
58 "extension", | 46 "extension", |
59 "preference", | 47 "preference", |
60 "default" | 48 "default" |
61 }; | 49 }; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 ContentSettings HostContentSettingsMap::GetDefaultContentSettings() const { | 182 ContentSettings HostContentSettingsMap::GetDefaultContentSettings() const { |
195 ContentSettings output(CONTENT_SETTING_DEFAULT); | 183 ContentSettings output(CONTENT_SETTING_DEFAULT); |
196 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { | 184 for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { |
197 if (!ContentTypeHasCompoundValue(ContentSettingsType(i))) | 185 if (!ContentTypeHasCompoundValue(ContentSettingsType(i))) |
198 output.settings[i] = GetDefaultContentSetting(ContentSettingsType(i), | 186 output.settings[i] = GetDefaultContentSetting(ContentSettingsType(i), |
199 NULL); | 187 NULL); |
200 } | 188 } |
201 return output; | 189 return output; |
202 } | 190 } |
203 | 191 |
204 ContentSetting HostContentSettingsMap::GetCookieContentSetting( | |
205 const GURL& url, | |
206 const GURL& first_party_url, | |
207 bool setting_cookie) const { | |
208 if (ShouldAllowAllContent(first_party_url, CONTENT_SETTINGS_TYPE_COOKIES)) | |
209 return CONTENT_SETTING_ALLOW; | |
210 | |
211 // First get any host-specific settings. | |
212 scoped_ptr<base::Value> value; | |
213 for (ConstProviderIterator provider = content_settings_providers_.begin(); | |
214 provider != content_settings_providers_.end(); | |
215 ++provider) { | |
216 if (provider->first == DEFAULT_PROVIDER) | |
217 continue; | |
218 | |
219 value.reset(content_settings::GetContentSettingValueAndPatterns( | |
220 provider->second, url, first_party_url, CONTENT_SETTINGS_TYPE_COOKIES, | |
221 std::string(), is_off_the_record_, NULL, NULL)); | |
222 if (value.get()) | |
223 break; | |
224 } | |
225 | |
226 // If no explicit exception has been made and third-party cookies are blocked | |
227 // by default, apply that rule. | |
228 if (!value.get() && BlockThirdPartyCookies()) { | |
229 bool strict = CommandLine::ForCurrentProcess()->HasSwitch( | |
230 switches::kBlockReadingThirdPartyCookies); | |
231 net::StaticCookiePolicy policy(strict ? | |
232 net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES : | |
233 net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES); | |
234 int rv; | |
235 if (setting_cookie) | |
236 rv = policy.CanSetCookie(url, first_party_url); | |
237 else | |
238 rv = policy.CanGetCookies(url, first_party_url); | |
239 DCHECK_NE(net::ERR_IO_PENDING, rv); | |
240 if (rv != net::OK) | |
241 return CONTENT_SETTING_BLOCK; | |
242 } | |
243 | |
244 // If no other policy has changed the setting, use the default. | |
245 if (value.get()) | |
246 return content_settings::ValueToContentSetting(value.get()); | |
247 | |
248 return GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES, NULL); | |
249 } | |
250 | |
251 ContentSetting HostContentSettingsMap::GetContentSetting( | 192 ContentSetting HostContentSettingsMap::GetContentSetting( |
252 const GURL& primary_url, | 193 const GURL& primary_url, |
253 const GURL& secondary_url, | 194 const GURL& secondary_url, |
254 ContentSettingsType content_type, | 195 ContentSettingsType content_type, |
255 const std::string& resource_identifier) const { | 196 const std::string& resource_identifier) const { |
256 scoped_ptr<base::Value> value(GetContentSettingValue( | 197 scoped_ptr<base::Value> value(GetContentSettingValue( |
257 primary_url, secondary_url, content_type, resource_identifier, | 198 primary_url, secondary_url, content_type, resource_identifier, |
258 NULL, NULL)); | 199 NULL, NULL)); |
259 return content_settings::ValueToContentSetting(value.get()); | 200 return content_settings::ValueToContentSetting(value.get()); |
260 } | 201 } |
261 | 202 |
262 base::Value* HostContentSettingsMap::GetContentSettingValue( | 203 base::Value* HostContentSettingsMap::GetContentSettingValue( |
263 const GURL& primary_url, | 204 const GURL& primary_url, |
264 const GURL& secondary_url, | 205 const GURL& secondary_url, |
265 ContentSettingsType content_type, | 206 ContentSettingsType content_type, |
266 const std::string& resource_identifier, | 207 const std::string& resource_identifier, |
267 ContentSettingsPattern* primary_pattern, | 208 ContentSettingsPattern* primary_pattern, |
268 ContentSettingsPattern* secondary_pattern) const { | 209 ContentSettingsPattern* secondary_pattern) const { |
269 DCHECK_NE(CONTENT_SETTINGS_TYPE_COOKIES, content_type); | |
270 DCHECK(content_settings::SupportsResourceIdentifier(content_type) || | 210 DCHECK(content_settings::SupportsResourceIdentifier(content_type) || |
271 resource_identifier.empty()); | 211 resource_identifier.empty()); |
272 | 212 |
273 // Check if the scheme of the requesting url is whitelisted. | 213 // Check if the scheme of the requesting url is whitelisted. |
274 if (ShouldAllowAllContent(secondary_url, content_type)) | 214 if (ShouldAllowAllContent(secondary_url, content_type)) |
275 return Value::CreateIntegerValue(CONTENT_SETTING_ALLOW); | 215 return Value::CreateIntegerValue(CONTENT_SETTING_ALLOW); |
276 | 216 |
277 // The list of |content_settings_providers_| is ordered according to their | 217 // The list of |content_settings_providers_| is ordered according to their |
278 // precedence. | 218 // precedence. |
279 for (ConstProviderIterator provider = content_settings_providers_.begin(); | 219 for (ConstProviderIterator provider = content_settings_providers_.begin(); |
280 provider != content_settings_providers_.end(); | 220 provider != content_settings_providers_.end(); |
281 ++provider) { | 221 ++provider) { |
282 base::Value* value = content_settings::GetContentSettingValueAndPatterns( | 222 base::Value* value = content_settings::GetContentSettingValueAndPatterns( |
283 provider->second, primary_url, secondary_url, content_type, | 223 provider->second, primary_url, secondary_url, content_type, |
284 resource_identifier, is_off_the_record_, | 224 resource_identifier, is_off_the_record_, |
285 primary_pattern, secondary_pattern); | 225 primary_pattern, secondary_pattern); |
286 if (value) | 226 if (value) |
287 return value; | 227 return value; |
288 } | 228 } |
289 return NULL; | 229 return NULL; |
290 } | 230 } |
291 | 231 |
292 ContentSettings HostContentSettingsMap::GetContentSettings( | 232 ContentSettings HostContentSettingsMap::GetContentSettings( |
293 const GURL& primary_url, | 233 const GURL& primary_url) const { |
294 const GURL& secondary_url) const { | |
295 ContentSettings output; | 234 ContentSettings output; |
296 // If we require a resource identifier, set the content settings to default, | 235 // If we require a resource identifier, set the content settings to default, |
297 // otherwise make the defaults explicit. Values for content type | 236 // otherwise make the defaults explicit. Values for content type |
298 // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE can't be mapped to the type | 237 // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE can't be mapped to the type |
299 // |ContentSetting|. So we ignore them here. | 238 // |ContentSetting|. So we ignore them here. |
300 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) { | 239 for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) { |
301 ContentSettingsType type = ContentSettingsType(j); | 240 ContentSettingsType type = ContentSettingsType(j); |
302 if (type == CONTENT_SETTINGS_TYPE_COOKIES) { | 241 if (!ContentTypeHasCompoundValue(type)) { |
303 output.settings[j] = GetCookieContentSetting( | |
304 primary_url, secondary_url, false); | |
305 } else if (!ContentTypeHasCompoundValue(type)) { | |
306 output.settings[j] = GetContentSetting( | 242 output.settings[j] = GetContentSetting( |
307 primary_url, | 243 primary_url, primary_url, ContentSettingsType(j), std::string()); |
308 secondary_url, | |
309 ContentSettingsType(j), | |
310 std::string()); | |
311 } | 244 } |
312 } | 245 } |
313 return output; | 246 return output; |
314 } | 247 } |
315 | 248 |
316 void HostContentSettingsMap::GetSettingsForOneType( | 249 void HostContentSettingsMap::GetSettingsForOneType( |
317 ContentSettingsType content_type, | 250 ContentSettingsType content_type, |
318 const std::string& resource_identifier, | 251 const std::string& resource_identifier, |
319 SettingsForOneType* settings) const { | 252 SettingsForOneType* settings) const { |
320 DCHECK(content_settings::SupportsResourceIdentifier(content_type) || | 253 DCHECK(content_settings::SupportsResourceIdentifier(content_type) || |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); | 494 ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); |
562 while (rule_iterator->HasNext()) { | 495 while (rule_iterator->HasNext()) { |
563 const content_settings::Rule& rule = rule_iterator->Next(); | 496 const content_settings::Rule& rule = rule_iterator->Next(); |
564 settings->push_back(PatternSettingSourceTuple( | 497 settings->push_back(PatternSettingSourceTuple( |
565 rule.primary_pattern, rule.secondary_pattern, | 498 rule.primary_pattern, rule.secondary_pattern, |
566 content_settings::ValueToContentSetting(rule.value.get()), | 499 content_settings::ValueToContentSetting(rule.value.get()), |
567 kProviderNames[provider_type], | 500 kProviderNames[provider_type], |
568 incognito)); | 501 incognito)); |
569 } | 502 } |
570 } | 503 } |
| 504 |
| 505 bool HostContentSettingsMap::ShouldAllowAllContent( |
| 506 const GURL& url, |
| 507 ContentSettingsType content_type) { |
| 508 if (content_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) |
| 509 return false; |
| 510 return url.SchemeIs(chrome::kChromeDevToolsScheme) || |
| 511 url.SchemeIs(chrome::kChromeInternalScheme) || |
| 512 url.SchemeIs(chrome::kChromeUIScheme) || |
| 513 url.SchemeIs(chrome::kExtensionScheme); |
| 514 } |
OLD | NEW |