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