Index: chrome/browser/pref_value_store.cc |
diff --git a/chrome/browser/pref_value_store.cc b/chrome/browser/pref_value_store.cc |
index 0988b9c2776cf39d5aad8b1fb0d44d924a960fe1..ab976aa2c43c3103460a79ff243a0897851bdb1f 100644 |
--- a/chrome/browser/pref_value_store.cc |
+++ b/chrome/browser/pref_value_store.cc |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "chrome/browser/pref_value_store.h" |
+#include "chrome/common/notification_service.h" |
PrefValueStore::PrefValueStore(PrefStore* managed_prefs, |
PrefStore* extension_prefs, |
@@ -113,7 +114,7 @@ bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { |
} |
bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { |
- if (pref_stores_[type].get() == NULL) { |
+ if (!pref_stores_[type].get()) { |
// No store of that type set, so this pref can't be in it. |
return false; |
} |
@@ -129,3 +130,84 @@ PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( |
} |
return INVALID; |
} |
+ |
+void PrefValueStore::RefreshPolicyPrefsCompletion( |
+ PrefStore* new_managed_pref_store, |
+ PrefStore* new_recommended_pref_store, |
+ AfterRefreshCallback callback) { |
+ |
+ DictionaryValue* managed_prefs_before(pref_stores_[MANAGED]->prefs()); |
+ DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs()); |
+ DictionaryValue* recommended_prefs_before(pref_stores_[RECOMMENDED]->prefs()); |
+ DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
+ |
+ std::vector<std::string> changed_managed_paths; |
+ managed_prefs_before->GetDifferingPaths(managed_prefs_after, |
+ &changed_managed_paths); |
+ |
+ std::vector<std::string> changed_recommended_paths; |
+ recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
+ &changed_recommended_paths); |
+ |
+ std::vector<std::string> changed_paths(changed_managed_paths.size() + |
+ changed_recommended_paths.size()); |
+ std::vector<std::string>::iterator last_insert = |
+ std::merge(changed_managed_paths.begin(), |
+ changed_managed_paths.end(), |
+ changed_recommended_paths.begin(), |
+ changed_recommended_paths.end(), |
+ changed_paths.begin()); |
+ changed_paths.resize(last_insert - changed_paths.begin()); |
+ |
+ pref_stores_[MANAGED].reset(new_managed_pref_store); |
+ pref_stores_[RECOMMENDED].reset(new_recommended_pref_store); |
+ callback->Run(changed_paths); |
+} |
+ |
+void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
+ ChromeThread::ID calling_thread_id, |
+ PrefStore* new_managed_pref_store, |
+ PrefStore* new_recommended_pref_store, |
+ AfterRefreshCallback callback) { |
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
+ scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); |
+ scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); |
+ |
+ PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); |
+ if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
+ LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " |
+ << read_error; |
+ return; |
+ } |
+ |
+ read_error = new_recommended_pref_store->ReadPrefs(); |
+ if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
+ LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " |
+ << read_error; |
+ return; |
+ } |
+ |
+ ChromeThread::PostTask( |
+ calling_thread_id, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &PrefValueStore::RefreshPolicyPrefsCompletion, |
+ managed_pref_store.release(), |
+ recommended_pref_store.release(), |
+ callback)); |
+} |
+ |
+void PrefValueStore::RefreshPolicyPrefs( |
+ PrefStore* new_managed_pref_store, |
+ PrefStore* new_recommended_pref_store, |
+ AfterRefreshCallback callback) { |
+ ChromeThread::ID current_thread_id; |
+ CHECK(ChromeThread::GetCurrentThreadIdentifier(¤t_thread_id)); |
+ ChromeThread::PostTask( |
+ ChromeThread::FILE, FROM_HERE, |
+ NewRunnableMethod(this, |
+ &PrefValueStore::RefreshPolicyPrefsOnFileThread, |
+ current_thread_id, |
+ new_managed_pref_store, |
+ new_recommended_pref_store, |
+ callback)); |
+} |