1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_COOKIE_SETTINGS_H_ 6 #define CHROME_BROWSER_CONTENT_SETTINGS_COOKIE_SETTINGS_H_ 7 8 #include <string> 9 10 #include "base/compiler_specific.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/singleton.h" 13 #include "base/prefs/pref_change_registrar.h" 14 #include "base/synchronization/lock.h" 15 #include "chrome/browser/content_settings/host_content_settings_map.h" 16 #include "chrome/common/content_settings.h" 17 #include "components/browser_context_keyed_service/refcounted_browser_context_keyed_service.h" 18 #include "components/browser_context_keyed_service/refcounted_browser_context_keyed_service_factory.h" 19 20 class ContentSettingsPattern; 21 class CookieSettingsWrapper; 22 class GURL; 23 class PrefService; 24 class Profile; 25 26 // A frontend to the cookie settings of |HostContentSettingsMap|. Handles 27 // cookie-specific logic such as blocking third-party cookies. Written on the UI 28 // thread and read on any thread. One instance per profile. 29 class CookieSettings : public RefcountedBrowserContextKeyedService { 30 public: 31 CookieSettings( 32 HostContentSettingsMap* host_content_settings_map, 33 PrefService* prefs); 34 35 // Returns the default content setting (CONTENT_SETTING_ALLOW, 36 // CONTENT_SETTING_BLOCK, or CONTENT_SETTING_SESSION_ONLY) for cookies. If 37 // |provider_id| is not NULL, the id of the provider which provided the 38 // default setting is assigned to it. 39 // 40 // This may be called on any thread. 41 ContentSetting GetDefaultCookieSetting(std::string* provider_id) const; 42 43 // Returns true if the page identified by (|url|, |first_party_url|) is 44 // allowed to read cookies. 45 // 46 // This may be called on any thread. 47 bool IsReadingCookieAllowed(const GURL& url, 48 const GURL& first_party_url) const; 49 50 // Returns true if the page identified by (|url|, |first_party_url|) is 51 // allowed to set cookies (permanent or session only). 52 // 53 // This may be called on any thread. 54 bool IsSettingCookieAllowed(const GURL& url, 55 const GURL& first_party_url) const; 56 57 // Returns true if the cookie set by a page identified by |url| should be 58 // session only. Querying this only makes sense if |IsSettingCookieAllowed| 59 // has returned true. 60 // 61 // This may be called on any thread. 62 bool IsCookieSessionOnly(const GURL& url) const; 63 64 // Returns all patterns with a non-default cookie setting, mapped to their 65 // actual settings, in the precedence order of the setting rules. |settings| 66 // must be a non-NULL outparam. 67 // 68 // This may be called on any thread. 69 void GetCookieSettings(ContentSettingsForOneType* settings) const; 70 71 // Sets the default content setting (CONTENT_SETTING_ALLOW, 72 // CONTENT_SETTING_BLOCK, or CONTENT_SETTING_SESSION_ONLY) for cookies. 73 // 74 // This should only be called on the UI thread. 75 void SetDefaultCookieSetting(ContentSetting setting); 76 77 // Sets the cookie setting for the given patterns. 78 // 79 // This should only be called on the UI thread. 80 void SetCookieSetting(const ContentSettingsPattern& primary_pattern, 81 const ContentSettingsPattern& secondary_pattern, 82 ContentSetting setting); 83 84 // Resets the cookie setting for the given patterns. 85 // 86 // This should only be called on the UI thread. 87 void ResetCookieSetting(const ContentSettingsPattern& primary_pattern, 88 const ContentSettingsPattern& secondary_pattern); 89 90 // Detaches the |CookieSettings| from all |Profile|-related objects like 91 // |PrefService|. This methods needs to be called before destroying the 92 // |Profile|. Afterwards, only const methods can be called. 93 virtual void ShutdownOnUIThread() OVERRIDE; 94 95 // A helper for applying third party cookie blocking rules. 96 ContentSetting GetCookieSetting( 97 const GURL& url, 98 const GURL& first_party_url, 99 bool setting_cookie, 100 content_settings::SettingSource* source) const; 101 102 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 103 104 class Factory : public RefcountedBrowserContextKeyedServiceFactory { 105 public: 106 // Returns the |CookieSettings| associated with the |profile|. 107 // 108 // This should only be called on the UI thread. 109 static scoped_refptr<CookieSettings> GetForProfile(Profile* profile); 110 111 static Factory* GetInstance(); 112 113 private: 114 friend struct DefaultSingletonTraits<Factory>; 115 116 Factory(); 117 virtual ~Factory(); 118 119 // |BrowserContextKeyedBaseFactory| methods: 120 virtual void RegisterProfilePrefs( 121 user_prefs::PrefRegistrySyncable* registry) OVERRIDE; 122 virtual content::BrowserContext* GetBrowserContextToUse( 123 content::BrowserContext* context) const OVERRIDE; 124 virtual scoped_refptr<RefcountedBrowserContextKeyedService> 125 BuildServiceInstanceFor( 126 content::BrowserContext* context) const OVERRIDE; 127 }; 128 129 private: 130 virtual ~CookieSettings(); 131 132 void OnBlockThirdPartyCookiesChanged(); 133 134 // Returns true if the "block third party cookies" preference is set. 135 // 136 // This method may be called on any thread. 137 bool ShouldBlockThirdPartyCookies() const; 138 139 scoped_refptr<HostContentSettingsMap> host_content_settings_map_; 140 PrefChangeRegistrar pref_change_registrar_; 141 142 // Used around accesses to |block_third_party_cookies_| to guarantee thread 143 // safety. 144 mutable base::Lock lock_; 145 146 bool block_third_party_cookies_; 147 }; 148 149 #endif // CHROME_BROWSER_CONTENT_SETTINGS_COOKIE_SETTINGS_H_ 150