Home | History | Annotate | Download | only in content_settings
      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 "components/content_settings/core/common/content_settings.h"
     17 #include "components/keyed_service/content/refcounted_browser_context_keyed_service.h"
     18 #include "components/keyed_service/content/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