Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / prefs / pref_hash_filter.cc
index b937c35..381fbac 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
+#include "base/prefs/persistent_pref_store.h"
 #include "base/prefs/pref_service.h"
 #include "base/prefs/pref_store.h"
 #include "base/strings/string_number_conversions.h"
@@ -91,6 +92,42 @@ void PrefHashFilter::ClearResetTime(PrefService* user_prefs) {
   user_prefs->ClearPref(prefs::kPreferenceResetTime);
 }
 
+void PrefHashFilter::MigrateValues(PersistentPrefStore* source,
+                                   PersistentPrefStore* destination) {
+  scoped_ptr<PrefHashStoreTransaction> transaction =
+      pref_hash_store_->BeginTransaction();
+  for (TrackedPreferencesMap::const_iterator it = tracked_paths_.begin();
+       it != tracked_paths_.end();
+       ++it) {
+    const base::Value* source_value = NULL;
+    if (source->GetValue(it->first, &source_value) &&
+        !destination->GetValue(it->first, NULL)) {
+      base::DictionaryValue temp_dictionary;
+      // Copy the value from |source| into a suitable place for a
+      // TrackedPreference to act on it.
+      temp_dictionary.Set(it->first, source_value->DeepCopy());
+      // Check whether the value is correct according to our MAC. May remove the
+      //  value from |temp_dictionary|.
+      it->second->EnforceAndReport(&temp_dictionary, transaction.get());
+      // Now take the value as it appears in |temp_dictionary| and put it in
+      // |destination|.
+      scoped_ptr<base::Value> checked_value;
+      if (temp_dictionary.Remove(it->first, &checked_value))
+        destination->SetValue(it->first, checked_value.release());
+    }
+    source->RemoveValue(it->first);
+  }
+
+  // Order these such that a crash at any point is still recoverable. We assume
+  // that they are configured such that the writes will occur on worker threads
+  // in the order that we asked for them.
+  destination->CommitPendingWrite();
+  transaction.reset();
+  // If we crash here, we will just delete the values from |source| in a future
+  // invocation of MigrateValues.
+  source->CommitPendingWrite();
+}
+
 void PrefHashFilter::Initialize(const PrefStore& pref_store) {
   scoped_ptr<PrefHashStoreTransaction> hash_store_transaction(
       pref_hash_store_->BeginTransaction());