Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / supervised_user / supervised_user_pref_store.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/supervised_user/supervised_user_pref_store.h"
6
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/prefs/pref_value_map.h"
11 #include "base/values.h"
12 #include "chrome/browser/prefs/incognito_mode_prefs.h"
13 #include "chrome/browser/supervised_user/supervised_user_constants.h"
14 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
15 #include "chrome/browser/supervised_user/supervised_user_url_filter.h"
16 #include "chrome/common/pref_names.h"
17
18 using base::FundamentalValue;
19
20 namespace {
21
22 struct SupervisedUserSettingsPrefMappingEntry {
23   const char* settings_name;
24   const char* pref_name;
25 };
26
27 SupervisedUserSettingsPrefMappingEntry kSupervisedUserSettingsPrefMapping[] = {
28   {
29     supervised_users::kContentPackDefaultFilteringBehavior,
30     prefs::kDefaultSupervisedUserFilteringBehavior,
31   },
32   {
33     supervised_users::kContentPackManualBehaviorHosts,
34     prefs::kSupervisedUserManualHosts,
35   },
36   {
37     supervised_users::kContentPackManualBehaviorURLs,
38     prefs::kSupervisedUserManualURLs,
39   },
40   {
41     supervised_users::kForceSafeSearch, prefs::kForceSafeSearch,
42   },
43   {
44     supervised_users::kRecordHistory, prefs::kRecordHistory,
45   },
46   {
47     supervised_users::kSigninAllowed, prefs::kSigninAllowed,
48   },
49   {
50     supervised_users::kUserName, prefs::kProfileName,
51   },
52 };
53
54 }  // namespace
55
56 SupervisedUserPrefStore::SupervisedUserPrefStore(
57     SupervisedUserSettingsService* supervised_user_settings_service)
58     : weak_ptr_factory_(this) {
59   supervised_user_settings_service->Subscribe(
60       base::Bind(&SupervisedUserPrefStore::OnNewSettingsAvailable,
61                  weak_ptr_factory_.GetWeakPtr()));
62 }
63
64 bool SupervisedUserPrefStore::GetValue(const std::string& key,
65                                        const base::Value** value) const {
66   DCHECK(prefs_);
67   return prefs_->GetValue(key, value);
68 }
69
70 void SupervisedUserPrefStore::AddObserver(PrefStore::Observer* observer) {
71   observers_.AddObserver(observer);
72 }
73
74 void SupervisedUserPrefStore::RemoveObserver(PrefStore::Observer* observer) {
75   observers_.RemoveObserver(observer);
76 }
77
78 bool SupervisedUserPrefStore::HasObservers() const {
79   return observers_.might_have_observers();
80 }
81
82 bool SupervisedUserPrefStore::IsInitializationComplete() const {
83   return !!prefs_;
84 }
85
86 SupervisedUserPrefStore::~SupervisedUserPrefStore() {
87 }
88
89 void SupervisedUserPrefStore::OnNewSettingsAvailable(
90     const base::DictionaryValue* settings) {
91   scoped_ptr<PrefValueMap> old_prefs = prefs_.Pass();
92   prefs_.reset(new PrefValueMap);
93   if (settings) {
94     // Set hardcoded prefs.
95     prefs_->SetValue(prefs::kAllowDeletingBrowserHistory,
96                      new FundamentalValue(false));
97     prefs_->SetValue(prefs::kDefaultSupervisedUserFilteringBehavior,
98                      new FundamentalValue(SupervisedUserURLFilter::ALLOW));
99     prefs_->SetValue(prefs::kForceSafeSearch, new FundamentalValue(true));
100     prefs_->SetValue(prefs::kRecordHistory, new FundamentalValue(true));
101     prefs_->SetValue(prefs::kHideWebStoreIcon, new FundamentalValue(true));
102     prefs_->SetValue(prefs::kIncognitoModeAvailability,
103                      new FundamentalValue(IncognitoModePrefs::DISABLED));
104     prefs_->SetValue(prefs::kSigninAllowed, new FundamentalValue(false));
105
106     // Copy supervised user settings to prefs.
107     for (size_t i = 0; i < arraysize(kSupervisedUserSettingsPrefMapping); ++i) {
108       const SupervisedUserSettingsPrefMappingEntry& entry =
109           kSupervisedUserSettingsPrefMapping[i];
110       const base::Value* value = NULL;
111       if (settings->GetWithoutPathExpansion(entry.settings_name, &value))
112         prefs_->SetValue(entry.pref_name, value->DeepCopy());
113     }
114   }
115
116   if (!old_prefs) {
117     FOR_EACH_OBSERVER(Observer, observers_, OnInitializationCompleted(true));
118     return;
119   }
120
121   std::vector<std::string> changed_prefs;
122   prefs_->GetDifferingKeys(old_prefs.get(), &changed_prefs);
123
124   // Send out change notifications.
125   for (const std::string& pref : changed_prefs) {
126     FOR_EACH_OBSERVER(Observer, observers_, OnPrefValueChanged(pref));
127   }
128 }