Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / content_settings / content_settings_override_provider.cc
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.
4
5 #include "chrome/browser/content_settings/content_settings_override_provider.h"
6
7 #include <string>
8
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"
20
21 using content::BrowserThread;
22
23 namespace content_settings {
24
25 namespace {
26
27 class OverrideRuleIterator : public RuleIterator {
28  public:
29   explicit OverrideRuleIterator(bool is_allowed) : is_done_(is_allowed) {}
30
31   virtual bool HasNext() const OVERRIDE { return !is_done_; }
32
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));
39   }
40
41  private:
42   bool is_done_;
43 };
44
45 }  // namespace
46
47 // static
48 void OverrideProvider::RegisterProfilePrefs(
49     user_prefs::PrefRegistrySyncable* registry) {
50   registry->RegisterDictionaryPref(
51       prefs::kOverrideContentSettings,
52       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
53 }
54
55 OverrideProvider::OverrideProvider(PrefService* prefs, bool incognito)
56     : prefs_(prefs), is_incognito_(incognito) {
57   DCHECK(prefs_);
58
59   // Read global overrides.
60   ReadOverrideSettings();
61 }
62
63 OverrideProvider::~OverrideProvider() {
64 }
65
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]);
73   }
74   return new EmptyRuleIterator();
75 }
76
77 void OverrideProvider::ClearAllContentSettingsRules(
78     ContentSettingsType content_type) {
79 }
80
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;
88 }
89
90 void OverrideProvider::ShutdownOnUIThread() {
91   DCHECK(prefs_);
92   prefs_ = NULL;
93 }
94
95 void OverrideProvider::SetOverrideSetting(ContentSettingsType content_type,
96                                           bool enabled) {
97   DCHECK_CURRENTLY_ON(BrowserThread::UI);
98   DCHECK(prefs_);
99
100   // Disallow incognito to change the state.
101   DCHECK(!is_incognito_);
102
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));
114   }
115 }
116
117 bool OverrideProvider::IsEnabled(ContentSettingsType content_type) const {
118   base::AutoLock lock(lock_);
119   return allowed_settings_[content_type];
120 }
121
122 void OverrideProvider::ReadOverrideSettings() {
123   DCHECK_CURRENTLY_ON(BrowserThread::UI);
124   const base::DictionaryValue* blocked_settings_dictionary =
125       prefs_->GetDictionary(prefs::kOverrideContentSettings);
126
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));
131   }
132 }
133
134 }  // namespace content_settings