summaryrefslogtreecommitdiffstats
path: root/components/content_settings
diff options
context:
space:
mode:
authorknn <knn@chromium.org>2015-03-04 12:42:43 -0800
committerCommit bot <commit-bot@chromium.org>2015-03-04 20:43:27 +0000
commit95221ffe02b9d0782202d80cf86766686afab13a (patch)
treeb29e6c1d128c70419b070a5fc3be7efc549b9f26 /components/content_settings
parent9e621293154d1419c1e270c923237958ef70a091 (diff)
downloadchromium_src-95221ffe02b9d0782202d80cf86766686afab13a.zip
chromium_src-95221ffe02b9d0782202d80cf86766686afab13a.tar.gz
chromium_src-95221ffe02b9d0782202d80cf86766686afab13a.tar.bz2
Add a HostContentSettingsMap layer for Supervised Users.
Added a layer for Supervised Users in the HostContentSettingsMap. As this only needs functionality to block the entire content setting (for now), it is similar to the existing OverrideProvider. Reorganized the common code between the two providers. Updated the helper methods in PrefServiceBridge to check the HostContentSettingsMap instead of Preferences when checking whether it is managed by the custodian. BUG=455646 BUG=455640 Review URL: https://codereview.chromium.org/902833003 Cr-Commit-Position: refs/heads/master@{#319121}
Diffstat (limited to 'components/content_settings')
-rw-r--r--components/content_settings/core/browser/BUILD.gn2
-rw-r--r--components/content_settings/core/browser/content_settings_binary_value_map.cc65
-rw-r--r--components/content_settings/core/browser/content_settings_binary_value_map.h39
-rw-r--r--components/content_settings/core/browser/content_settings_override_provider.cc47
-rw-r--r--components/content_settings/core/browser/content_settings_override_provider.h3
-rw-r--r--components/content_settings/core/browser/host_content_settings_map.cc2
-rw-r--r--components/content_settings/core/browser/host_content_settings_map.h1
-rw-r--r--components/content_settings/core/common/content_settings.h7
8 files changed, 127 insertions, 39 deletions
diff --git a/components/content_settings/core/browser/BUILD.gn b/components/content_settings/core/browser/BUILD.gn
index a321cbb..667b5bc 100644
--- a/components/content_settings/core/browser/BUILD.gn
+++ b/components/content_settings/core/browser/BUILD.gn
@@ -9,6 +9,8 @@ static_library("browser") {
"content_settings_default_provider.h",
"content_settings_details.cc",
"content_settings_details.h",
+ "content_settings_binary_value_map.cc",
+ "content_settings_binary_value_map.h",
"content_settings_observable_provider.cc",
"content_settings_observable_provider.h",
"content_settings_observer.h",
diff --git a/components/content_settings/core/browser/content_settings_binary_value_map.cc b/components/content_settings/core/browser/content_settings_binary_value_map.cc
new file mode 100644
index 0000000..136d3874
--- /dev/null
+++ b/components/content_settings/core/browser/content_settings_binary_value_map.cc
@@ -0,0 +1,65 @@
+// 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_binary_value_map.h"
+
+#include "base/synchronization/lock.h"
+#include "components/content_settings/core/browser/content_settings_rule.h"
+#include "components/content_settings/core/common/content_settings.h"
+
+namespace content_settings {
+
+namespace {
+
+class RuleIteratorBinary : public RuleIterator {
+ public:
+ explicit RuleIteratorBinary(bool is_enabled,
+ scoped_ptr<base::AutoLock> auto_lock)
+ : is_done_(is_enabled), auto_lock_(auto_lock.Pass()) {}
+
+ bool HasNext() const override { return !is_done_; }
+
+ Rule Next() override {
+ DCHECK(!is_done_);
+ is_done_ = true;
+ return Rule(ContentSettingsPattern::Wildcard(),
+ ContentSettingsPattern::Wildcard(),
+ new base::FundamentalValue(CONTENT_SETTING_BLOCK));
+ }
+
+ private:
+ bool is_done_;
+ scoped_ptr<base::AutoLock> auto_lock_;
+};
+
+} // namespace
+
+BinaryValueMap::BinaryValueMap() {
+ for (bool& enabled : is_enabled_) {
+ enabled = true;
+ }
+}
+
+RuleIterator* BinaryValueMap::GetRuleIterator(
+ ContentSettingsType content_type,
+ const ResourceIdentifier& resource_identifier,
+ scoped_ptr<base::AutoLock> auto_lock) const {
+ if (resource_identifier.empty()) {
+ return new RuleIteratorBinary(IsContentSettingEnabled(content_type),
+ auto_lock.Pass());
+ }
+ return new EmptyRuleIterator();
+}
+
+void BinaryValueMap::SetContentSettingDisabled(ContentSettingsType content_type,
+ bool is_disabled) {
+ is_enabled_[content_type] = !is_disabled;
+}
+
+bool BinaryValueMap::IsContentSettingEnabled(
+ ContentSettingsType content_type) const {
+ return is_enabled_[content_type];
+}
+
+} // namespace content_settings
diff --git a/components/content_settings/core/browser/content_settings_binary_value_map.h b/components/content_settings/core/browser/content_settings_binary_value_map.h
new file mode 100644
index 0000000..3416a13
--- /dev/null
+++ b/components/content_settings/core/browser/content_settings_binary_value_map.h
@@ -0,0 +1,39 @@
+// 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.
+
+#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_
+#define COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_
+
+#include "components/content_settings/core/browser/content_settings_provider.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+
+namespace base {
+class AutoLock;
+} // namespace base
+
+namespace content_settings {
+
+class RuleIterator;
+
+// A simplified value map that can be used to disable or enable the entire
+// Content Setting. The default behaviour is enabling the Content Setting if
+// it is not set explicitly.
+class BinaryValueMap {
+ public:
+ BinaryValueMap();
+
+ RuleIterator* GetRuleIterator(ContentSettingsType content_type,
+ const ResourceIdentifier& resource_identifier,
+ scoped_ptr<base::AutoLock> lock) const;
+ void SetContentSettingDisabled(ContentSettingsType content_type,
+ bool disabled);
+ bool IsContentSettingEnabled(ContentSettingsType content_type) const;
+
+ private:
+ bool is_enabled_[CONTENT_SETTINGS_NUM_TYPES];
+};
+
+} // namespace content_settings
+
+#endif // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_BINARY_VALUE_MAP_H_
diff --git a/components/content_settings/core/browser/content_settings_override_provider.cc b/components/content_settings/core/browser/content_settings_override_provider.cc
index edb36a5..ee04dc9 100644
--- a/components/content_settings/core/browser/content_settings_override_provider.cc
+++ b/components/content_settings/core/browser/content_settings_override_provider.cc
@@ -10,6 +10,7 @@
#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.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/content_settings.h"
@@ -19,28 +20,6 @@
namespace content_settings {
-namespace {
-
-class OverrideRuleIterator : public RuleIterator {
- public:
- explicit OverrideRuleIterator(bool is_allowed) : is_done_(is_allowed) {}
-
- bool HasNext() const override { return !is_done_; }
-
- Rule Next() override {
- DCHECK(!is_done_);
- is_done_ = true;
- return Rule(ContentSettingsPattern::Wildcard(),
- ContentSettingsPattern::Wildcard(),
- new base::FundamentalValue(CONTENT_SETTING_BLOCK));
- }
-
- private:
- bool is_done_;
-};
-
-} // namespace
-
// static
void OverrideProvider::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* registry) {
@@ -64,11 +43,9 @@ RuleIterator* OverrideProvider::GetRuleIterator(
ContentSettingsType content_type,
const ResourceIdentifier& resource_identifier,
bool incognito) const {
- base::AutoLock lock(lock_);
- if (resource_identifier.empty()) {
- return new OverrideRuleIterator(allowed_settings_[content_type]);
- }
- return new EmptyRuleIterator();
+ scoped_ptr<base::AutoLock> auto_lock(new base::AutoLock(lock_));
+ return allowed_settings_.GetRuleIterator(content_type, resource_identifier,
+ auto_lock.Pass());
}
void OverrideProvider::ClearAllContentSettingsRules(
@@ -97,23 +74,22 @@ void OverrideProvider::SetOverrideSetting(ContentSettingsType content_type,
// Disallow incognito to change the state.
DCHECK(!is_incognito_);
- base::AutoLock lock(lock_);
+ base::AutoLock auto_lock(lock_);
DictionaryPrefUpdate update(prefs_, prefs::kOverrideContentSettings);
base::DictionaryValue* default_settings_dictionary = update.Get();
+ allowed_settings_.SetContentSettingDisabled(content_type, !enabled);
if (enabled) {
- allowed_settings_[content_type] = true;
default_settings_dictionary->RemoveWithoutPathExpansion(
GetTypeName(content_type), NULL);
} else {
- allowed_settings_[content_type] = false;
default_settings_dictionary->SetWithoutPathExpansion(
GetTypeName(content_type), new base::FundamentalValue(true));
}
}
bool OverrideProvider::IsEnabled(ContentSettingsType content_type) const {
- base::AutoLock lock(lock_);
- return allowed_settings_[content_type];
+ base::AutoLock auto_lock(lock_);
+ return allowed_settings_.IsContentSettingEnabled(content_type);
}
void OverrideProvider::ReadOverrideSettings() {
@@ -121,9 +97,10 @@ void OverrideProvider::ReadOverrideSettings() {
prefs_->GetDictionary(prefs::kOverrideContentSettings);
for (int type = 0; type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
- ContentSettingsType content_setting = ContentSettingsType(type);
- allowed_settings_[content_setting] =
- !blocked_settings_dictionary->HasKey(GetTypeName(content_setting));
+ ContentSettingsType content_type = ContentSettingsType(type);
+ if (blocked_settings_dictionary->HasKey(GetTypeName(content_type))) {
+ allowed_settings_.SetContentSettingDisabled(content_type, true);
+ }
}
}
diff --git a/components/content_settings/core/browser/content_settings_override_provider.h b/components/content_settings/core/browser/content_settings_override_provider.h
index 08f3052..ca61f60 100644
--- a/components/content_settings/core/browser/content_settings_override_provider.h
+++ b/components/content_settings/core/browser/content_settings_override_provider.h
@@ -8,6 +8,7 @@
#include "base/macros.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_checker.h"
+#include "components/content_settings/core/browser/content_settings_binary_value_map.h"
#include "components/content_settings/core/browser/content_settings_provider.h"
#include "components/content_settings/core/common/content_settings_types.h"
@@ -59,7 +60,7 @@ class OverrideProvider : public ProviderInterface {
void ReadOverrideSettings();
// Copies of the pref data, so that we can read it on the IO thread.
- bool allowed_settings_[CONTENT_SETTINGS_NUM_TYPES];
+ BinaryValueMap allowed_settings_;
PrefService* prefs_;
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc
index 386de0c..fa67b20 100644
--- a/components/content_settings/core/browser/host_content_settings_map.cc
+++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -38,6 +38,7 @@ typedef std::pair<std::string, std::string> StringPair;
const char* kProviderNames[] = {
"platform_app",
"policy",
+ "supervised_user",
"extension",
"override",
"preference",
@@ -57,6 +58,7 @@ const char kExtensionScheme[] = "chrome-extension";
content_settings::SettingSource kProviderSourceMap[] = {
content_settings::SETTING_SOURCE_EXTENSION,
content_settings::SETTING_SOURCE_POLICY,
+ content_settings::SETTING_SOURCE_SUPERVISED,
content_settings::SETTING_SOURCE_EXTENSION,
content_settings::SETTING_SOURCE_USER,
content_settings::SETTING_SOURCE_USER,
diff --git a/components/content_settings/core/browser/host_content_settings_map.h b/components/content_settings/core/browser/host_content_settings_map.h
index 285aaa8..547b0e2 100644
--- a/components/content_settings/core/browser/host_content_settings_map.h
+++ b/components/content_settings/core/browser/host_content_settings_map.h
@@ -54,6 +54,7 @@ class HostContentSettingsMap
// TODO(mukai): find the solution.
INTERNAL_EXTENSION_PROVIDER = 0,
POLICY_PROVIDER,
+ SUPERVISED_PROVIDER,
CUSTOM_EXTENSION_PROVIDER,
OVERRIDE_PROVIDER,
PREF_PROVIDER,
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
index ae9fb93..7f49a8c 100644
--- a/components/content_settings/core/common/content_settings.h
+++ b/components/content_settings/core/common/content_settings.h
@@ -60,15 +60,16 @@ struct RendererContentSettingRules {
namespace content_settings {
// Enum containing the various source for content settings. Settings can be
-// set by policy, extension or the user. Certain (internal) schemes are
-// whilelisted. For whilelisted schemes the source is
-// |SETTING_SOURCE_WHITELIST|.
+// set by policy, extension, the user or by the custodian of a supervised user.
+// Certain (internal) schemes are whilelisted. For whilelisted schemes the
+// source is |SETTING_SOURCE_WHITELIST|.
enum SettingSource {
SETTING_SOURCE_NONE,
SETTING_SOURCE_POLICY,
SETTING_SOURCE_EXTENSION,
SETTING_SOURCE_USER,
SETTING_SOURCE_WHITELIST,
+ SETTING_SOURCE_SUPERVISED,
};
// |SettingInfo| provides meta data for content setting values. |source|