1 // Copyright (c) 2011 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_CONTENT_SETTINGS_POLICY_PROVIDER_H_ 6 #define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_POLICY_PROVIDER_H_ 7 #pragma once 8 9 // A content settings provider that takes its settings out of policies. 10 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/synchronization/lock.h" 15 #include "base/tuple.h" 16 #include "chrome/browser/content_settings/content_settings_base_provider.h" 17 #include "chrome/browser/content_settings/content_settings_provider.h" 18 #include "chrome/browser/prefs/pref_change_registrar.h" 19 #include "content/common/notification_observer.h" 20 #include "content/common/notification_registrar.h" 21 22 class ContentSettingsDetails; 23 class DictionaryValue; 24 class PrefService; 25 class Profile; 26 27 namespace content_settings { 28 29 class PolicyDefaultProvider : public DefaultProviderInterface, 30 public NotificationObserver { 31 public: 32 explicit PolicyDefaultProvider(Profile* profile); 33 virtual ~PolicyDefaultProvider(); 34 35 // DefaultContentSettingsProvider implementation. 36 virtual ContentSetting ProvideDefaultSetting( 37 ContentSettingsType content_type) const; 38 virtual void UpdateDefaultSetting(ContentSettingsType content_type, 39 ContentSetting setting); 40 virtual void ResetToDefaults(); 41 virtual bool DefaultSettingIsManaged(ContentSettingsType content_type) const; 42 43 static void RegisterUserPrefs(PrefService* prefs); 44 45 // NotificationObserver implementation. 46 virtual void Observe(NotificationType type, 47 const NotificationSource& source, 48 const NotificationDetails& details); 49 50 private: 51 // Informs observers that content settings have changed. Make sure that 52 // |lock_| is not held when calling this, as listeners will usually call one 53 // of the GetSettings functions in response, which would then lead to a 54 // mutex deadlock. 55 void NotifyObservers(const ContentSettingsDetails& details); 56 57 void UnregisterObservers(); 58 59 // Reads the policy managed default settings. 60 void ReadManagedDefaultSettings(); 61 62 // Reads the policy controlled default settings for a specific content type. 63 void UpdateManagedDefaultSetting(ContentSettingsType content_type); 64 65 // Copies of the pref data, so that we can read it on the IO thread. 66 ContentSettings managed_default_content_settings_; 67 68 Profile* profile_; 69 70 // Whether this settings map is for an OTR session. 71 bool is_off_the_record_; 72 73 // Used around accesses to the managed_default_content_settings_ object to 74 // guarantee thread safety. 75 mutable base::Lock lock_; 76 77 PrefChangeRegistrar pref_change_registrar_; 78 NotificationRegistrar notification_registrar_; 79 80 DISALLOW_COPY_AND_ASSIGN(PolicyDefaultProvider); 81 }; 82 83 // PolicyProvider that provider managed content-settings. 84 class PolicyProvider : public BaseProvider, 85 public NotificationObserver { 86 public: 87 explicit PolicyProvider(Profile* profile); 88 ~PolicyProvider(); 89 static void RegisterUserPrefs(PrefService* prefs); 90 91 // BaseProvider Implementation 92 virtual void Init(); 93 94 // ProviderInterface Implementation 95 virtual bool ContentSettingsTypeIsManaged( 96 ContentSettingsType content_type); 97 98 virtual void SetContentSetting( 99 const ContentSettingsPattern& requesting_pattern, 100 const ContentSettingsPattern& embedding_pattern, 101 ContentSettingsType content_type, 102 const ResourceIdentifier& resource_identifier, 103 ContentSetting content_setting); 104 105 virtual ContentSetting GetContentSetting( 106 const GURL& requesting_url, 107 const GURL& embedding_url, 108 ContentSettingsType content_type, 109 const ResourceIdentifier& resource_identifier) const; 110 111 virtual void ClearAllContentSettingsRules( 112 ContentSettingsType content_type); 113 114 virtual void ResetToDefaults(); 115 116 // NotificationObserver implementation. 117 virtual void Observe(NotificationType type, 118 const NotificationSource& source, 119 const NotificationDetails& details); 120 private: 121 typedef Tuple5< 122 ContentSettingsPattern, 123 ContentSettingsPattern, 124 ContentSettingsType, 125 content_settings::ProviderInterface::ResourceIdentifier, 126 ContentSetting> ContentSettingsRule; 127 128 typedef std::vector<ContentSettingsRule> ContentSettingsRules; 129 130 void ReadManagedContentSettings(bool overwrite); 131 132 void GetContentSettingsFromPreferences(PrefService* prefs, 133 ContentSettingsRules* rules); 134 135 void ReadManagedContentSettingsTypes( 136 ContentSettingsType content_type); 137 138 void NotifyObservers(const ContentSettingsDetails& details); 139 140 void UnregisterObservers(); 141 142 Profile* profile_; 143 144 bool content_type_is_managed_[CONTENT_SETTINGS_NUM_TYPES]; 145 146 PrefChangeRegistrar pref_change_registrar_; 147 NotificationRegistrar notification_registrar_; 148 149 DISALLOW_COPY_AND_ASSIGN(PolicyProvider); 150 }; 151 152 } // namespace content_settings 153 154 #endif // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_POLICY_PROVIDER_H_ 155