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

Unified Diff: components/content_settings/core/browser/content_settings_supervised_provider.cc

Issue 902833003: Add a HostContentSettingsMap layer for Supervised Users. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months 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: components/content_settings/core/browser/content_settings_supervised_provider.cc
diff --git a/components/content_settings/core/browser/content_settings_supervised_provider.cc b/components/content_settings/core/browser/content_settings_supervised_provider.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0efba2cc9bc973e32fedcc79234acb14fe49ef07
--- /dev/null
+++ b/components/content_settings/core/browser/content_settings_supervised_provider.cc
@@ -0,0 +1,145 @@
+// Copyright (c) 2015 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 "components/content_settings/core/browser/content_settings_supervised_provider.h"
+
+#include <string>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/json/json_reader.h"
+#include "base/prefs/pref_service.h"
+#include "base/values.h"
+#include "components/content_settings/core/browser/content_settings_binary_value_map.h"
+#include "components/content_settings/core/browser/content_settings_rule.h"
+#include "components/content_settings/core/browser/content_settings_utils.h"
+#include "components/content_settings/core/common/pref_names.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+
+namespace {
+
+struct PrefsForSupervisedContentSettingsMapEntry {
+ const char* pref_name;
+ ContentSettingsType content_type;
+};
+
+const PrefsForSupervisedContentSettingsMapEntry
+ kPrefsForSupervisedContentSettingsMap[] = {
+ {
+ prefs::kSupervisedGeolocationDisabled,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION,
+ }, {
+ prefs::kSupervisedCameraMicDisabled,
+ CONTENT_SETTINGS_TYPE_MEDIASTREAM,
+ }
+};
+
+void SetContentSettingFromPreference(
+ PrefService* prefs,
+ content_settings::BinaryValueMap& value_map,
Bernhard Bauer 2015/02/05 12:07:51 Don't use non-const references. If you want to cha
knn 2015/02/26 12:07:30 Done. This isn't a method as I don't want to expos
+ const PrefsForSupervisedContentSettingsMapEntry& pref_map_entry) {
+ const PrefService::Preference* pref =
+ prefs->FindPreference(pref_map_entry.pref_name);
+ DCHECK(pref);
+ DCHECK(pref->IsManagedByCustodian());
+ bool is_disabled;
+ if (!pref->GetValue()->GetAsBoolean(&is_disabled)) {
+ NOTREACHED();
+ return;
+ }
+ value_map.SetContentSettingDisabled(pref_map_entry.content_type, is_disabled);
+}
+
+} // namespace
+
+namespace content_settings {
+
+// static
+void SupervisedProvider::RegisterProfilePrefs(
+ user_prefs::PrefRegistrySyncable* registry) {
+ registry->RegisterBooleanPref(
+ prefs::kSupervisedGeolocationDisabled, false,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+ registry->RegisterBooleanPref(
+ prefs::kSupervisedCameraMicDisabled, false,
+ user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
+}
+
+SupervisedProvider::SupervisedProvider(PrefService* prefs) : prefs_(prefs) {
+ ReadContentSettingsFromPreferences();
+
+ pref_change_registrar_.Init(prefs_);
+ PrefChangeRegistrar::NamedChangeCallback callback = base::Bind(
+ &SupervisedProvider::OnPreferenceChanged, base::Unretained(this));
+ pref_change_registrar_.Add(prefs::kSupervisedGeolocationDisabled, callback);
+ pref_change_registrar_.Add(prefs::kSupervisedCameraMicDisabled, callback);
+}
+
+SupervisedProvider::~SupervisedProvider() {
+ DCHECK(!prefs_);
+}
+
+RuleIterator* SupervisedProvider::GetRuleIterator(
+ ContentSettingsType content_type,
+ const ResourceIdentifier& resource_identifier,
+ bool incognito) const {
+ scoped_ptr<base::AutoLock> auto_lock(new base::AutoLock(lock_));
+ return value_map_.GetRuleIterator(content_type, resource_identifier,
+ auto_lock.Pass());
+}
+
+void SupervisedProvider::ReadContentSettingsFromPreferences() {
+ base::AutoLock auto_lock(lock_);
+ for (const auto& pref_map_entry : kPrefsForSupervisedContentSettingsMap) {
+ if (!prefs_->HasPrefPath(pref_map_entry.pref_name)) {
+ VLOG(2) << "Skipping unset preference: " << pref_map_entry.pref_name;
+ continue;
+ }
+ SetContentSettingFromPreference(prefs_, value_map_, pref_map_entry);
+ }
+}
+
+// Since the SupervisedProvider is a read only content settings provider, all
+// methodes of the ProviderInterface that set or delete any settings do nothing.
Bernhard Bauer 2015/02/05 12:07:51 Nit: "methods"
knn 2015/02/26 12:07:30 Done.
+bool SupervisedProvider::SetWebsiteSetting(
+ const ContentSettingsPattern& primary_pattern,
+ const ContentSettingsPattern& secondary_pattern,
+ ContentSettingsType content_type,
+ const ResourceIdentifier& resource_identifier,
+ base::Value* value) {
+ return false;
+}
+
+void SupervisedProvider::ClearAllContentSettingsRules(
+ ContentSettingsType content_type) {
+}
+
+void SupervisedProvider::ShutdownOnUIThread() {
+ DCHECK(CalledOnValidThread());
+ RemoveAllObservers();
+ if (!prefs_)
+ return;
+ pref_change_registrar_.RemoveAll();
+ prefs_ = NULL;
Bernhard Bauer 2015/02/05 12:07:51 Use nullptr instead of NULL.
knn 2015/02/26 12:07:30 Done.
+}
+
+void SupervisedProvider::OnPreferenceChanged(const std::string& name) {
+ DCHECK(CalledOnValidThread());
+ scoped_ptr<base::AutoLock> auto_lock(new base::AutoLock(lock_));
Bernhard Bauer 2015/02/05 12:07:51 You can just put this into a nested scope that end
knn 2015/02/26 12:07:30 Done.
+ bool is_valid_preference = false;
+ for (const auto& pref_map_entry : kPrefsForSupervisedContentSettingsMap) {
+ if (name == pref_map_entry.pref_name) {
+ is_valid_preference = true;
+ SetContentSettingFromPreference(prefs_, value_map_, pref_map_entry);
+ break;
+ }
+ }
+ DCHECK(is_valid_preference);
+ auto_lock.reset();
+
+ NotifyObservers(ContentSettingsPattern(), ContentSettingsPattern(),
+ CONTENT_SETTINGS_TYPE_DEFAULT, std::string());
+}
+
+} // namespace content_settings

Powered by Google App Engine
This is Rietveld 408576698