15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/incognito_helpers.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_pattern.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/static_cookie_policy.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsValidSetting(ContentSetting setting) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (setting == CONTENT_SETTING_ALLOW ||
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          setting == CONTENT_SETTING_SESSION_ONLY ||
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          setting == CONTENT_SETTING_BLOCK);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsAllowed(ContentSetting setting) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSetting(setting));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (setting == CONTENT_SETTING_ALLOW ||
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          setting == CONTENT_SETTING_SESSION_ONLY);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<CookieSettings> CookieSettings::Factory::GetForProfile(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<CookieSettings*>(
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetInstance()->GetServiceForBrowserContext(profile, true).get());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::Factory* CookieSettings::Factory::GetInstance() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<CookieSettings::Factory>::get();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::Factory::Factory()
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : RefcountedBrowserContextKeyedServiceFactory(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "CookieSettings",
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        BrowserContextDependencyManager::GetInstance()) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::Factory::~Factory() {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid CookieSettings::Factory::RegisterProfilePrefs(
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kBlockThirdPartyCookies,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)content::BrowserContext* CookieSettings::Factory::GetBrowserContextToUse(
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) const {
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return chrome::GetBrowserContextRedirectedInIncognito(context);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)scoped_refptr<RefcountedBrowserContextKeyedService>
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)CookieSettings::Factory::BuildServiceInstanceFor(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* context) const {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Profile* profile = static_cast<Profile*>(context);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new CookieSettings(profile->GetHostContentSettingsMap(),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            profile->GetPrefs());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::CookieSettings(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostContentSettingsMap* host_content_settings_map,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* prefs)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : host_content_settings_map_(host_content_settings_map),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_third_party_cookies_(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefs->GetBoolean(prefs::kBlockThirdPartyCookies)) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (block_third_party_cookies_) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ThirdPartyCookieBlockingEnabled"));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("ThirdPartyCookieBlockingDisabled"));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_change_registrar_.Init(prefs);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Add(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kBlockThirdPartyCookies,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&CookieSettings::OnBlockThirdPartyCookiesChanged,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::GetDefaultCookieSetting(std::string* provider_id) const {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_content_settings_map_->GetDefaultContentSetting(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_COOKIES, provider_id);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CookieSettings::IsReadingCookieAllowed(const GURL& url,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const GURL& first_party_url) const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = GetCookieSetting(url, first_party_url, false, NULL);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsAllowed(setting);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CookieSettings::IsSettingCookieAllowed(const GURL& url,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            const GURL& first_party_url) const {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = GetCookieSetting(url, first_party_url, true, NULL);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsAllowed(setting);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CookieSettings::IsCookieSessionOnly(const GURL& origin) const {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = GetCookieSetting(origin, origin, true, NULL);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSetting(setting));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (setting == CONTENT_SETTING_SESSION_ONLY);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookieSettings::GetCookieSettings(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsForOneType* settings) const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_content_settings_map_->GetSettingsForOneType(
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_COOKIES, std::string(), settings);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookieSettings::SetDefaultCookieSetting(ContentSetting setting) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSetting(setting));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_content_settings_map_->SetDefaultContentSetting(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_COOKIES, setting);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookieSettings::SetCookieSetting(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsValidSetting(setting));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_SESSION_ONLY) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(secondary_pattern == ContentSettingsPattern::Wildcard());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_content_settings_map_->SetContentSetting(primary_pattern,
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                secondary_pattern,
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                CONTENT_SETTINGS_TYPE_COOKIES,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                std::string(),
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                setting);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookieSettings::ResetCookieSetting(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern) {
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_content_settings_map_->SetContentSetting(primary_pattern,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                secondary_pattern,
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                CONTENT_SETTINGS_TYPE_COOKIES,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                std::string(),
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                CONTENT_SETTING_DEFAULT);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CookieSettings::ShutdownOnUIThread() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_change_registrar_.RemoveAll();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting CookieSettings::GetCookieSetting(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& first_party_url,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool setting_cookie,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_settings::SettingSource* source) const {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HostContentSettingsMap::ShouldAllowAllContent(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, first_party_url, CONTENT_SETTINGS_TYPE_COOKIES))
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CONTENT_SETTING_ALLOW;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First get any host-specific settings.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings::SettingInfo info;
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Value> value(host_content_settings_map_->GetWebsiteSetting(
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      url,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      first_party_url,
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_COOKIES,
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &info));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (source)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *source = info.source;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If no explicit exception has been made and third-party cookies are blocked
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by default, apply that rule.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (info.primary_pattern.MatchesAllHosts() &&
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      info.secondary_pattern.MatchesAllHosts() &&
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShouldBlockThirdPartyCookies() &&
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !first_party_url.SchemeIs(extensions::kExtensionScheme)) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool not_strict = CommandLine::ForCurrentProcess()->HasSwitch(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kOnlyBlockSettingThirdPartyCookies);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::StaticCookiePolicy policy(not_strict ?
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES :
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (setting_cookie)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = policy.CanSetCookie(url, first_party_url);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rv = policy.CanGetCookies(url, first_party_url);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(net::ERR_IO_PENDING, rv);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rv != net::OK)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CONTENT_SETTING_BLOCK;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should always have a value, at least from the default provider.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(value.get());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_settings::ValueToContentSetting(value.get());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CookieSettings::~CookieSettings() {}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CookieSettings::OnBlockThirdPartyCookiesChanged() {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AutoLock auto_lock(lock_);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  block_third_party_cookies_ = pref_change_registrar_.prefs()->GetBoolean(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kBlockThirdPartyCookies);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CookieSettings::ShouldBlockThirdPartyCookies() const {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock auto_lock(lock_);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return block_third_party_cookies_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
237