172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be
321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file.
421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_PREF_PROVIDER_H_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_PREF_PROVIDER_H_
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#pragma once
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// A content settings provider that takes its settings out of the pref service.
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <map>
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string>
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <utility>
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/basictypes.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/content_settings/content_settings_base_provider.h"
1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/content_settings/content_settings_provider.h"
1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_change_registrar.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass ContentSettingsDetails;
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass DictionaryValue;
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass PrefService;
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass Profile;
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace content_settings {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Content settings provider that provides default content settings based on
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// user prefs.
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass PrefDefaultProvider : public DefaultProviderInterface,
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            public NotificationObserver {
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit PrefDefaultProvider(Profile* profile);
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~PrefDefaultProvider();
3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // DefaultContentSettingsProvider implementation.
3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual ContentSetting ProvideDefaultSetting(
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      ContentSettingsType content_type) const;
4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void UpdateDefaultSetting(ContentSettingsType content_type,
4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                    ContentSetting setting);
4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void ResetToDefaults();
4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual bool DefaultSettingIsManaged(ContentSettingsType content_type) const;
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static void RegisterUserPrefs(PrefService* prefs);
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // NotificationObserver implementation.
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Observe(NotificationType type,
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationSource& source,
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationDetails& details);
5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Informs observers that content settings have changed. Make sure that
5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // |lock_| is not held when calling this, as listeners will usually call one
5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // of the GetSettings functions in response, which would then lead to a
5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // mutex deadlock.
5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void NotifyObservers(const ContentSettingsDetails& details);
5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void UnregisterObservers();
6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Sets the fields of |settings| based on the values in |dictionary|.
6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void GetSettingsFromDictionary(const DictionaryValue* dictionary,
6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                 ContentSettings* settings);
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Forces the default settings to be explicitly set instead of themselves
6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // being CONTENT_SETTING_DEFAULT.
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void ForceDefaultsToBeExplicit();
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Reads the default settings from the preferences service. If |overwrite| is
7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // true and the preference is missing, the local copy will be cleared as well.
7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void ReadDefaultSettings(bool overwrite);
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void MigrateObsoleteNotificationPref(PrefService* prefs);
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Copies of the pref data, so that we can read it on the IO thread.
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ContentSettings default_content_settings_;
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Profile* profile_;
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Whether this settings map is for an Incognito session.
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool is_incognito_;
8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Used around accesses to the default_content_settings_ object to guarantee
8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // thread safety.
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable base::Lock lock_;
8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  PrefChangeRegistrar pref_change_registrar_;
8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NotificationRegistrar notification_registrar_;
9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Whether we are currently updating preferences, this is used to ignore
9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // notifications from the preferences service that we triggered ourself.
9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  bool updating_preferences_;
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool initializing_;
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PrefDefaultProvider);
9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Content settings provider that provides content settings from the user
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// preference.
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass PrefProvider : public BaseProvider,
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     public NotificationObserver {
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void RegisterUserPrefs(PrefService* prefs);
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit PrefProvider(Profile* profile);
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~PrefProvider();
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ContentSettingsProvider implementation.
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool ContentSettingsTypeIsManaged(
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ContentSettingsType content_type);
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetContentSetting(
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ContentSettingsPattern& requesting_pattern,
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ContentSettingsPattern& embedding_pattern,
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ContentSettingsType content_type,
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const ResourceIdentifier& resource_identifier,
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ContentSetting content_setting);
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void ClearAllContentSettingsRules(
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ContentSettingsType content_type);
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void ResetToDefaults();
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // BaseProvider implementations.
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void Init();
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NotificationObserver implementation.
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void ReadExceptions(bool overwrite);
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Various migration methods (old cookie, popup and per-host data gets
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // migrated to the new format).
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void MigrateObsoletePerhostPref(PrefService* prefs);
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void MigrateObsoletePopupsPref(PrefService* prefs);
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CanonicalizeContentSettingsExceptions(
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      DictionaryValue* all_settings_dictionary);
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void GetSettingsFromDictionary(
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const DictionaryValue* dictionary,
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ContentSettings* settings);
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void GetResourceSettingsFromDictionary(
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const DictionaryValue* dictionary,
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ResourceContentSettings* settings);
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void NotifyObservers(const ContentSettingsDetails& details);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void UnregisterObservers();
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Profile* profile_;
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PrefChangeRegistrar pref_change_registrar_;
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar notification_registrar_;
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Whether we are currently updating preferences, this is used to ignore
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // notifications from the preferences service that we triggered ourself.
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool updating_preferences_;
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Do not fire any Notifications as long as we are in the constructor.
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool initializing_;
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PrefProvider);
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace content_settings
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_PREF_PROVIDER_H_
175