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
20class ContentSettingsPattern;
21class CookieSettingsWrapper;
22class GURL;
23class PrefService;
24class 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.
29class 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