OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/sync/glue/password_change_processor.h" | 5 #include "chrome/browser/sync/glue/password_change_processor.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 } | 74 } |
75 | 75 |
76 PasswordStoreChangeList* changes = | 76 PasswordStoreChangeList* changes = |
77 content::Details<PasswordStoreChangeList>(details).ptr(); | 77 content::Details<PasswordStoreChangeList>(details).ptr(); |
78 for (PasswordStoreChangeList::iterator change = changes->begin(); | 78 for (PasswordStoreChangeList::iterator change = changes->begin(); |
79 change != changes->end(); ++change) { | 79 change != changes->end(); ++change) { |
80 std::string tag = PasswordModelAssociator::MakeTag(change->form()); | 80 std::string tag = PasswordModelAssociator::MakeTag(change->form()); |
81 switch (change->type()) { | 81 switch (change->type()) { |
82 case PasswordStoreChange::ADD: { | 82 case PasswordStoreChange::ADD: { |
83 sync_api::WriteNode sync_node(&trans); | 83 sync_api::WriteNode sync_node(&trans); |
84 if (!sync_node.InitUniqueByCreation(syncable::PASSWORDS, | 84 if (sync_node.InitUniqueByCreation(syncable::PASSWORDS, |
85 password_root, tag)) { | 85 password_root, tag)) { |
86 error_handler()->OnUnrecoverableError(FROM_HERE, | 86 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node); |
87 "Failed to create password sync node."); | 87 model_associator_->Associate(&tag, sync_node.GetId()); |
88 return; | 88 break; |
| 89 } else { |
| 90 // Maybe this node already exists and we should update it. |
| 91 // |
| 92 // If the PasswordStore is told to add an entry but an entry with the |
| 93 // same name already exists, it will overwrite it. It will report |
| 94 // this change as an ADD rather than an UPDATE. Ideally, it would be |
| 95 // able to tell us what action was actually taken, rather than what |
| 96 // action was requested. If it did so, we wouldn't need to fall back |
| 97 // to trying to update an existing password node here. |
| 98 // |
| 99 // TODO: Remove this. See crbug.com/87855. |
| 100 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); |
| 101 if (sync_api::kInvalidId == sync_id) { |
| 102 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 103 "Unable to create or retrieve password node"); |
| 104 return; |
| 105 } |
| 106 if (!sync_node.InitByIdLookup(sync_id)) { |
| 107 error_handler()->OnUnrecoverableError(FROM_HERE, |
| 108 "Unable to create or retrieve password node"); |
| 109 return; |
| 110 } |
| 111 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node); |
| 112 break; |
89 } | 113 } |
90 | |
91 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node); | |
92 model_associator_->Associate(&tag, sync_node.GetId()); | |
93 break; | |
94 } | 114 } |
95 case PasswordStoreChange::UPDATE: { | 115 case PasswordStoreChange::UPDATE: { |
96 sync_api::WriteNode sync_node(&trans); | 116 sync_api::WriteNode sync_node(&trans); |
97 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); | 117 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); |
98 if (sync_api::kInvalidId == sync_id) { | 118 if (sync_api::kInvalidId == sync_id) { |
99 error_handler()->OnUnrecoverableError(FROM_HERE, | 119 error_handler()->OnUnrecoverableError(FROM_HERE, |
100 "Unexpected notification for: "); | 120 "Unexpected notification for: "); |
101 return; | 121 return; |
102 } else { | 122 } else { |
103 if (!sync_node.InitByIdLookup(sync_id)) { | 123 if (!sync_node.InitByIdLookup(sync_id)) { |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 253 |
234 void PasswordChangeProcessor::StopObserving() { | 254 void PasswordChangeProcessor::StopObserving() { |
235 DCHECK(expected_loop_ == MessageLoop::current()); | 255 DCHECK(expected_loop_ == MessageLoop::current()); |
236 notification_registrar_.Remove( | 256 notification_registrar_.Remove( |
237 this, | 257 this, |
238 chrome::NOTIFICATION_LOGINS_CHANGED, | 258 chrome::NOTIFICATION_LOGINS_CHANGED, |
239 content::Source<PasswordStore>(password_store_)); | 259 content::Source<PasswordStore>(password_store_)); |
240 } | 260 } |
241 | 261 |
242 } // namespace browser_sync | 262 } // namespace browser_sync |
OLD | NEW |