Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / content_settings / cookie_settings.h
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_