Adding instrumentation to locate the source of jankiness
[chromium-blink-merge.git] / chrome / browser / content_settings / content_settings_override_provider.cc
blob24a546781b5ff0a94a50d3963a3bdcfac7679928
1 // Copyright 2014 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.
5 #include "chrome/browser/content_settings/content_settings_override_provider.h"
7 #include <string>
9 #include "base/auto_reset.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/prefs/scoped_user_pref_update.h"
12 #include "base/values.h"
13 #include "chrome/browser/content_settings/content_settings_utils.h"
14 #include "chrome/common/pref_names.h"
15 #include "components/content_settings/core/browser/content_settings_rule.h"
16 #include "components/content_settings/core/common/content_settings.h"
17 #include "components/content_settings/core/common/content_settings_pattern.h"
18 #include "components/pref_registry/pref_registry_syncable.h"
19 #include "content/public/browser/browser_thread.h"
21 using content::BrowserThread;
23 namespace content_settings {
25 namespace {
27 class OverrideRuleIterator : public RuleIterator {
28 public:
29 explicit OverrideRuleIterator(bool is_allowed) : is_done_(is_allowed) {}
31 virtual bool HasNext() const override { return !is_done_; }
33 virtual Rule Next() override {
34 DCHECK(!is_done_);
35 is_done_ = true;
36 return Rule(ContentSettingsPattern::Wildcard(),
37 ContentSettingsPattern::Wildcard(),
38 new base::FundamentalValue(CONTENT_SETTING_BLOCK));
41 private:
42 bool is_done_;
45 } // namespace
47 // static
48 void OverrideProvider::RegisterProfilePrefs(
49 user_prefs::PrefRegistrySyncable* registry) {
50 registry->RegisterDictionaryPref(
51 prefs::kOverrideContentSettings,
52 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
55 OverrideProvider::OverrideProvider(PrefService* prefs, bool incognito)
56 : prefs_(prefs), is_incognito_(incognito) {
57 DCHECK(prefs_);
59 // Read global overrides.
60 ReadOverrideSettings();
63 OverrideProvider::~OverrideProvider() {
66 RuleIterator* OverrideProvider::GetRuleIterator(
67 ContentSettingsType content_type,
68 const ResourceIdentifier& resource_identifier,
69 bool incognito) const {
70 base::AutoLock lock(lock_);
71 if (resource_identifier.empty()) {
72 return new OverrideRuleIterator(allowed_settings_[content_type]);
74 return new EmptyRuleIterator();
77 void OverrideProvider::ClearAllContentSettingsRules(
78 ContentSettingsType content_type) {
81 bool OverrideProvider::SetWebsiteSetting(
82 const ContentSettingsPattern& primary_pattern,
83 const ContentSettingsPattern& secondary_pattern,
84 ContentSettingsType content_type,
85 const ResourceIdentifier& resource_identifier,
86 base::Value* in_value) {
87 return false;
90 void OverrideProvider::ShutdownOnUIThread() {
91 DCHECK(prefs_);
92 prefs_ = NULL;
95 void OverrideProvider::SetOverrideSetting(ContentSettingsType content_type,
96 bool enabled) {
97 DCHECK_CURRENTLY_ON(BrowserThread::UI);
98 DCHECK(prefs_);
100 // Disallow incognito to change the state.
101 DCHECK(!is_incognito_);
103 base::AutoLock lock(lock_);
104 DictionaryPrefUpdate update(prefs_, prefs::kOverrideContentSettings);
105 base::DictionaryValue* default_settings_dictionary = update.Get();
106 if (enabled) {
107 allowed_settings_[content_type] = true;
108 default_settings_dictionary->RemoveWithoutPathExpansion(
109 GetTypeName(content_type), NULL);
110 } else {
111 allowed_settings_[content_type] = false;
112 default_settings_dictionary->SetWithoutPathExpansion(
113 GetTypeName(content_type), new base::FundamentalValue(true));
117 bool OverrideProvider::IsEnabled(ContentSettingsType content_type) const {
118 base::AutoLock lock(lock_);
119 return allowed_settings_[content_type];
122 void OverrideProvider::ReadOverrideSettings() {
123 DCHECK_CURRENTLY_ON(BrowserThread::UI);
124 const base::DictionaryValue* blocked_settings_dictionary =
125 prefs_->GetDictionary(prefs::kOverrideContentSettings);
127 for (int type = 0; type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
128 ContentSettingsType content_setting = ContentSettingsType(type);
129 allowed_settings_[content_setting] =
130 !blocked_settings_dictionary->HasKey(GetTypeName(content_setting));
134 } // namespace content_settings