| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/prefs/pref_model_associator.h" | 5 #include "chrome/browser/prefs/pref_model_associator.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/json/json_string_value_serializer.h" | 9 #include "base/json/json_string_value_serializer.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 syncer::SyncError::DATATYPE_ERROR, | 464 syncer::SyncError::DATATYPE_ERROR, |
| 465 "Models not yet associated.", | 465 "Models not yet associated.", |
| 466 PREFERENCES); | 466 PREFERENCES); |
| 467 return error; | 467 return error; |
| 468 } | 468 } |
| 469 base::AutoReset<bool> processing_changes(&processing_syncer_changes_, true); | 469 base::AutoReset<bool> processing_changes(&processing_syncer_changes_, true); |
| 470 syncer::SyncChangeList::const_iterator iter; | 470 syncer::SyncChangeList::const_iterator iter; |
| 471 for (iter = change_list.begin(); iter != change_list.end(); ++iter) { | 471 for (iter = change_list.begin(); iter != change_list.end(); ++iter) { |
| 472 DCHECK_EQ(type_, iter->sync_data().GetDataType()); | 472 DCHECK_EQ(type_, iter->sync_data().GetDataType()); |
| 473 | 473 |
| 474 std::string name; | |
| 475 const sync_pb::PreferenceSpecifics& pref_specifics = | 474 const sync_pb::PreferenceSpecifics& pref_specifics = |
| 476 GetSpecifics(iter->sync_data()); | 475 GetSpecifics(iter->sync_data()); |
| 477 | 476 |
| 478 scoped_ptr<base::Value> value(ReadPreferenceSpecifics(pref_specifics, | 477 std::string name = pref_specifics.name(); |
| 479 &name)); | |
| 480 | |
| 481 if (iter->change_type() == syncer::SyncChange::ACTION_DELETE) { | |
| 482 // We never delete preferences. | |
| 483 NOTREACHED() << "Attempted to process sync delete change for " << name | |
| 484 << ". Skipping."; | |
| 485 continue; | |
| 486 } | |
| 487 | |
| 488 // Skip values we can't deserialize. | |
| 489 // TODO(zea): consider taking some further action such as erasing the bad | |
| 490 // data. | |
| 491 if (!value.get()) | |
| 492 continue; | |
| 493 | |
| 494 // It is possible that we may receive a change to a preference we do not | 478 // It is possible that we may receive a change to a preference we do not |
| 495 // want to sync. For example if the user is syncing a Mac client and a | 479 // want to sync. For example if the user is syncing a Mac client and a |
| 496 // Windows client, the Windows client does not support | 480 // Windows client, the Windows client does not support |
| 497 // kConfirmToQuitEnabled. Ignore updates from these preferences. | 481 // kConfirmToQuitEnabled. Ignore updates from these preferences. |
| 498 const char* pref_name = name.c_str(); | 482 const char* pref_name = name.c_str(); |
| 499 std::string new_name; | 483 std::string new_name; |
| 500 // We migrated this preference name, so do as if the name had not changed. | 484 // We migrated this preference name, so do as if the name had not changed. |
| 501 if (IsOldMigratedPreference(pref_name)) { | 485 if (IsOldMigratedPreference(pref_name)) { |
| 502 new_name = GetNewMigratedPreferenceName(pref_name); | 486 new_name = GetNewMigratedPreferenceName(pref_name); |
| 503 pref_name = new_name.c_str(); | 487 pref_name = new_name.c_str(); |
| 504 } | 488 } |
| 505 | 489 |
| 506 if (!IsPrefRegistered(pref_name)) | 490 if (!IsPrefRegistered(pref_name)) |
| 507 continue; | 491 continue; |
| 508 | 492 |
| 509 const PrefService::Preference* pref = | 493 if (iter->change_type() == syncer::SyncChange::ACTION_DELETE) { |
| 510 pref_service_->FindPreference(pref_name); | 494 pref_service_->ClearPref(pref_name); |
| 511 DCHECK(pref); | 495 continue; |
| 496 } |
| 497 |
| 498 scoped_ptr<base::Value> value(ReadPreferenceSpecifics(pref_specifics)); |
| 499 if (!value.get()) { |
| 500 // Skip values we can't deserialize. |
| 501 // TODO(zea): consider taking some further action such as erasing the bad |
| 502 // data. |
| 503 continue; |
| 504 } |
| 512 | 505 |
| 513 // This will only modify the user controlled value store, which takes | 506 // This will only modify the user controlled value store, which takes |
| 514 // priority over the default value but is ignored if the preference is | 507 // priority over the default value but is ignored if the preference is |
| 515 // policy controlled. | 508 // policy controlled. |
| 516 pref_service_->Set(pref_name, *value); | 509 pref_service_->Set(pref_name, *value); |
| 517 | 510 |
| 518 NotifySyncedPrefObservers(name, true /*from_sync*/); | 511 NotifySyncedPrefObservers(name, true /*from_sync*/); |
| 519 | 512 |
| 520 // Keep track of any newly synced preferences. | 513 // Keep track of any newly synced preferences. |
| 521 if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { | 514 if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { |
| 522 synced_preferences_.insert(name); | 515 synced_preferences_.insert(name); |
| 523 } | 516 } |
| 524 } | 517 } |
| 525 return syncer::SyncError(); | 518 return syncer::SyncError(); |
| 526 } | 519 } |
| 527 | 520 |
| 528 base::Value* PrefModelAssociator::ReadPreferenceSpecifics( | 521 base::Value* PrefModelAssociator::ReadPreferenceSpecifics( |
| 529 const sync_pb::PreferenceSpecifics& preference, | 522 const sync_pb::PreferenceSpecifics& preference) { |
| 530 std::string* name) { | |
| 531 base::JSONReader reader; | 523 base::JSONReader reader; |
| 532 scoped_ptr<base::Value> value(reader.ReadToValue(preference.value())); | 524 scoped_ptr<base::Value> value(reader.ReadToValue(preference.value())); |
| 533 if (!value.get()) { | 525 if (!value.get()) { |
| 534 std::string err = "Failed to deserialize preference value: " + | 526 std::string err = "Failed to deserialize preference value: " + |
| 535 reader.GetErrorMessage(); | 527 reader.GetErrorMessage(); |
| 536 LOG(ERROR) << err; | 528 LOG(ERROR) << err; |
| 537 return NULL; | 529 return NULL; |
| 538 } | 530 } |
| 539 *name = preference.name(); | |
| 540 return value.release(); | 531 return value.release(); |
| 541 } | 532 } |
| 542 | 533 |
| 543 bool PrefModelAssociator::IsPrefSynced(const std::string& name) const { | 534 bool PrefModelAssociator::IsPrefSynced(const std::string& name) const { |
| 544 return synced_preferences_.find(name) != synced_preferences_.end(); | 535 return synced_preferences_.find(name) != synced_preferences_.end(); |
| 545 } | 536 } |
| 546 | 537 |
| 547 void PrefModelAssociator::AddSyncedPrefObserver(const std::string& name, | 538 void PrefModelAssociator::AddSyncedPrefObserver(const std::string& name, |
| 548 SyncedPrefObserver* observer) { | 539 SyncedPrefObserver* observer) { |
| 549 SyncedPrefObserverList* observers = synced_pref_observers_[name]; | 540 SyncedPrefObserverList* observers = synced_pref_observers_[name]; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 void PrefModelAssociator::NotifySyncedPrefObservers(const std::string& path, | 646 void PrefModelAssociator::NotifySyncedPrefObservers(const std::string& path, |
| 656 bool from_sync) const { | 647 bool from_sync) const { |
| 657 SyncedPrefObserverMap::const_iterator observer_iter = | 648 SyncedPrefObserverMap::const_iterator observer_iter = |
| 658 synced_pref_observers_.find(path); | 649 synced_pref_observers_.find(path); |
| 659 if (observer_iter == synced_pref_observers_.end()) | 650 if (observer_iter == synced_pref_observers_.end()) |
| 660 return; | 651 return; |
| 661 SyncedPrefObserverList* observers = observer_iter->second; | 652 SyncedPrefObserverList* observers = observer_iter->second; |
| 662 FOR_EACH_OBSERVER(SyncedPrefObserver, *observers, | 653 FOR_EACH_OBSERVER(SyncedPrefObserver, *observers, |
| 663 OnSyncedPrefChanged(path, from_sync)); | 654 OnSyncedPrefChanged(path, from_sync)); |
| 664 } | 655 } |
| OLD | NEW |