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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/content_settings/policy_content_settings_provider.cc
diff --git a/chrome/browser/content_settings/policy_content_settings_provider.cc b/chrome/browser/content_settings/policy_content_settings_provider.cc
new file mode 100644
index 0000000000000000000000000000000000000000..5bc8e9f48c73a9c69063d83dcb11adf0f6487f19
--- /dev/null
+++ b/chrome/browser/content_settings/policy_content_settings_provider.cc
@@ -0,0 +1,204 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/content_settings/policy_content_settings_provider.h"
+
+#include "base/command_line.h"
+#include "chrome/browser/browser_thread.h"
+#include "chrome/browser/content_settings/content_settings_details.h"
+#include "chrome/browser/content_settings/content_settings_pattern.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/prefs/scoped_pref_update.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/notification_details.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/pref_names.h"
+
+namespace {
+
+// Base pref path of the prefs that contain the managed default content
+// settings values.
+const std::string kManagedSettings =
+ "profile.managed_default_content_settings";
+
+// The preferences used to manage ContentSettingsTypes.
+const char* kPrefToManageType[CONTENT_SETTINGS_NUM_TYPES] = {
+ prefs::kManagedDefaultCookiesSetting,
+ prefs::kManagedDefaultImagesSetting,
+ prefs::kManagedDefaultJavaScriptSetting,
+ prefs::kManagedDefaultPluginsSetting,
+ prefs::kManagedDefaultPopupsSetting,
+ NULL, // Not used for Geolocation
+ NULL, // Not used for Notifications
+};
+
+} // namespace
+
+PolicyContentSettingsProvider::PolicyContentSettingsProvider(Profile* profile)
+ : profile_(profile),
+ is_off_the_record_(profile_->IsOffTheRecord()) {
+ PrefService* prefs = profile->GetPrefs();
+
+ // Read global defaults.
+ DCHECK_EQ(arraysize(kPrefToManageType),
+ static_cast<size_t>(CONTENT_SETTINGS_NUM_TYPES));
+ ReadManagedDefaultSettings();
+
+ pref_change_registrar_.Init(prefs);
+ // The following preferences are only used to indicate if a
+ // default-content-setting is managed and to hold the managed default-setting
+ // value. If the value for any of the following perferences is set then the
+ // corresponding default-content-setting is managed. These preferences exist
+ // in parallel to the preference default-content-settings. If a
+ // default-content-settings-type is managed any user defined excpetions
+ // (patterns) for this type are ignored.
+ pref_change_registrar_.Add(prefs::kManagedDefaultCookiesSetting, this);
+ pref_change_registrar_.Add(prefs::kManagedDefaultImagesSetting, this);
+ pref_change_registrar_.Add(prefs::kManagedDefaultJavaScriptSetting, this);
+ pref_change_registrar_.Add(prefs::kManagedDefaultPluginsSetting, this);
+ pref_change_registrar_.Add(prefs::kManagedDefaultPopupsSetting, this);
+ notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
+ Source<Profile>(profile_));
+}
+
+PolicyContentSettingsProvider::~PolicyContentSettingsProvider() {
+ UnregisterObservers();
+}
+
+bool PolicyContentSettingsProvider::CanProvideDefaultSetting(
+ ContentSettingsType content_type) const {
+ AutoLock lock(lock_);
+ if (managed_default_content_settings_.settings[content_type] !=
+ CONTENT_SETTING_DEFAULT) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+ContentSetting PolicyContentSettingsProvider::ProvideDefaultSetting(
+ ContentSettingsType content_type) const {
+ AutoLock auto_lock(lock_);
+ return managed_default_content_settings_.settings[content_type];
+}
+
+void PolicyContentSettingsProvider::UpdateDefaultSetting(
+ ContentSettingsType content_type,
+ ContentSetting setting) {
+}
+
+bool PolicyContentSettingsProvider::DefaultSettingIsManaged(
+ ContentSettingsType content_type) const {
+ AutoLock lock(lock_);
+ if (managed_default_content_settings_.settings[content_type] !=
+ CONTENT_SETTING_DEFAULT) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void PolicyContentSettingsProvider::ResetToDefaults() {
+}
+
+void PolicyContentSettingsProvider::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ if (type == NotificationType::PREF_CHANGED) {
+ DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
+ std::string* name = Details<std::string>(details).ptr();
+ if (*name == prefs::kManagedDefaultCookiesSetting) {
+ UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES);
+ } else if (*name == prefs::kManagedDefaultImagesSetting) {
+ UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_IMAGES);
+ } else if (*name == prefs::kManagedDefaultJavaScriptSetting) {
+ UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT);
+ } else if (*name == prefs::kManagedDefaultPluginsSetting) {
+ UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_PLUGINS);
+ } else if (*name == prefs::kManagedDefaultPopupsSetting) {
+ UpdateManagedDefaultSetting(CONTENT_SETTINGS_TYPE_POPUPS);
+ } else {
+ NOTREACHED() << "Unexpected preference observed";
+ return;
+ }
+
+ if (!is_off_the_record_) {
+ NotifyObservers(ContentSettingsDetails(
+ ContentSettingsPattern(), CONTENT_SETTINGS_TYPE_DEFAULT, ""));
+ }
+ } else if (type == NotificationType::PROFILE_DESTROYED) {
+ DCHECK_EQ(profile_, Source<Profile>(source).ptr());
+ UnregisterObservers();
+ } else {
+ NOTREACHED() << "Unexpected notification";
+ }
+}
+
+void PolicyContentSettingsProvider::UnregisterObservers() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (!profile_)
+ return;
+ pref_change_registrar_.RemoveAll();
+ notification_registrar_.Remove(this, NotificationType::PROFILE_DESTROYED,
+ Source<Profile>(profile_));
+ profile_ = NULL;
+}
+
+
+void PolicyContentSettingsProvider::NotifyObservers(
+ const ContentSettingsDetails& details) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (profile_ == NULL)
+ return;
+ NotificationService::current()->Notify(
+ NotificationType::CONTENT_SETTINGS_CHANGED,
+ Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()),
+ Details<const ContentSettingsDetails>(&details));
+}
+
+void PolicyContentSettingsProvider::ReadManagedDefaultSettings() {
+ for (size_t type = 0; type < arraysize(kPrefToManageType); ++type) {
+ if (kPrefToManageType[type] == NULL) {
+ // TODO(markusheintz): Handle Geolocation and notification separately.
+ continue;
+ }
+ UpdateManagedDefaultSetting(ContentSettingsType(type));
+ }
+}
+
+void PolicyContentSettingsProvider::UpdateManagedDefaultSetting(
+ ContentSettingsType type) {
+ // If a pref to manage a default-content-setting was not set (NOTICE:
+ // "HasPrefPath" returns false if no value was set for a registered pref) then
+ // the default value of the preference is used. The default value of a
+ // preference to manage a default-content-settings is
+ // CONTENT_SETTING_DEFAULT. This indicates that no managed value is set. If a
+ // pref was set, than it MUST be managed.
+ PrefService* prefs = profile_->GetPrefs();
+ DCHECK(!prefs->HasPrefPath(kPrefToManageType[type]) ||
+ prefs->IsManagedPreference(kPrefToManageType[type]));
+ AutoLock auto_lock(lock_);
+ managed_default_content_settings_.settings[type] = IntToContentSetting(
+ prefs->GetInteger(kPrefToManageType[type]));
+}
+
+// static
+void PolicyContentSettingsProvider::RegisterUserPrefs(PrefService* prefs) {
+ // Preferences for default content setting policies. A policy is not set of
+ // the corresponding preferences below is set to CONTENT_SETTING_DEFAULT.
+ prefs->RegisterIntegerPref(prefs::kManagedDefaultCookiesSetting,
+ CONTENT_SETTING_DEFAULT);
+ prefs->RegisterIntegerPref(prefs::kManagedDefaultImagesSetting,
+ CONTENT_SETTING_DEFAULT);
+ prefs->RegisterIntegerPref(prefs::kManagedDefaultJavaScriptSetting,
+ CONTENT_SETTING_DEFAULT);
+ prefs->RegisterIntegerPref(prefs::kManagedDefaultPluginsSetting,
+ CONTENT_SETTING_DEFAULT);
+ prefs->RegisterIntegerPref(prefs::kManagedDefaultPopupsSetting,
+ CONTENT_SETTING_DEFAULT);
+}

Powered by Google App Engine
This is Rietveld 408576698