| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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/bookmark_change_processor.h" | 5 #include "chrome/browser/sync/glue/bookmark_change_processor.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <stack> | 8 #include <stack> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 } | 198 } |
| 199 } else { | 199 } else { |
| 200 int64 child_id = node.GetFirstChildId(); | 200 int64 child_id = node.GetFirstChildId(); |
| 201 if (child_id != syncer::kInvalidId) { | 201 if (child_id != syncer::kInvalidId) { |
| 202 dfs_sync_id_stack.push(child_id); | 202 dfs_sync_id_stack.push(child_id); |
| 203 } | 203 } |
| 204 } | 204 } |
| 205 } | 205 } |
| 206 } | 206 } |
| 207 | 207 |
| 208 void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model, | 208 void BookmarkChangeProcessor::CreateOrUpdateSyncNode(const BookmarkNode* node) { |
| 209 bool ids_reassigned) { | 209 const BookmarkNode* parent = node->parent(); |
| 210 NOTREACHED(); | 210 int index = node->parent()->GetIndexOf(node); |
| 211 } | |
| 212 | |
| 213 void BookmarkChangeProcessor::BookmarkModelBeingDeleted( | |
| 214 BookmarkModel* model) { | |
| 215 NOTREACHED(); | |
| 216 bookmark_model_ = NULL; | |
| 217 } | |
| 218 | |
| 219 void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model, | |
| 220 const BookmarkNode* parent, | |
| 221 int index) { | |
| 222 DCHECK(share_handle()); | |
| 223 | 211 |
| 224 int64 new_version = syncer::syncable::kInvalidTransactionVersion; | 212 int64 new_version = syncer::syncable::kInvalidTransactionVersion; |
| 225 int64 sync_id = syncer::kInvalidId; | 213 int64 sync_id = syncer::kInvalidId; |
| 226 { | 214 { |
| 227 // Acquire a scoped write lock via a transaction. | 215 // Acquire a scoped write lock via a transaction. |
| 228 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version); | 216 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version); |
| 229 sync_id = CreateSyncNode(parent, model, index, &trans, | 217 sync_id = model_associator_->GetSyncIdFromChromeId(node->id()); |
| 230 model_associator_, error_handler()); | 218 if (sync_id != syncer::kInvalidId) { |
| 219 UpdateSyncNode( |
| 220 node, bookmark_model_, &trans, model_associator_, error_handler()); |
| 221 } else { |
| 222 sync_id = CreateSyncNode(parent, |
| 223 bookmark_model_, |
| 224 index, |
| 225 &trans, |
| 226 model_associator_, |
| 227 error_handler()); |
| 228 } |
| 231 } | 229 } |
| 232 | 230 |
| 233 if (syncer::kInvalidId != sync_id) { | 231 if (syncer::kInvalidId != sync_id) { |
| 234 // Siblings of added node in sync DB will also be updated to reflect new | 232 // Siblings of added node in sync DB will also be updated to reflect new |
| 235 // PREV_ID/NEXT_ID and thus get a new version. But we only update version | 233 // PREV_ID/NEXT_ID and thus get a new version. But we only update version |
| 236 // of added node here. After switching to ordinals for positioning, | 234 // of added node here. After switching to ordinals for positioning, |
| 237 // PREV_ID/NEXT_ID will be deprecated and siblings will not be updated. | 235 // PREV_ID/NEXT_ID will be deprecated and siblings will not be updated. |
| 238 UpdateTransactionVersion( | 236 UpdateTransactionVersion( |
| 239 new_version, model, | 237 new_version, |
| 238 bookmark_model_, |
| 240 std::vector<const BookmarkNode*>(1, parent->GetChild(index))); | 239 std::vector<const BookmarkNode*>(1, parent->GetChild(index))); |
| 241 } | 240 } |
| 242 } | 241 } |
| 243 | 242 |
| 243 void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model, |
| 244 bool ids_reassigned) { |
| 245 NOTREACHED(); |
| 246 } |
| 247 |
| 248 void BookmarkChangeProcessor::BookmarkModelBeingDeleted(BookmarkModel* model) { |
| 249 NOTREACHED(); |
| 250 bookmark_model_ = NULL; |
| 251 } |
| 252 |
| 253 void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model, |
| 254 const BookmarkNode* parent, |
| 255 int index) { |
| 256 DCHECK(share_handle()); |
| 257 CreateOrUpdateSyncNode(parent->GetChild(index)); |
| 258 } |
| 259 |
| 244 // static | 260 // static |
| 245 int64 BookmarkChangeProcessor::CreateSyncNode(const BookmarkNode* parent, | 261 int64 BookmarkChangeProcessor::CreateSyncNode(const BookmarkNode* parent, |
| 246 BookmarkModel* model, int index, syncer::WriteTransaction* trans, | 262 BookmarkModel* model, int index, syncer::WriteTransaction* trans, |
| 247 BookmarkModelAssociator* associator, | 263 BookmarkModelAssociator* associator, |
| 248 DataTypeErrorHandler* error_handler) { | 264 DataTypeErrorHandler* error_handler) { |
| 249 const BookmarkNode* child = parent->GetChild(index); | 265 const BookmarkNode* child = parent->GetChild(index); |
| 250 DCHECK(child); | 266 DCHECK(child); |
| 251 | 267 |
| 252 // Create a WriteNode container to hold the new node. | 268 // Create a WriteNode container to hold the new node. |
| 253 syncer::WriteNode sync_child(trans); | 269 syncer::WriteNode sync_child(trans); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 283 RemoveAllSyncNodes(); | 299 RemoveAllSyncNodes(); |
| 284 } | 300 } |
| 285 | 301 |
| 286 void BookmarkChangeProcessor::BookmarkNodeChanged(BookmarkModel* model, | 302 void BookmarkChangeProcessor::BookmarkNodeChanged(BookmarkModel* model, |
| 287 const BookmarkNode* node) { | 303 const BookmarkNode* node) { |
| 288 // We shouldn't see changes to the top-level nodes. | 304 // We shouldn't see changes to the top-level nodes. |
| 289 if (model->is_permanent_node(node)) { | 305 if (model->is_permanent_node(node)) { |
| 290 NOTREACHED() << "Saw update to permanent node!"; | 306 NOTREACHED() << "Saw update to permanent node!"; |
| 291 return; | 307 return; |
| 292 } | 308 } |
| 309 CreateOrUpdateSyncNode(node); |
| 310 } |
| 293 | 311 |
| 294 int64 new_version = syncer::syncable::kInvalidTransactionVersion; | 312 // Static. |
| 295 { | 313 int64 BookmarkChangeProcessor::UpdateSyncNode( |
| 296 // Acquire a scoped write lock via a transaction. | 314 const BookmarkNode* node, |
| 297 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version); | 315 BookmarkModel* model, |
| 298 | 316 syncer::WriteTransaction* trans, |
| 299 // Lookup the sync node that's associated with |node|. | 317 BookmarkModelAssociator* associator, |
| 300 syncer::WriteNode sync_node(&trans); | 318 DataTypeErrorHandler* error_handler) { |
| 301 if (!model_associator_->InitSyncNodeFromChromeId(node->id(), &sync_node)) { | 319 // Lookup the sync node that's associated with |node|. |
| 302 // TODO(tim): Investigating bug 121587. | 320 syncer::WriteNode sync_node(trans); |
| 303 if (model_associator_->GetSyncIdFromChromeId(node->id()) == | 321 if (!associator->InitSyncNodeFromChromeId(node->id(), &sync_node)) { |
| 304 syncer::kInvalidId) { | 322 error_handler->OnSingleDatatypeUnrecoverableError( |
| 305 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | 323 FROM_HERE, "Could not load bookmark node on update."); |
| 306 "Bookmark id not found in model associator on BookmarkNodeChanged"); | 324 return syncer::kInvalidId; |
| 307 LOG(ERROR) << "Bad id."; | |
| 308 } else if (!sync_node.GetEntry()->good()) { | |
| 309 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 310 "Could not InitByIdLookup on BookmarkNodeChanged, good() failed"); | |
| 311 LOG(ERROR) << "Bad entry."; | |
| 312 } else if (sync_node.GetEntry()->GetIsDel()) { | |
| 313 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 314 "Could not InitByIdLookup on BookmarkNodeChanged, is_del true"); | |
| 315 LOG(ERROR) << "Deleted entry."; | |
| 316 } else { | |
| 317 syncer::Cryptographer* crypto = trans.GetCryptographer(); | |
| 318 syncer::ModelTypeSet encrypted_types(trans.GetEncryptedTypes()); | |
| 319 const sync_pb::EntitySpecifics& specifics = | |
| 320 sync_node.GetEntry()->GetSpecifics(); | |
| 321 CHECK(specifics.has_encrypted()); | |
| 322 const bool can_decrypt = crypto->CanDecrypt(specifics.encrypted()); | |
| 323 const bool agreement = encrypted_types.Has(syncer::BOOKMARKS); | |
| 324 if (!agreement && !can_decrypt) { | |
| 325 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 326 "Could not InitByIdLookup on BookmarkNodeChanged, " | |
| 327 " Cryptographer thinks bookmarks not encrypted, and CanDecrypt" | |
| 328 " failed."); | |
| 329 LOG(ERROR) << "Case 1."; | |
| 330 } else if (agreement && can_decrypt) { | |
| 331 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 332 "Could not InitByIdLookup on BookmarkNodeChanged, " | |
| 333 " Cryptographer thinks bookmarks are encrypted, and CanDecrypt" | |
| 334 " succeeded (?!), but DecryptIfNecessary failed."); | |
| 335 LOG(ERROR) << "Case 2."; | |
| 336 } else if (agreement) { | |
| 337 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 338 "Could not InitByIdLookup on BookmarkNodeChanged, " | |
| 339 " Cryptographer thinks bookmarks are encrypted, but CanDecrypt" | |
| 340 " failed."); | |
| 341 LOG(ERROR) << "Case 3."; | |
| 342 } else { | |
| 343 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, | |
| 344 "Could not InitByIdLookup on BookmarkNodeChanged, " | |
| 345 " Cryptographer thinks bookmarks not encrypted, but CanDecrypt" | |
| 346 " succeeded (super weird, btw)"); | |
| 347 LOG(ERROR) << "Case 4."; | |
| 348 } | |
| 349 } | |
| 350 return; | |
| 351 } | |
| 352 | |
| 353 UpdateSyncNodeProperties(node, model, &sync_node); | |
| 354 | |
| 355 DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder()); | |
| 356 DCHECK_EQ(model_associator_->GetChromeNodeFromSyncId( | |
| 357 sync_node.GetParentId()), | |
| 358 node->parent()); | |
| 359 DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex()); | |
| 360 } | 325 } |
| 361 | 326 UpdateSyncNodeProperties(node, model, &sync_node); |
| 362 UpdateTransactionVersion(new_version, model, | 327 DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder()); |
| 363 std::vector<const BookmarkNode*>(1, node)); | 328 DCHECK_EQ(associator->GetChromeNodeFromSyncId(sync_node.GetParentId()), |
| 329 node->parent()); |
| 330 DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex()); |
| 331 return sync_node.GetId(); |
| 364 } | 332 } |
| 365 | 333 |
| 366 void BookmarkChangeProcessor::BookmarkMetaInfoChanged( | 334 void BookmarkChangeProcessor::BookmarkMetaInfoChanged( |
| 367 BookmarkModel* model, const BookmarkNode* node) { | 335 BookmarkModel* model, const BookmarkNode* node) { |
| 368 BookmarkNodeChanged(model, node); | 336 BookmarkNodeChanged(model, node); |
| 369 } | 337 } |
| 370 | 338 |
| 371 void BookmarkChangeProcessor::BookmarkNodeMoved(BookmarkModel* model, | 339 void BookmarkChangeProcessor::BookmarkNodeMoved(BookmarkModel* model, |
| 372 const BookmarkNode* old_parent, int old_index, | 340 const BookmarkNode* old_parent, int old_index, |
| 373 const BookmarkNode* new_parent, int new_index) { | 341 const BookmarkNode* new_parent, int new_index) { |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 sync_pb::BookmarkSpecifics updated_specifics( | 836 sync_pb::BookmarkSpecifics updated_specifics( |
| 869 sync_node->GetBookmarkSpecifics()); | 837 sync_node->GetBookmarkSpecifics()); |
| 870 updated_specifics.set_favicon(favicon_bytes->front(), | 838 updated_specifics.set_favicon(favicon_bytes->front(), |
| 871 favicon_bytes->size()); | 839 favicon_bytes->size()); |
| 872 updated_specifics.set_icon_url(bookmark_node->icon_url().spec()); | 840 updated_specifics.set_icon_url(bookmark_node->icon_url().spec()); |
| 873 sync_node->SetBookmarkSpecifics(updated_specifics); | 841 sync_node->SetBookmarkSpecifics(updated_specifics); |
| 874 } | 842 } |
| 875 } | 843 } |
| 876 | 844 |
| 877 } // namespace browser_sync | 845 } // namespace browser_sync |
| OLD | NEW |