Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: chrome/browser/sync/glue/password_change_processor.cc

Issue 10152003: sync: Make BaseNode lookup-related Init functions return specific failures. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 DCHECK(expected_loop_ == MessageLoop::current()); 59 DCHECK(expected_loop_ == MessageLoop::current());
60 DCHECK(chrome::NOTIFICATION_LOGINS_CHANGED == type); 60 DCHECK(chrome::NOTIFICATION_LOGINS_CHANGED == type);
61 if (!observing_) 61 if (!observing_)
62 return; 62 return;
63 63
64 DCHECK(running()); 64 DCHECK(running());
65 65
66 sync_api::WriteTransaction trans(FROM_HERE, share_handle()); 66 sync_api::WriteTransaction trans(FROM_HERE, share_handle());
67 67
68 sync_api::ReadNode password_root(&trans); 68 sync_api::ReadNode password_root(&trans);
69 if (!password_root.InitByTagLookup(kPasswordTag)) { 69 if (password_root.InitByTagLookup(kPasswordTag) !=
70 sync_api::BaseNode::INIT_OK) {
70 error_handler()->OnUnrecoverableError(FROM_HERE, 71 error_handler()->OnUnrecoverableError(FROM_HERE,
71 "Server did not create the top-level password node. " 72 "Server did not create the top-level password node. "
72 "We might be running against an out-of-date server."); 73 "We might be running against an out-of-date server.");
73 return; 74 return;
74 } 75 }
75 76
76 PasswordStoreChangeList* changes = 77 PasswordStoreChangeList* changes =
77 content::Details<PasswordStoreChangeList>(details).ptr(); 78 content::Details<PasswordStoreChangeList>(details).ptr();
78 for (PasswordStoreChangeList::iterator change = changes->begin(); 79 for (PasswordStoreChangeList::iterator change = changes->begin();
79 change != changes->end(); ++change) { 80 change != changes->end(); ++change) {
(...skipping 16 matching lines...) Expand all
96 // action was requested. If it did so, we wouldn't need to fall back 97 // 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 // to trying to update an existing password node here.
98 // 99 //
99 // TODO: Remove this. See crbug.com/87855. 100 // TODO: Remove this. See crbug.com/87855.
100 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); 101 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag);
101 if (sync_api::kInvalidId == sync_id) { 102 if (sync_api::kInvalidId == sync_id) {
102 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 103 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
103 "Unable to create or retrieve password node"); 104 "Unable to create or retrieve password node");
104 return; 105 return;
105 } 106 }
106 if (!sync_node.InitByIdLookup(sync_id)) { 107 if (sync_node.InitByIdLookup(sync_id) !=
108 sync_api::BaseNode::INIT_OK) {
107 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 109 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
108 "Unable to create or retrieve password node"); 110 "Unable to create or retrieve password node");
109 return; 111 return;
110 } 112 }
111 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node); 113 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node);
112 break; 114 break;
113 } 115 }
114 } 116 }
115 case PasswordStoreChange::UPDATE: { 117 case PasswordStoreChange::UPDATE: {
116 sync_api::WriteNode sync_node(&trans); 118 sync_api::WriteNode sync_node(&trans);
117 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); 119 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag);
118 if (sync_api::kInvalidId == sync_id) { 120 if (sync_api::kInvalidId == sync_id) {
119 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 121 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
120 "Unexpected notification for: "); 122 "Unexpected notification for: ");
121 return; 123 return;
122 } else { 124 } else {
123 if (!sync_node.InitByIdLookup(sync_id)) { 125 if (sync_node.InitByIdLookup(sync_id) !=
126 sync_api::BaseNode::INIT_OK) {
124 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 127 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
125 "Password node lookup failed."); 128 "Password node lookup failed.");
126 return; 129 return;
127 } 130 }
128 } 131 }
129 132
130 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node); 133 PasswordModelAssociator::WriteToSyncNode(change->form(), &sync_node);
131 break; 134 break;
132 } 135 }
133 case PasswordStoreChange::REMOVE: { 136 case PasswordStoreChange::REMOVE: {
134 sync_api::WriteNode sync_node(&trans); 137 sync_api::WriteNode sync_node(&trans);
135 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag); 138 int64 sync_id = model_associator_->GetSyncIdFromChromeId(tag);
136 if (sync_api::kInvalidId == sync_id) { 139 if (sync_api::kInvalidId == sync_id) {
137 // We've been asked to remove a password that we don't know about. 140 // We've been asked to remove a password that we don't know about.
138 // That's weird, but apparently we were already in the requested 141 // That's weird, but apparently we were already in the requested
139 // state, so it's not really an unrecoverable error. Just return. 142 // state, so it's not really an unrecoverable error. Just return.
140 LOG(WARNING) << "Trying to delete nonexistent password sync node!"; 143 LOG(WARNING) << "Trying to delete nonexistent password sync node!";
141 return; 144 return;
142 } else { 145 } else {
143 if (!sync_node.InitByIdLookup(sync_id)) { 146 if (sync_node.InitByIdLookup(sync_id) !=
147 sync_api::BaseNode::INIT_OK) {
144 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 148 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
145 "Password node lookup failed."); 149 "Password node lookup failed.");
146 return; 150 return;
147 } 151 }
148 model_associator_->Disassociate(sync_node.GetId()); 152 model_associator_->Disassociate(sync_node.GetId());
149 sync_node.Remove(); 153 sync_node.Remove();
150 } 154 }
151 break; 155 break;
152 } 156 }
153 } 157 }
154 } 158 }
155 } 159 }
156 160
157 void PasswordChangeProcessor::ApplyChangesFromSyncModel( 161 void PasswordChangeProcessor::ApplyChangesFromSyncModel(
158 const sync_api::BaseTransaction* trans, 162 const sync_api::BaseTransaction* trans,
159 const sync_api::ImmutableChangeRecordList& changes) { 163 const sync_api::ImmutableChangeRecordList& changes) {
160 DCHECK(expected_loop_ == MessageLoop::current()); 164 DCHECK(expected_loop_ == MessageLoop::current());
161 if (!running()) 165 if (!running())
162 return; 166 return;
163 167
164 sync_api::ReadNode password_root(trans); 168 sync_api::ReadNode password_root(trans);
165 if (!password_root.InitByTagLookup(kPasswordTag)) { 169 if (password_root.InitByTagLookup(kPasswordTag) !=
170 sync_api::BaseNode::INIT_OK) {
166 error_handler()->OnUnrecoverableError(FROM_HERE, 171 error_handler()->OnUnrecoverableError(FROM_HERE,
167 "Password root node lookup failed."); 172 "Password root node lookup failed.");
168 return; 173 return;
169 } 174 }
170 175
171 DCHECK(deleted_passwords_.empty() && new_passwords_.empty() && 176 DCHECK(deleted_passwords_.empty() && new_passwords_.empty() &&
172 updated_passwords_.empty()); 177 updated_passwords_.empty());
173 178
174 for (sync_api::ChangeRecordList::const_iterator it = 179 for (sync_api::ChangeRecordList::const_iterator it =
175 changes.Get().begin(); it != changes.Get().end(); ++it) { 180 changes.Get().begin(); it != changes.Get().end(); ++it) {
176 if (sync_api::ChangeRecord::ACTION_DELETE == 181 if (sync_api::ChangeRecord::ACTION_DELETE ==
177 it->action) { 182 it->action) {
178 DCHECK(it->specifics.has_password()) 183 DCHECK(it->specifics.has_password())
179 << "Password specifics data not present on delete!"; 184 << "Password specifics data not present on delete!";
180 DCHECK(it->extra.get()); 185 DCHECK(it->extra.get());
181 sync_api::ExtraPasswordChangeRecordData* extra = 186 sync_api::ExtraPasswordChangeRecordData* extra =
182 it->extra.get(); 187 it->extra.get();
183 const sync_pb::PasswordSpecificsData& password = extra->unencrypted(); 188 const sync_pb::PasswordSpecificsData& password = extra->unencrypted();
184 webkit::forms::PasswordForm form; 189 webkit::forms::PasswordForm form;
185 PasswordModelAssociator::CopyPassword(password, &form); 190 PasswordModelAssociator::CopyPassword(password, &form);
186 deleted_passwords_.push_back(form); 191 deleted_passwords_.push_back(form);
187 model_associator_->Disassociate(it->id); 192 model_associator_->Disassociate(it->id);
188 continue; 193 continue;
189 } 194 }
190 195
191 sync_api::ReadNode sync_node(trans); 196 sync_api::ReadNode sync_node(trans);
192 if (!sync_node.InitByIdLookup(it->id)) { 197 if (sync_node.InitByIdLookup(it->id) != sync_api::BaseNode::INIT_OK) {
193 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 198 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
194 "Password node lookup failed."); 199 "Password node lookup failed.");
195 return; 200 return;
196 } 201 }
197 202
198 // Check that the changed node is a child of the passwords folder. 203 // Check that the changed node is a child of the passwords folder.
199 DCHECK_EQ(password_root.GetId(), sync_node.GetParentId()); 204 DCHECK_EQ(password_root.GetId(), sync_node.GetParentId());
200 DCHECK_EQ(syncable::PASSWORDS, sync_node.GetModelType()); 205 DCHECK_EQ(syncable::PASSWORDS, sync_node.GetModelType());
201 206
202 const sync_pb::PasswordSpecificsData& password_data = 207 const sync_pb::PasswordSpecificsData& password_data =
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 261
257 void PasswordChangeProcessor::StopObserving() { 262 void PasswordChangeProcessor::StopObserving() {
258 DCHECK(expected_loop_ == MessageLoop::current()); 263 DCHECK(expected_loop_ == MessageLoop::current());
259 notification_registrar_.Remove( 264 notification_registrar_.Remove(
260 this, 265 this,
261 chrome::NOTIFICATION_LOGINS_CHANGED, 266 chrome::NOTIFICATION_LOGINS_CHANGED,
262 content::Source<PasswordStore>(password_store_)); 267 content::Source<PasswordStore>(password_store_));
263 } 268 }
264 269
265 } // namespace browser_sync 270 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/model_associator.h ('k') | chrome/browser/sync/glue/password_model_associator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698