| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/pref_value_store.h" | 5 #include "chrome/browser/pref_value_store.h" |
| 6 #include "chrome/common/notification_service.h" |
| 6 | 7 |
| 7 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, | 8 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, |
| 8 PrefStore* extension_prefs, | 9 PrefStore* extension_prefs, |
| 9 PrefStore* command_line_prefs, | 10 PrefStore* command_line_prefs, |
| 10 PrefStore* user_prefs, | 11 PrefStore* user_prefs, |
| 11 PrefStore* recommended_prefs) { | 12 PrefStore* recommended_prefs) { |
| 12 pref_stores_[MANAGED].reset(managed_prefs); | 13 pref_stores_[MANAGED].reset(managed_prefs); |
| 13 pref_stores_[EXTENSION].reset(extension_prefs); | 14 pref_stores_[EXTENSION].reset(extension_prefs); |
| 14 pref_stores_[COMMAND_LINE].reset(command_line_prefs); | 15 pref_stores_[COMMAND_LINE].reset(command_line_prefs); |
| 15 pref_stores_[USER].reset(user_prefs); | 16 pref_stores_[USER].reset(user_prefs); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) { | 107 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) { |
| 107 return ControllingPrefStoreForPref(name) == USER; | 108 return ControllingPrefStoreForPref(name) == USER; |
| 108 } | 109 } |
| 109 | 110 |
| 110 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { | 111 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { |
| 111 PrefStoreType effective_store = ControllingPrefStoreForPref(name); | 112 PrefStoreType effective_store = ControllingPrefStoreForPref(name); |
| 112 return effective_store >= USER || effective_store == INVALID; | 113 return effective_store >= USER || effective_store == INVALID; |
| 113 } | 114 } |
| 114 | 115 |
| 115 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { | 116 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { |
| 116 if (pref_stores_[type].get() == NULL) { | 117 if (!pref_stores_[type].get()) { |
| 117 // No store of that type set, so this pref can't be in it. | 118 // No store of that type set, so this pref can't be in it. |
| 118 return false; | 119 return false; |
| 119 } | 120 } |
| 120 Value* tmp_value; | 121 Value* tmp_value; |
| 121 return pref_stores_[type]->prefs()->Get(name, &tmp_value); | 122 return pref_stores_[type]->prefs()->Get(name, &tmp_value); |
| 122 } | 123 } |
| 123 | 124 |
| 124 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( | 125 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( |
| 125 const wchar_t* name) { | 126 const wchar_t* name) { |
| 126 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { | 127 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { |
| 127 if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) | 128 if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) |
| 128 return static_cast<PrefStoreType>(i); | 129 return static_cast<PrefStoreType>(i); |
| 129 } | 130 } |
| 130 return INVALID; | 131 return INVALID; |
| 131 } | 132 } |
| 133 |
| 134 void PrefValueStore::RefreshPolicyPrefsCompletion( |
| 135 PrefStore* new_managed_pref_store, |
| 136 PrefStore* new_recommended_pref_store, |
| 137 AfterRefreshCallback callback) { |
| 138 |
| 139 DictionaryValue* managed_prefs_before(pref_stores_[MANAGED]->prefs()); |
| 140 DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs()); |
| 141 DictionaryValue* recommended_prefs_before(pref_stores_[RECOMMENDED]->prefs()); |
| 142 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
| 143 |
| 144 std::vector<std::string> changed_managed_paths; |
| 145 managed_prefs_before->GetDifferingPaths(managed_prefs_after, |
| 146 &changed_managed_paths); |
| 147 |
| 148 std::vector<std::string> changed_recommended_paths; |
| 149 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
| 150 &changed_recommended_paths); |
| 151 |
| 152 std::vector<std::string> changed_paths(changed_managed_paths.size() + |
| 153 changed_recommended_paths.size()); |
| 154 std::vector<std::string>::iterator last_insert = |
| 155 std::merge(changed_managed_paths.begin(), |
| 156 changed_managed_paths.end(), |
| 157 changed_recommended_paths.begin(), |
| 158 changed_recommended_paths.end(), |
| 159 changed_paths.begin()); |
| 160 changed_paths.resize(last_insert - changed_paths.begin()); |
| 161 |
| 162 pref_stores_[MANAGED].reset(new_managed_pref_store); |
| 163 pref_stores_[RECOMMENDED].reset(new_recommended_pref_store); |
| 164 callback->Run(changed_paths); |
| 165 } |
| 166 |
| 167 void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
| 168 ChromeThread::ID calling_thread_id, |
| 169 PrefStore* new_managed_pref_store, |
| 170 PrefStore* new_recommended_pref_store, |
| 171 AfterRefreshCallback callback) { |
| 172 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 173 scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); |
| 174 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); |
| 175 |
| 176 PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); |
| 177 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
| 178 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " |
| 179 << read_error; |
| 180 return; |
| 181 } |
| 182 |
| 183 read_error = new_recommended_pref_store->ReadPrefs(); |
| 184 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
| 185 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " |
| 186 << read_error; |
| 187 return; |
| 188 } |
| 189 |
| 190 ChromeThread::PostTask( |
| 191 calling_thread_id, FROM_HERE, |
| 192 NewRunnableMethod(this, |
| 193 &PrefValueStore::RefreshPolicyPrefsCompletion, |
| 194 managed_pref_store.release(), |
| 195 recommended_pref_store.release(), |
| 196 callback)); |
| 197 } |
| 198 |
| 199 void PrefValueStore::RefreshPolicyPrefs( |
| 200 PrefStore* new_managed_pref_store, |
| 201 PrefStore* new_recommended_pref_store, |
| 202 AfterRefreshCallback callback) { |
| 203 ChromeThread::ID current_thread_id; |
| 204 CHECK(ChromeThread::GetCurrentThreadIdentifier(¤t_thread_id)); |
| 205 ChromeThread::PostTask( |
| 206 ChromeThread::FILE, FROM_HERE, |
| 207 NewRunnableMethod(this, |
| 208 &PrefValueStore::RefreshPolicyPrefsOnFileThread, |
| 209 current_thread_id, |
| 210 new_managed_pref_store, |
| 211 new_recommended_pref_store, |
| 212 callback)); |
| 213 } |
| OLD | NEW |