Adding instrumentation to locate the source of jankiness
[chromium-blink-merge.git] / chrome / browser / content_settings / host_content_settings_map.h
blob9316b6f07c657aff4dc06f5df8011ee27cf68660
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.
5 // Maps hostnames to custom content settings. Written on the UI thread and read
6 // on any thread. One instance per profile.
8 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_
9 #define CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_
11 #include <map>
12 #include <string>
13 #include <vector>
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"
27 class ExtensionService;
28 class GURL;
29 class PrefService;
31 namespace base {
32 class Clock;
33 class Value;
36 namespace content_settings {
37 class OverrideProvider;
38 class ObservableProvider;
39 class ProviderInterface;
40 class PrefProvider;
43 namespace user_prefs {
44 class PrefRegistrySyncable;
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,
64 HostContentSettingsMap(PrefService* prefs, bool incognito);
66 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
68 // Adds a new provider for |type|.
69 void RegisterProvider(
70 ProviderType type,
71 scoped_ptr<content_settings::ObservableProvider> provider);
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.
77 // This may be called on any thread.
78 ContentSetting GetDefaultContentSetting(ContentSettingsType content_type,
79 std::string* provider_id) const;
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.
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;
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;
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.
117 // This may be called on any thread.
118 void GetSettingsForOneType(ContentSettingsType content_type,
119 const std::string& resource_identifier,
120 ContentSettingsForOneType* settings) const;
122 // Sets the default setting for a particular content type. This method must
123 // not be invoked on an incognito map.
125 // This should only be called on the UI thread.
126 void SetDefaultContentSetting(ContentSettingsType content_type,
127 ContentSetting setting);
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.
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);
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.
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);
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);
165 // Convenience method to add a content setting for the given URLs, making sure
166 // that there is no setting overriding it.
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);
174 // Clears all host-specific settings for one content type.
176 // This should only be called on the UI thread.
177 void ClearSettingsForOneType(ContentSettingsType content_type);
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);
186 // Returns true if the values for content type are of type dictionary/map.
187 static bool ContentTypeHasCompoundValue(ContentSettingsType type);
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();
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;
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);
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);
215 bool is_off_the_record() const {
216 return is_off_the_record_;
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.
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);
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);
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);
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);
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);
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);
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;
273 // Sets globally if a given |content_type| |is_enabled|.
274 void SetContentSettingOverride(ContentSettingsType content_type,
275 bool is_enabled);
277 // Returns if a given |content_type| is enabled.
278 bool GetContentSettingOverride(ContentSettingsType content_type);
280 // Adds/removes an observer for content settings changes.
281 void AddObserver(content_settings::Observer* observer);
282 void RemoveObserver(content_settings::Observer* observer);
284 // Passes ownership of |clock|.
285 void SetPrefClockForTesting(scoped_ptr<base::Clock> clock);
287 private:
288 friend class base::RefCountedThreadSafe<HostContentSettingsMap>;
289 friend class HostContentSettingsMapTest_NonDefaultSettings_Test;
291 typedef std::map<ProviderType, content_settings::ProviderInterface*>
292 ProviderMap;
293 typedef ProviderMap::iterator ProviderIterator;
294 typedef ProviderMap::const_iterator ConstProviderIterator;
296 virtual ~HostContentSettingsMap();
298 ContentSetting GetDefaultContentSettingFromProvider(
299 ContentSettingsType content_type,
300 content_settings::ProviderInterface* provider) const;
302 // Migrate the Clear on exit pref into equivalent content settings.
303 void MigrateObsoleteClearOnExitPref();
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;
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;
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;
334 content_settings::PrefProvider* GetPrefProvider();
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
346 // Weak; owned by the Profile.
347 PrefService* prefs_;
349 // Whether this settings map is for an OTR session.
350 bool is_off_the_record_;
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_;
357 ObserverList<content_settings::Observer> observers_;
359 DISALLOW_COPY_AND_ASSIGN(HostContentSettingsMap);
362 #endif // CHROME_BROWSER_CONTENT_SETTINGS_HOST_CONTENT_SETTINGS_MAP_H_