Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1109)

Side by Side Diff: chrome/browser/content_settings/policy_content_settings_provider.cc

Issue 5528010: Implement preference and policy based content settings providers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/browser/content_settings
Patch Set: updates Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 #include "chrome/browser/content_settings/policy_content_settings_provider.h"
6
7 #include "base/command_line.h"
8 #include "chrome/browser/browser_thread.h"
9 #include "chrome/browser/content_settings/content_settings_details.h"
10 #include "chrome/browser/content_settings/content_settings_pattern.h"
11 #include "chrome/browser/prefs/pref_service.h"
12 #include "chrome/browser/prefs/scoped_pref_update.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/common/notification_details.h"
16 #include "chrome/common/notification_service.h"
17 #include "chrome/common/notification_source.h"
18 #include "chrome/common/pref_names.h"
19
20 namespace {
21
22 // Base pref path of the prefs that contain the managed default content
23 // settings values.
24 const std::string kManagedSettings =
25 "profile.managed_default_content_settings";
26
27 // The preferences used to manage ContentSettingsTypes.
28 const char* kPrefToManageType[CONTENT_SETTINGS_NUM_TYPES] = {
29 prefs::kManagedDefaultCookiesSetting,
30 prefs::kManagedDefaultImagesSetting,
31 prefs::kManagedDefaultJavaScriptSetting,
32 prefs::kManagedDefaultPluginsSetting,
33 prefs::kManagedDefaultPopupsSetting,
34 NULL, // Not used for Geolocation
35 NULL, // Not used for Notifications
36 };
37
38 } // namespace
39
40 PolicyContentSettingsProvider::PolicyContentSettingsProvider(Profile* profile)
41 : profile_(profile),
42 is_off_the_record_(profile_->IsOffTheRecord()) {
43 PrefService* prefs = profile->GetPrefs();
44
45 // Read global defaults.
46 DCHECK_EQ(arraysize(kPrefToManageType),
47 static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES));
48 ReadDefaultSettingsFromPrefs(prefs, &managed_default_content_settings_);
49
50 pref_change_registrar_.Init(prefs);
51 // The following preferences are only used to indicate if a
52 // default-content-setting is managed and to hold the managed default-setting
53 // value. If the value for any of the following perferences is set then the
54 // corresponding default-content-setting is managed. These preferences exist
55 // in parallel to the preference default-content-settings. If a
56 // default-content-settings-type is managed any user defined excpetions
57 // (patterns) for this type are ignored.
58 pref_change_registrar_.Add(prefs::kManagedDefaultCookiesSetting, this);
59 pref_change_registrar_.Add(prefs::kManagedDefaultImagesSetting, this);
60 pref_change_registrar_.Add(prefs::kManagedDefaultJavaScriptSetting, this);
61 pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, this);
62 pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, this);
63 notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
64 Source<Profile>(profile_));
65 }
66
67 PolicyContentSettingsProvider::~PolicyContentSettingsProvider() {
68 UnregisterObservers();
69 }
70
71 bool PolicyContentSettingsProvider::CanProvideDefaultSetting(
72 ContentSettingsType content_type) const {
73 if (managed_default_content_settings_.settings[content_type] !=
74 CONTENT_SETTING_DEFAULT) {
75 return true;
76 } else {
77 return false;
78 }
79 }
80
81 ContentSetting PolicyContentSettingsProvider::ProvideDefaultSetting(
82 ContentSettingsType content_type) const {
83 AutoLock auto_lock(lock_);
84 return managed_default_content_settings_.settings[content_type];
85 }
86
87 void PolicyContentSettingsProvider::UpdateDefaultSetting(
88 ContentSettingsType content_type,
89 ContentSetting setting) {
90 }
91
92 bool PolicyContentSettingsProvider::DefaultSettingIsManaged(
93 ContentSettingsType content_type) const {
94 if (managed_default_content_settings_.settings[content_type] !=
95 CONTENT_SETTING_DEFAULT) {
96 return true;
97 } else {
98 return false;
99 }
100 }
101
102 void PolicyContentSettingsProvider::ResetToDefaults() {
103 }
104
105 void PolicyContentSettingsProvider::Observe(NotificationType type,
106 const NotificationSource& source,
107 const NotificationDetails& details) {
108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
109
110 if (NotificationType::PREF_CHANGED == type) {
111 std::string* name = Details<std::string>(details).ptr();
112 if (prefs::kManagedDefaultCookiesSetting == *name) {
113 UpdateManagedDefaultSetting(profile_->GetPrefs(),
114 CONTENT_SETTINGS_TYPE_COOKIES,
115 &managed_default_content_settings_);
116 } else if (prefs::kManagedDefaultImagesSetting == *name) {
117 UpdateManagedDefaultSetting(profile_->GetPrefs(),
118 CONTENT_SETTINGS_TYPE_IMAGES,
119 &managed_default_content_settings_);
120 } else if (prefs::kManagedDefaultJavaScriptSetting == *name) {
121 UpdateManagedDefaultSetting(profile_->GetPrefs(),
122 CONTENT_SETTINGS_TYPE_JAVASCRIPT,
123 &managed_default_content_settings_);
124 } else if (prefs::kManagedDefaultPluginsSetting == *name) {
125 UpdateManagedDefaultSetting(profile_->GetPrefs(),
126 CONTENT_SETTINGS_TYPE_PLUGINS,
127 &managed_default_content_settings_);
128 } else if (prefs::kManagedDefaultPopupsSetting == *name) {
129 UpdateManagedDefaultSetting(profile_->GetPrefs(),
130 CONTENT_SETTINGS_TYPE_POPUPS,
131 &managed_default_content_settings_);
132 } else {
133 NOTREACHED() << "Unexpected preference observed";
134 return;
135 }
136
137 if (!is_off_the_record_) {
138 NotifyObservers(ContentSettingsDetails(
139 ContentSettingsPattern(), CONTENT_SETTINGS_TYPE_DEFAULT, ""));
140 }
141 } else if (NotificationType::PROFILE_DESTROYED == type) {
142 UnregisterObservers();
143 } else {
144 NOTREACHED() << "Unexpected notification";
145 }
146 }
147
148 void PolicyContentSettingsProvider::UnregisterObservers() {
149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
150 if (!profile_)
151 return;
152 pref_change_registrar_.RemoveAll();
153 notification_registrar_.Remove(this, NotificationType::PROFILE_DESTROYED,
154 Source<Profile>(profile_));
155 profile_ = NULL;
156 }
157
158
159 void PolicyContentSettingsProvider::NotifyObservers(
160 const ContentSettingsDetails& details) {
161 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
162 if (profile_ == NULL)
163 return;
164 NotificationService::current()->Notify(
165 NotificationType::CONTENT_SETTINGS_CHANGED,
166 Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()),
167 Details<const ContentSettingsDetails>(&details));
168 }
169
170 void PolicyContentSettingsProvider::ReadDefaultSettingsFromPrefs(
171 const PrefService* prefs, ContentSettings* settings) {
172 for (size_t type = 0; type < arraysize(kPrefToManageType); ++type) {
173 if (kPrefToManageType[type] == NULL) {
174 // TODO(markusheintz): Handle Geolocation and notification separately.
175 continue;
176 }
177 UpdateManagedDefaultSetting(prefs, ContentSettingsType(type), settings);
178 }
179 }
180
181 void PolicyContentSettingsProvider::UpdateManagedDefaultSetting(
182 const PrefService* prefs,
183 ContentSettingsType type,
184 ContentSettings* settings) {
gfeher 2010/12/09 10:29:53 Aren't you always calling this with settings = man
jochen (gone - plz use gerrit) 2010/12/09 13:18:53 Done.
185 // If a pref to manage a default-content-setting was not set (NOTICE:
186 // "HasPrefPath" returns false if no value was set for a registered pref) then
187 // the default value of the preference is used. The default value of a
188 // preference to manage a default-content-settings is
189 // CONTENT_SETTING_DEFAULT. This indicates that no managed value is set. If a
190 // pref was set, than it MUST be managed.
191 DCHECK(!prefs->HasPrefPath(kPrefToManageType[type]) ||
192 prefs->IsManagedPreference(kPrefToManageType[type]));
193 AutoLock auto_lock(lock_);
194 settings->settings[type] = IntToContentSetting(
195 prefs->GetInteger(kPrefToManageType[type]));
196 }
197
198 // static
199 void PolicyContentSettingsProvider::RegisterUserPrefs(PrefService* prefs) {
200 // Preferences for default content setting policies. A policy is not set of
201 // the corresponding preferences below is set to CONTENT_SETTING_DEFAULT.
202 prefs->RegisterIntegerPref(prefs::kManagedDefaultCookiesSetting,
203 CONTENT_SETTING_DEFAULT);
204 prefs->RegisterIntegerPref(prefs::kManagedDefaultImagesSetting,
205 CONTENT_SETTING_DEFAULT);
206 prefs->RegisterIntegerPref(prefs::kManagedDefaultJavaScriptSetting,
207 CONTENT_SETTING_DEFAULT);
208 prefs->RegisterIntegerPref(prefs::kManagedDefaultPluginsSetting,
209 CONTENT_SETTING_DEFAULT);
210 prefs->RegisterIntegerPref(prefs::kManagedDefaultPopupsSetting,
211 CONTENT_SETTING_DEFAULT);
212 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698