Upstream version 11.39.266.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / content_settings / host_content_settings_map.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 // Maps hostnames to custom content settings.  Written on the UI thread and read
6 // on any thread.  One instance per profile.
7
8 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_
9 #define CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_
10
11 #include <map>
12 #include <string>
13 #include <vector>
14
15 #include "base/basictypes.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/observer_list.h"
18 #include "base/prefs/pref_change_registrar.h"
19 #include "base/threading/platform_thread.h"
20 #include "base/tuple.h"
21 #include "chrome/browser/content_settings/content_settings_override_provider.h"
22 #include "components/content_settings/core/browser/content_settings_observer.h"
23 #include "components/content_settings/core/common/content_settings.h"
24 #include "components/content_settings/core/common/content_settings_pattern.h"
25 #include "components/content_settings/core/common/content_settings_types.h"
26
27 class ExtensionService;
28 class GURL;
29 class PrefService;
30
31 namespace base {
32 class Clock;
33 class Value;
34 }
35
36 namespace content_settings {
37 class OverrideProvider;
38 class ObservableProvider;
39 class ProviderInterface;
40 class PrefProvider;
41 }
42
43 namespace user_prefs {
44 class PrefRegistrySyncable;
45 }
46
47 class HostContentSettingsMap
48     : public content_settings::Observer,
49       public base::RefCountedThreadSafe<HostContentSettingsMap> {
50  public:
51   enum ProviderType {
52     // EXTENSION names is a layering violation when this class will move to
53     // components.
54     // TODO(mukai): find the solution.
55     INTERNAL_EXTENSION_PROVIDER = 0,
56     POLICY_PROVIDER,
57     CUSTOM_EXTENSION_PROVIDER,
58     OVERRIDE_PROVIDER,
59     PREF_PROVIDER,
60     DEFAULT_PROVIDER,
61     NUM_PROVIDER_TYPES,
62   };
63
64   HostContentSettingsMap(PrefService* prefs, bool incognito);
65
66   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
67
68   // Adds a new provider for |type|.
69   void RegisterProvider(
70       ProviderType type,
71       scoped_ptr<content_settings::ObservableProvider> provider);
72
73   // Returns the default setting for a particular content type. If |provider_id|
74   // is not NULL, the id of the provider which provided the default setting is
75   // assigned to it.
76   //
77   // This may be called on any thread.
78   ContentSetting GetDefaultContentSetting(ContentSettingsType content_type,
79                                           std::string* provider_id) const;
80
81   // Returns a single |ContentSetting| which applies to the given URLs.  Note
82   // that certain internal schemes are whitelisted. For |CONTENT_TYPE_COOKIES|,
83   // |CookieSettings| should be used instead. For content types that can't be
84   // converted to a |ContentSetting|, |GetContentSettingValue| should be called.
85   // If there is no content setting, returns CONTENT_SETTING_DEFAULT.
86   //
87   // May be called on any thread.
88   ContentSetting GetContentSetting(
89       const GURL& primary_url,
90       const GURL& secondary_url,
91       ContentSettingsType content_type,
92       const std::string& resource_identifier) const;
93
94   // Returns a single content setting |Value| which applies to the given URLs.
95   // If |info| is not NULL, then the |source| field of |info| is set to the
96   // source of the returned |Value| (POLICY, EXTENSION, USER, ...) and the
97   // |primary_pattern| and the |secondary_pattern| fields of |info| are set to
98   // the patterns of the applying rule.  Note that certain internal schemes are
99   // whitelisted. For whitelisted schemes the |source| field of |info| is set
100   // the |SETTING_SOURCE_WHITELIST| and the |primary_pattern| and
101   // |secondary_pattern| are set to a wildcard pattern.  If there is no content
102   // setting, NULL is returned and the |source| field of |info| is set to
103   // |SETTING_SOURCE_NONE|. The pattern fiels of |info| are set to empty
104   // patterns.
105   // May be called on any thread.
106   scoped_ptr<base::Value> GetWebsiteSetting(
107       const GURL& primary_url,
108       const GURL& secondary_url,
109       ContentSettingsType content_type,
110       const std::string& resource_identifier,
111       content_settings::SettingInfo* info) const;
112
113   // For a given content type, returns all patterns with a non-default setting,
114   // mapped to their actual settings, in the precedence order of the rules.
115   // |settings| must be a non-NULL outparam.
116   //
117   // This may be called on any thread.
118   void GetSettingsForOneType(ContentSettingsType content_type,
119                              const std::string& resource_identifier,
120                              ContentSettingsForOneType* settings) const;
121
122   // Sets the default setting for a particular content type. This method must
123   // not be invoked on an incognito map.
124   //
125   // This should only be called on the UI thread.
126   void SetDefaultContentSetting(ContentSettingsType content_type,
127                                 ContentSetting setting);
128
129   // Sets the content |setting| for the given patterns, |content_type| and
130   // |resource_identifier|. Setting the value to CONTENT_SETTING_DEFAULT causes
131   // the default setting for that type to be used when loading pages matching
132   // this pattern.
133   // NOTICE: This is just a convenience method for content types that use
134   // |CONTENT_SETTING| as their data type. For content types that use other
135   // data types please use the method SetWebsiteSetting.
136   //
137   // This should only be called on the UI thread.
138   void SetContentSetting(const ContentSettingsPattern& primary_pattern,
139                          const ContentSettingsPattern& secondary_pattern,
140                          ContentSettingsType content_type,
141                          const std::string& resource_identifier,
142                          ContentSetting setting);
143
144   // Sets the |value| for the given patterns, |content_type| and
145   // |resource_identifier|. Setting the value to NULL causes the default value
146   // for that type to be used when loading pages matching this pattern.
147   //
148   // Takes ownership of the passed value.
149   void SetWebsiteSetting(const ContentSettingsPattern& primary_pattern,
150                          const ContentSettingsPattern& secondary_pattern,
151                          ContentSettingsType content_type,
152                          const std::string& resource_identifier,
153                          base::Value* value);
154
155   // Sets the most specific rule that currently defines the permission for the
156   // given permission type.
157   void SetNarrowestWebsiteSetting(
158       const ContentSettingsPattern& primary_pattern,
159       const ContentSettingsPattern& secondary_pattern,
160       ContentSettingsType content_type,
161       const std::string& resource_identifier,
162       ContentSetting setting,
163       content_settings::SettingInfo existing_info);
164
165   // Convenience method to add a content setting for the given URLs, making sure
166   // that there is no setting overriding it.
167   //
168   // This should only be called on the UI thread.
169   void AddExceptionForURL(const GURL& primary_url,
170                           const GURL& secondary_url,
171                           ContentSettingsType content_type,
172                           ContentSetting setting);
173
174   // Clears all host-specific settings for one content type.
175   //
176   // This should only be called on the UI thread.
177   void ClearSettingsForOneType(ContentSettingsType content_type);
178
179   static bool IsValueAllowedForType(PrefService* prefs,
180                                     const base::Value* value,
181                                     ContentSettingsType content_type);
182   static bool IsSettingAllowedForType(PrefService* prefs,
183                                       ContentSetting setting,
184                                       ContentSettingsType content_type);
185
186   // Returns true if the values for content type are of type dictionary/map.
187   static bool ContentTypeHasCompoundValue(ContentSettingsType type);
188
189   // Detaches the HostContentSettingsMap from all Profile-related objects like
190   // PrefService. This methods needs to be called before destroying the Profile.
191   // Afterwards, none of the methods above that should only be called on the UI
192   // thread should be called anymore.
193   void ShutdownOnUIThread();
194
195   // content_settings::Observer implementation.
196   virtual void OnContentSettingChanged(
197       const ContentSettingsPattern& primary_pattern,
198       const ContentSettingsPattern& secondary_pattern,
199       ContentSettingsType content_type,
200       std::string resource_identifier) OVERRIDE;
201
202   // Returns true if we should allow all content types for this URL.  This is
203   // true for various internal objects like chrome:// URLs, so UI and other
204   // things users think of as "not webpages" don't break.
205   static bool ShouldAllowAllContent(const GURL& primary_url,
206                                     const GURL& secondary_url,
207                                     ContentSettingsType content_type);
208
209   // Returns the ProviderType associated with the given source string.
210   // TODO(estade): I regret adding this. At the moment there are no legitimate
211   // uses. We should stick to ProviderType rather than string so we don't have
212   // to convert backwards.
213   static ProviderType GetProviderTypeFromSource(const std::string& source);
214
215   bool is_off_the_record() const {
216     return is_off_the_record_;
217   }
218
219   // Returns a single |ContentSetting| which applies to the given URLs, just as
220   // |GetContentSetting| does. If the setting is allowed, it also records the
221   // last usage to preferences.
222   //
223   // This should only be called on the UI thread, unlike |GetContentSetting|.
224   ContentSetting GetContentSettingAndMaybeUpdateLastUsage(
225       const GURL& primary_url,
226       const GURL& secondary_url,
227       ContentSettingsType content_type,
228       const std::string& resource_identifier);
229
230   // Sets the last time that a given content type has been used for the pattern
231   // which matches the URLs to the current time.
232   void UpdateLastUsage(const GURL& primary_url,
233                        const GURL& secondary_url,
234                        ContentSettingsType content_type);
235
236   // Sets the last time that a given content type has been used for a pattern
237   // pair to the current time.
238   void UpdateLastUsageByPattern(const ContentSettingsPattern& primary_pattern,
239                                 const ContentSettingsPattern& secondary_pattern,
240                                 ContentSettingsType content_type);
241
242   // Returns the last time the pattern that matches the URL has requested
243   // permission for the |content_type| setting.
244   base::Time GetLastUsage(const GURL& primary_url,
245                           const GURL& secondary_url,
246                           ContentSettingsType content_type);
247
248   // Returns the last time the pattern has requested permission for the
249   // |content_type| setting.
250   base::Time GetLastUsageByPattern(
251       const ContentSettingsPattern& primary_pattern,
252       const ContentSettingsPattern& secondary_pattern,
253       ContentSettingsType content_type);
254
255   // Returns the content setting without considering the global on/off toggle
256   // for the content setting that matches the URLs.
257   ContentSetting GetContentSettingWithoutOverride(
258       const GURL& primary_url,
259       const GURL& secondary_url,
260       ContentSettingsType content_type,
261       const std::string& resource_identifier);
262
263   // Returns the single content setting |value| without considering the
264   // global on/off toggle for the content setting that matches the given
265   // patterns.
266   scoped_ptr<base::Value> GetWebsiteSettingWithoutOverride(
267       const GURL& primary_url,
268       const GURL& secondary_url,
269       ContentSettingsType content_type,
270       const std::string& resource_identifier,
271       content_settings::SettingInfo* info) const;
272
273   // Sets globally if a given |content_type| |is_enabled|.
274   void SetContentSettingOverride(ContentSettingsType content_type,
275                                  bool is_enabled);
276
277   // Returns if a given |content_type| is enabled.
278   bool GetContentSettingOverride(ContentSettingsType content_type);
279
280   // Adds/removes an observer for content settings changes.
281   void AddObserver(content_settings::Observer* observer);
282   void RemoveObserver(content_settings::Observer* observer);
283
284   // Passes ownership of |clock|.
285   void SetPrefClockForTesting(scoped_ptr<base::Clock> clock);
286
287  private:
288   friend class base::RefCountedThreadSafe<HostContentSettingsMap>;
289   friend class HostContentSettingsMapTest_NonDefaultSettings_Test;
290
291   typedef std::map<ProviderType, content_settings::ProviderInterface*>
292       ProviderMap;
293   typedef ProviderMap::iterator ProviderIterator;
294   typedef ProviderMap::const_iterator ConstProviderIterator;
295
296   virtual ~HostContentSettingsMap();
297
298   ContentSetting GetDefaultContentSettingFromProvider(
299       ContentSettingsType content_type,
300       content_settings::ProviderInterface* provider) const;
301
302   // Migrate the Clear on exit pref into equivalent content settings.
303   void MigrateObsoleteClearOnExitPref();
304
305   // Adds content settings for |content_type| and |resource_identifier|,
306   // provided by |provider|, into |settings|. If |incognito| is true, adds only
307   // the content settings which are applicable to the incognito mode and differ
308   // from the normal mode. Otherwise, adds the content settings for the normal
309   // mode.
310   void AddSettingsForOneType(
311       const content_settings::ProviderInterface* provider,
312       ProviderType provider_type,
313       ContentSettingsType content_type,
314       const std::string& resource_identifier,
315       ContentSettingsForOneType* settings,
316       bool incognito) const;
317
318   // Call UsedContentSettingsProviders() whenever you access
319   // content_settings_providers_ (apart from initialization and
320   // teardown), so that we can DCHECK in RegisterExtensionService that
321   // it is not being called too late.
322   void UsedContentSettingsProviders() const;
323
324   // Returns the single content setting |value| with a toggle for if it
325   // takes the global on/off switch into account.
326   scoped_ptr<base::Value> GetWebsiteSettingInternal(
327       const GURL& primary_url,
328       const GURL& secondary_url,
329       ContentSettingsType content_type,
330       const std::string& resource_identifier,
331       content_settings::SettingInfo* info,
332       bool get_override) const;
333
334   content_settings::PrefProvider* GetPrefProvider();
335
336 #ifndef NDEBUG
337   // This starts as the thread ID of the thread that constructs this
338   // object, and remains until used by a different thread, at which
339   // point it is set to base::kInvalidThreadId. This allows us to
340   // DCHECK on unsafe usage of content_settings_providers_ (they
341   // should be set up on a single thread, after which they are
342   // immutable).
343   mutable base::PlatformThreadId used_from_thread_id_;
344 #endif
345
346   // Weak; owned by the Profile.
347   PrefService* prefs_;
348
349   // Whether this settings map is for an OTR session.
350   bool is_off_the_record_;
351
352   // Content setting providers. This is only modified at construction
353   // time and by RegisterExtensionService, both of which should happen
354   // before any other uses of it.
355   ProviderMap content_settings_providers_;
356
357   ObserverList<content_settings::Observer> observers_;
358
359   DISALLOW_COPY_AND_ASSIGN(HostContentSettingsMap);
360 };
361
362 #endif  // CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_