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

Side by Side Diff: components/sync_bookmarks/bookmark_change_processor.cc

Issue 2289143003: [Sync] Convert DTCs to be not RefCounted and NonThreadSafe. (Closed)
Patch Set: Rebase. Created 4 years, 3 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
OLDNEW
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 "components/sync_bookmarks/bookmark_change_processor.h" 5 #include "components/sync_bookmarks/bookmark_change_processor.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <stack> 10 #include <stack>
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <utility>
13 13
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/strings/string16.h" 15 #include "base/strings/string16.h"
16 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
18 #include "base/strings/utf_string_conversions.h" 18 #include "base/strings/utf_string_conversions.h"
19 #include "components/bookmarks/browser/bookmark_client.h" 19 #include "components/bookmarks/browser/bookmark_client.h"
20 #include "components/bookmarks/browser/bookmark_model.h" 20 #include "components/bookmarks/browser/bookmark_model.h"
21 #include "components/bookmarks/browser/bookmark_utils.h" 21 #include "components/bookmarks/browser/bookmark_utils.h"
22 #include "components/favicon/core/favicon_service.h" 22 #include "components/favicon/core/favicon_service.h"
(...skipping 15 matching lines...) Expand all
38 using syncer::ChangeRecord; 38 using syncer::ChangeRecord;
39 using syncer::ChangeRecordList; 39 using syncer::ChangeRecordList;
40 40
41 namespace browser_sync { 41 namespace browser_sync {
42 42
43 static const char kMobileBookmarksTag[] = "synced_bookmarks"; 43 static const char kMobileBookmarksTag[] = "synced_bookmarks";
44 44
45 BookmarkChangeProcessor::BookmarkChangeProcessor( 45 BookmarkChangeProcessor::BookmarkChangeProcessor(
46 sync_driver::SyncClient* sync_client, 46 sync_driver::SyncClient* sync_client,
47 BookmarkModelAssociator* model_associator, 47 BookmarkModelAssociator* model_associator,
48 syncer::DataTypeErrorHandler* error_handler) 48 std::unique_ptr<syncer::DataTypeErrorHandler> err_handler)
49 : sync_driver::ChangeProcessor(error_handler), 49 : sync_driver::ChangeProcessor(std::move(err_handler)),
50 bookmark_model_(NULL), 50 bookmark_model_(NULL),
51 sync_client_(sync_client), 51 sync_client_(sync_client),
52 model_associator_(model_associator) { 52 model_associator_(model_associator) {
53 DCHECK(model_associator); 53 DCHECK(model_associator);
54 DCHECK(sync_client); 54 DCHECK(sync_client);
55 DCHECK(error_handler); 55 DCHECK(error_handler());
56 } 56 }
57 57
58 BookmarkChangeProcessor::~BookmarkChangeProcessor() { 58 BookmarkChangeProcessor::~BookmarkChangeProcessor() {
59 if (bookmark_model_) 59 if (bookmark_model_)
60 bookmark_model_->RemoveObserver(this); 60 bookmark_model_->RemoveObserver(this);
61 } 61 }
62 62
63 void BookmarkChangeProcessor::StartImpl() { 63 void BookmarkChangeProcessor::StartImpl() {
64 DCHECK(thread_checker_.CalledOnValidThread()); 64 DCHECK(thread_checker_.CalledOnValidThread());
65 DCHECK(!bookmark_model_); 65 DCHECK(!bookmark_model_);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 int64_t new_version = syncer::syncable::kInvalidTransactionVersion; 129 int64_t new_version = syncer::syncable::kInvalidTransactionVersion;
130 { 130 {
131 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version); 131 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version);
132 syncer::WriteNode topmost_sync_node(&trans); 132 syncer::WriteNode topmost_sync_node(&trans);
133 if (!model_associator_->InitSyncNodeFromChromeId(topmost->id(), 133 if (!model_associator_->InitSyncNodeFromChromeId(topmost->id(),
134 &topmost_sync_node)) { 134 &topmost_sync_node)) {
135 syncer::SyncError error(FROM_HERE, 135 syncer::SyncError error(FROM_HERE,
136 syncer::SyncError::DATATYPE_ERROR, 136 syncer::SyncError::DATATYPE_ERROR,
137 "Failed to init sync node from chrome node", 137 "Failed to init sync node from chrome node",
138 syncer::BOOKMARKS); 138 syncer::BOOKMARKS);
139 error_handler()->OnSingleDataTypeUnrecoverableError(error); 139 error_handler()->OnUnrecoverableError(error);
140 return; 140 return;
141 } 141 }
142 RemoveSyncNodeHierarchy(&trans, &topmost_sync_node, model_associator_); 142 RemoveSyncNodeHierarchy(&trans, &topmost_sync_node, model_associator_);
143 } 143 }
144 144
145 // Don't need to update versions of deleted nodes. 145 // Don't need to update versions of deleted nodes.
146 UpdateTransactionVersion(new_version, bookmark_model_, 146 UpdateTransactionVersion(new_version, bookmark_model_,
147 std::vector<const BookmarkNode*>()); 147 std::vector<const BookmarkNode*>());
148 } 148 }
149 149
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 const BookmarkNode* child = parent->GetChild(index); 303 const BookmarkNode* child = parent->GetChild(index);
304 DCHECK(child); 304 DCHECK(child);
305 305
306 // Create a WriteNode container to hold the new node. 306 // Create a WriteNode container to hold the new node.
307 syncer::WriteNode sync_child(trans); 307 syncer::WriteNode sync_child(trans);
308 308
309 // Actually create the node with the appropriate initial position. 309 // Actually create the node with the appropriate initial position.
310 if (!PlaceSyncNode(CREATE, parent, index, trans, &sync_child, associator)) { 310 if (!PlaceSyncNode(CREATE, parent, index, trans, &sync_child, associator)) {
311 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR, 311 syncer::SyncError error(FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
312 "Failed to create sync node.", syncer::BOOKMARKS); 312 "Failed to create sync node.", syncer::BOOKMARKS);
313 error_handler->OnSingleDataTypeUnrecoverableError(error); 313 error_handler->OnUnrecoverableError(error);
314 return syncer::kInvalidId; 314 return syncer::kInvalidId;
315 } 315 }
316 316
317 UpdateSyncNodeProperties(child, model, &sync_child, error_handler); 317 UpdateSyncNodeProperties(child, model, &sync_child, error_handler);
318 318
319 // Associate the ID from the sync domain with the bookmark node, so that we 319 // Associate the ID from the sync domain with the bookmark node, so that we
320 // can refer back to this item later. 320 // can refer back to this item later.
321 associator->Associate(child, sync_child); 321 associator->Associate(child, sync_child);
322 322
323 return sync_child.GetId(); 323 return sync_child.GetId();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 syncer::WriteTransaction* trans, 367 syncer::WriteTransaction* trans,
368 BookmarkModelAssociator* associator, 368 BookmarkModelAssociator* associator,
369 syncer::DataTypeErrorHandler* error_handler) { 369 syncer::DataTypeErrorHandler* error_handler) {
370 // Lookup the sync node that's associated with |node|. 370 // Lookup the sync node that's associated with |node|.
371 syncer::WriteNode sync_node(trans); 371 syncer::WriteNode sync_node(trans);
372 if (!associator->InitSyncNodeFromChromeId(node->id(), &sync_node)) { 372 if (!associator->InitSyncNodeFromChromeId(node->id(), &sync_node)) {
373 syncer::SyncError error(FROM_HERE, 373 syncer::SyncError error(FROM_HERE,
374 syncer::SyncError::DATATYPE_ERROR, 374 syncer::SyncError::DATATYPE_ERROR,
375 "Failed to init sync node from chrome node", 375 "Failed to init sync node from chrome node",
376 syncer::BOOKMARKS); 376 syncer::BOOKMARKS);
377 error_handler->OnSingleDataTypeUnrecoverableError(error); 377 error_handler->OnUnrecoverableError(error);
378 return syncer::kInvalidId; 378 return syncer::kInvalidId;
379 } 379 }
380 UpdateSyncNodeProperties(node, model, &sync_node, error_handler); 380 UpdateSyncNodeProperties(node, model, &sync_node, error_handler);
381 DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder()); 381 DCHECK_EQ(sync_node.GetIsFolder(), node->is_folder());
382 DCHECK_EQ(associator->GetChromeNodeFromSyncId(sync_node.GetParentId()), 382 DCHECK_EQ(associator->GetChromeNodeFromSyncId(sync_node.GetParentId()),
383 node->parent()); 383 node->parent());
384 DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex()); 384 DCHECK_EQ(node->parent()->GetIndexOf(node), sync_node.GetPositionIndex());
385 return sync_node.GetId(); 385 return sync_node.GetId();
386 } 386 }
387 387
(...skipping 21 matching lines...) Expand all
409 // Acquire a scoped write lock via a transaction. 409 // Acquire a scoped write lock via a transaction.
410 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version); 410 syncer::WriteTransaction trans(FROM_HERE, share_handle(), &new_version);
411 411
412 // Lookup the sync node that's associated with |child|. 412 // Lookup the sync node that's associated with |child|.
413 syncer::WriteNode sync_node(&trans); 413 syncer::WriteNode sync_node(&trans);
414 if (!model_associator_->InitSyncNodeFromChromeId(child->id(), &sync_node)) { 414 if (!model_associator_->InitSyncNodeFromChromeId(child->id(), &sync_node)) {
415 syncer::SyncError error(FROM_HERE, 415 syncer::SyncError error(FROM_HERE,
416 syncer::SyncError::DATATYPE_ERROR, 416 syncer::SyncError::DATATYPE_ERROR,
417 "Failed to init sync node from chrome node", 417 "Failed to init sync node from chrome node",
418 syncer::BOOKMARKS); 418 syncer::BOOKMARKS);
419 error_handler()->OnSingleDataTypeUnrecoverableError(error); 419 error_handler()->OnUnrecoverableError(error);
420 return; 420 return;
421 } 421 }
422 422
423 if (!PlaceSyncNode(MOVE, new_parent, new_index, &trans, &sync_node, 423 if (!PlaceSyncNode(MOVE, new_parent, new_index, &trans, &sync_node,
424 model_associator_)) { 424 model_associator_)) {
425 syncer::SyncError error(FROM_HERE, 425 syncer::SyncError error(FROM_HERE,
426 syncer::SyncError::DATATYPE_ERROR, 426 syncer::SyncError::DATATYPE_ERROR,
427 "Failed to place sync node", 427 "Failed to place sync node",
428 syncer::BOOKMARKS); 428 syncer::BOOKMARKS);
429 error_handler()->OnSingleDataTypeUnrecoverableError(error); 429 error_handler()->OnUnrecoverableError(error);
430 return; 430 return;
431 } 431 }
432 } 432 }
433 433
434 UpdateTransactionVersion(new_version, model, 434 UpdateTransactionVersion(new_version, model,
435 std::vector<const BookmarkNode*>(1, child)); 435 std::vector<const BookmarkNode*>(1, child));
436 } 436 }
437 437
438 void BookmarkChangeProcessor::BookmarkNodeFaviconChanged( 438 void BookmarkChangeProcessor::BookmarkNodeFaviconChanged(
439 BookmarkModel* model, 439 BookmarkModel* model,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 const BookmarkNode* child = node->GetChild(i); 481 const BookmarkNode* child = node->GetChild(i);
482 children.push_back(child); 482 children.push_back(child);
483 483
484 syncer::WriteNode sync_child(&trans); 484 syncer::WriteNode sync_child(&trans);
485 if (!model_associator_->InitSyncNodeFromChromeId(child->id(), 485 if (!model_associator_->InitSyncNodeFromChromeId(child->id(),
486 &sync_child)) { 486 &sync_child)) {
487 syncer::SyncError error(FROM_HERE, 487 syncer::SyncError error(FROM_HERE,
488 syncer::SyncError::DATATYPE_ERROR, 488 syncer::SyncError::DATATYPE_ERROR,
489 "Failed to init sync node from chrome node", 489 "Failed to init sync node from chrome node",
490 syncer::BOOKMARKS); 490 syncer::BOOKMARKS);
491 error_handler()->OnSingleDataTypeUnrecoverableError(error); 491 error_handler()->OnUnrecoverableError(error);
492 return; 492 return;
493 } 493 }
494 DCHECK_EQ(sync_child.GetParentId(), 494 DCHECK_EQ(sync_child.GetParentId(),
495 model_associator_->GetSyncIdFromChromeId(node->id())); 495 model_associator_->GetSyncIdFromChromeId(node->id()));
496 496
497 if (!PlaceSyncNode(MOVE, node, i, &trans, &sync_child, 497 if (!PlaceSyncNode(MOVE, node, i, &trans, &sync_child,
498 model_associator_)) { 498 model_associator_)) {
499 syncer::SyncError error(FROM_HERE, 499 syncer::SyncError error(FROM_HERE,
500 syncer::SyncError::DATATYPE_ERROR, 500 syncer::SyncError::DATATYPE_ERROR,
501 "Failed to place sync node", 501 "Failed to place sync node",
502 syncer::BOOKMARKS); 502 syncer::BOOKMARKS);
503 error_handler()->OnSingleDataTypeUnrecoverableError(error); 503 error_handler()->OnUnrecoverableError(error);
504 return; 504 return;
505 } 505 }
506 } 506 }
507 } 507 }
508 508
509 // TODO(haitaol): Filter out children that didn't actually change. 509 // TODO(haitaol): Filter out children that didn't actually change.
510 UpdateTransactionVersion(new_version, model, children); 510 UpdateTransactionVersion(new_version, model, children);
511 } 511 }
512 512
513 // static 513 // static
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 if (!dst->empty()) { 618 if (!dst->empty()) {
619 if (!foster_parent) { 619 if (!foster_parent) {
620 foster_parent = model->AddFolder(model->other_node(), 620 foster_parent = model->AddFolder(model->other_node(),
621 model->other_node()->child_count(), 621 model->other_node()->child_count(),
622 base::string16()); 622 base::string16());
623 if (!foster_parent) { 623 if (!foster_parent) {
624 syncer::SyncError error(FROM_HERE, 624 syncer::SyncError error(FROM_HERE,
625 syncer::SyncError::DATATYPE_ERROR, 625 syncer::SyncError::DATATYPE_ERROR,
626 "Failed to create foster parent", 626 "Failed to create foster parent",
627 syncer::BOOKMARKS); 627 syncer::BOOKMARKS);
628 error_handler()->OnSingleDataTypeUnrecoverableError(error); 628 error_handler()->OnUnrecoverableError(error);
629 return; 629 return;
630 } 630 }
631 } 631 }
632 for (int i = dst->child_count() - 1; i >= 0; --i) { 632 for (int i = dst->child_count() - 1; i >= 0; --i) {
633 model->Move(dst->GetChild(i), foster_parent, 633 model->Move(dst->GetChild(i), foster_parent,
634 foster_parent->child_count()); 634 foster_parent->child_count());
635 } 635 }
636 } 636 }
637 DCHECK_EQ(dst->child_count(), 0) << "Node being deleted has children"; 637 DCHECK_EQ(dst->child_count(), 0) << "Node being deleted has children";
638 638
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 679
680 DCHECK_NE(it->action, ChangeRecord::ACTION_DELETE) 680 DCHECK_NE(it->action, ChangeRecord::ACTION_DELETE)
681 << "We should have passed all deletes by this point."; 681 << "We should have passed all deletes by this point.";
682 682
683 syncer::ReadNode src(trans); 683 syncer::ReadNode src(trans);
684 if (src.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) { 684 if (src.InitByIdLookup(it->id) != syncer::BaseNode::INIT_OK) {
685 syncer::SyncError error(FROM_HERE, 685 syncer::SyncError error(FROM_HERE,
686 syncer::SyncError::DATATYPE_ERROR, 686 syncer::SyncError::DATATYPE_ERROR,
687 "Failed to load sync node", 687 "Failed to load sync node",
688 syncer::BOOKMARKS); 688 syncer::BOOKMARKS);
689 error_handler()->OnSingleDataTypeUnrecoverableError(error); 689 error_handler()->OnUnrecoverableError(error);
690 return; 690 return;
691 } 691 }
692 692
693 const BookmarkNode* parent = 693 const BookmarkNode* parent =
694 model_associator_->GetChromeNodeFromSyncId(src.GetParentId()); 694 model_associator_->GetChromeNodeFromSyncId(src.GetParentId());
695 if (!parent) { 695 if (!parent) {
696 LOG(ERROR) << "Could not find parent of node being added/updated." 696 LOG(ERROR) << "Could not find parent of node being added/updated."
697 << " Node title: " << src.GetTitle() 697 << " Node title: " << src.GetTitle()
698 << ", parent id = " << src.GetParentId(); 698 << ", parent id = " << src.GetParentId();
699 continue; 699 continue;
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 updated_specifics.set_icon_url(bookmark_node->icon_url().spec()); 971 updated_specifics.set_icon_url(bookmark_node->icon_url().spec());
972 sync_node->SetBookmarkSpecifics(updated_specifics); 972 sync_node->SetBookmarkSpecifics(updated_specifics);
973 } 973 }
974 } 974 }
975 975
976 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) { 976 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) {
977 return bookmark_model_->client()->CanSyncNode(node); 977 return bookmark_model_->client()->CanSyncNode(node);
978 } 978 }
979 979
980 } // namespace browser_sync 980 } // namespace browser_sync
OLDNEW
« no previous file with comments | « components/sync_bookmarks/bookmark_change_processor.h ('k') | components/sync_bookmarks/bookmark_data_type_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698