| 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 "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> |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 namespace sync_bookmarks { | 41 namespace sync_bookmarks { |
| 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 syncer::SyncClient* sync_client, | 46 syncer::SyncClient* sync_client, |
| 47 BookmarkModelAssociator* model_associator, | 47 BookmarkModelAssociator* model_associator, |
| 48 std::unique_ptr<syncer::DataTypeErrorHandler> err_handler) | 48 std::unique_ptr<syncer::DataTypeErrorHandler> err_handler) |
| 49 : syncer::ChangeProcessor(std::move(err_handler)), | 49 : syncer::ChangeProcessor(std::move(err_handler)), |
| 50 bookmark_model_(NULL), | 50 bookmark_model_(nullptr), |
| 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); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 } | 273 } |
| 274 } | 274 } |
| 275 | 275 |
| 276 void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model, | 276 void BookmarkChangeProcessor::BookmarkModelLoaded(BookmarkModel* model, |
| 277 bool ids_reassigned) { | 277 bool ids_reassigned) { |
| 278 NOTREACHED(); | 278 NOTREACHED(); |
| 279 } | 279 } |
| 280 | 280 |
| 281 void BookmarkChangeProcessor::BookmarkModelBeingDeleted(BookmarkModel* model) { | 281 void BookmarkChangeProcessor::BookmarkModelBeingDeleted(BookmarkModel* model) { |
| 282 NOTREACHED(); | 282 NOTREACHED(); |
| 283 bookmark_model_ = NULL; | 283 bookmark_model_ = nullptr; |
| 284 } | 284 } |
| 285 | 285 |
| 286 void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model, | 286 void BookmarkChangeProcessor::BookmarkNodeAdded(BookmarkModel* model, |
| 287 const BookmarkNode* parent, | 287 const BookmarkNode* parent, |
| 288 int index) { | 288 int index) { |
| 289 DCHECK(share_handle()); | 289 DCHECK(share_handle()); |
| 290 const BookmarkNode* node = parent->GetChild(index); | 290 const BookmarkNode* node = parent->GetChild(index); |
| 291 if (CanSyncNode(node)) | 291 if (CanSyncNode(node)) |
| 292 CreateOrUpdateSyncNode(node); | 292 CreateOrUpdateSyncNode(node); |
| 293 } | 293 } |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 syncer::WriteNode* dst, BookmarkModelAssociator* associator) { | 516 syncer::WriteNode* dst, BookmarkModelAssociator* associator) { |
| 517 syncer::ReadNode sync_parent(trans); | 517 syncer::ReadNode sync_parent(trans); |
| 518 if (!associator->InitSyncNodeFromChromeId(parent->id(), &sync_parent)) { | 518 if (!associator->InitSyncNodeFromChromeId(parent->id(), &sync_parent)) { |
| 519 LOG(WARNING) << "Parent lookup failed"; | 519 LOG(WARNING) << "Parent lookup failed"; |
| 520 return false; | 520 return false; |
| 521 } | 521 } |
| 522 | 522 |
| 523 bool success = false; | 523 bool success = false; |
| 524 if (index == 0) { | 524 if (index == 0) { |
| 525 // Insert into first position. | 525 // Insert into first position. |
| 526 success = (operation == CREATE) ? | 526 success = (operation == CREATE) |
| 527 dst->InitBookmarkByCreation(sync_parent, NULL) : | 527 ? dst->InitBookmarkByCreation(sync_parent, nullptr) |
| 528 dst->SetPosition(sync_parent, NULL); | 528 : dst->SetPosition(sync_parent, nullptr); |
| 529 if (success) { | 529 if (success) { |
| 530 DCHECK_EQ(dst->GetParentId(), sync_parent.GetId()); | 530 DCHECK_EQ(dst->GetParentId(), sync_parent.GetId()); |
| 531 DCHECK_EQ(dst->GetId(), sync_parent.GetFirstChildId()); | 531 DCHECK_EQ(dst->GetId(), sync_parent.GetFirstChildId()); |
| 532 DCHECK_EQ(dst->GetPredecessorId(), syncer::kInvalidId); | 532 DCHECK_EQ(dst->GetPredecessorId(), syncer::kInvalidId); |
| 533 } | 533 } |
| 534 } else { | 534 } else { |
| 535 // Find the bookmark model predecessor, and insert after it. | 535 // Find the bookmark model predecessor, and insert after it. |
| 536 const BookmarkNode* prev = parent->GetChild(index - 1); | 536 const BookmarkNode* prev = parent->GetChild(index - 1); |
| 537 syncer::ReadNode sync_prev(trans); | 537 syncer::ReadNode sync_prev(trans); |
| 538 if (!associator->InitSyncNodeFromChromeId(prev->id(), &sync_prev)) { | 538 if (!associator->InitSyncNodeFromChromeId(prev->id(), &sync_prev)) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 sync_client_->GetBookmarkUndoServiceIfExists()); | 587 sync_client_->GetBookmarkUndoServiceIfExists()); |
| 588 | 588 |
| 589 // Notify UI intensive observers of BookmarkModel that we are about to make | 589 // Notify UI intensive observers of BookmarkModel that we are about to make |
| 590 // potentially significant changes to it, so the updates may be batched. For | 590 // potentially significant changes to it, so the updates may be batched. For |
| 591 // example, on Mac, the bookmarks bar displays animations when bookmark items | 591 // example, on Mac, the bookmarks bar displays animations when bookmark items |
| 592 // are added or deleted. | 592 // are added or deleted. |
| 593 model->BeginExtensiveChanges(); | 593 model->BeginExtensiveChanges(); |
| 594 | 594 |
| 595 // A parent to hold nodes temporarily orphaned by parent deletion. It is | 595 // A parent to hold nodes temporarily orphaned by parent deletion. It is |
| 596 // created only if it is needed. | 596 // created only if it is needed. |
| 597 const BookmarkNode* foster_parent = NULL; | 597 const BookmarkNode* foster_parent = nullptr; |
| 598 | 598 |
| 599 // Iterate over the deletions, which are always at the front of the list. | 599 // Iterate over the deletions, which are always at the front of the list. |
| 600 ChangeRecordList::const_iterator it; | 600 ChangeRecordList::const_iterator it; |
| 601 for (it = changes.Get().begin(); | 601 for (it = changes.Get().begin(); |
| 602 it != changes.Get().end() && it->action == ChangeRecord::ACTION_DELETE; | 602 it != changes.Get().end() && it->action == ChangeRecord::ACTION_DELETE; |
| 603 ++it) { | 603 ++it) { |
| 604 const BookmarkNode* dst = | 604 const BookmarkNode* dst = |
| 605 model_associator_->GetChromeNodeFromSyncId(it->id); | 605 model_associator_->GetChromeNodeFromSyncId(it->id); |
| 606 | 606 |
| 607 // Ignore changes to the permanent top-level nodes. We only care about | 607 // Ignore changes to the permanent top-level nodes. We only care about |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 660 model_associator_->GetChromeNodeFromSyncId(it->id); | 660 model_associator_->GetChromeNodeFromSyncId(it->id); |
| 661 | 661 |
| 662 // Ignore changes to the permanent top-level nodes. We only care about | 662 // Ignore changes to the permanent top-level nodes. We only care about |
| 663 // their children. | 663 // their children. |
| 664 if (model->is_permanent_node(dst)) | 664 if (model->is_permanent_node(dst)) |
| 665 continue; | 665 continue; |
| 666 | 666 |
| 667 // Because the Synced Bookmarks node can be created server side, it's | 667 // Because the Synced Bookmarks node can be created server side, it's |
| 668 // possible it'll arrive at the client as an update. In that case it won't | 668 // possible it'll arrive at the client as an update. In that case it won't |
| 669 // have been associated at startup, the GetChromeNodeFromSyncId call above | 669 // have been associated at startup, the GetChromeNodeFromSyncId call above |
| 670 // will return NULL, and we won't detect it as a permanent node, resulting | 670 // will return null, and we won't detect it as a permanent node, resulting |
| 671 // in us trying to create it here (which will fail). Therefore, we add | 671 // in us trying to create it here (which will fail). Therefore, we add |
| 672 // special logic here just to detect the Synced Bookmarks folder. | 672 // special logic here just to detect the Synced Bookmarks folder. |
| 673 if (synced_bookmarks_id != syncer::kInvalidId && | 673 if (synced_bookmarks_id != syncer::kInvalidId && |
| 674 it->id == synced_bookmarks_id) { | 674 it->id == synced_bookmarks_id) { |
| 675 // This is a newly created Synced Bookmarks node. Associate it. | 675 // This is a newly created Synced Bookmarks node. Associate it. |
| 676 model_associator_->Associate(model->mobile_node(), synced_bookmarks); | 676 model_associator_->Associate(model->mobile_node(), synced_bookmarks); |
| 677 continue; | 677 continue; |
| 678 } | 678 } |
| 679 | 679 |
| 680 DCHECK_NE(it->action, ChangeRecord::ACTION_DELETE) | 680 DCHECK_NE(it->action, ChangeRecord::ACTION_DELETE) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 to_reposition.begin(); it != to_reposition.end(); ++it) { | 734 to_reposition.begin(); it != to_reposition.end(); ++it) { |
| 735 const BookmarkNode* parent = it->second->parent(); | 735 const BookmarkNode* parent = it->second->parent(); |
| 736 model->Move(it->second, parent, it->first); | 736 model->Move(it->second, parent, it->first); |
| 737 } | 737 } |
| 738 | 738 |
| 739 // Clean up the temporary node. | 739 // Clean up the temporary node. |
| 740 if (foster_parent) { | 740 if (foster_parent) { |
| 741 // There should be no nodes left under the foster parent. | 741 // There should be no nodes left under the foster parent. |
| 742 DCHECK_EQ(foster_parent->child_count(), 0); | 742 DCHECK_EQ(foster_parent->child_count(), 0); |
| 743 model->Remove(foster_parent); | 743 model->Remove(foster_parent); |
| 744 foster_parent = NULL; | 744 foster_parent = nullptr; |
| 745 } | 745 } |
| 746 | 746 |
| 747 // Notify UI intensive observers of BookmarkModel that all updates have been | 747 // Notify UI intensive observers of BookmarkModel that all updates have been |
| 748 // applied, and that they may now be consumed. This prevents issues like the | 748 // applied, and that they may now be consumed. This prevents issues like the |
| 749 // one described in crbug.com/281562, where old and new items on the bookmarks | 749 // one described in crbug.com/281562, where old and new items on the bookmarks |
| 750 // bar would overlap. | 750 // bar would overlap. |
| 751 model->EndExtensiveChanges(); | 751 model->EndExtensiveChanges(); |
| 752 | 752 |
| 753 // We are now ready to hear about bookmarks changes again. | 753 // We are now ready to hear about bookmarks changes again. |
| 754 model->AddObserver(this); | 754 model->AddObserver(this); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 954 favicon_base::FAVICON, | 954 favicon_base::FAVICON, |
| 955 bitmap_data, | 955 bitmap_data, |
| 956 pixel_size); | 956 pixel_size); |
| 957 } | 957 } |
| 958 | 958 |
| 959 // static | 959 // static |
| 960 void BookmarkChangeProcessor::SetSyncNodeFavicon( | 960 void BookmarkChangeProcessor::SetSyncNodeFavicon( |
| 961 const BookmarkNode* bookmark_node, | 961 const BookmarkNode* bookmark_node, |
| 962 BookmarkModel* model, | 962 BookmarkModel* model, |
| 963 syncer::WriteNode* sync_node) { | 963 syncer::WriteNode* sync_node) { |
| 964 scoped_refptr<base::RefCountedMemory> favicon_bytes(NULL); | 964 scoped_refptr<base::RefCountedMemory> favicon_bytes(nullptr); |
| 965 EncodeFavicon(bookmark_node, model, &favicon_bytes); | 965 EncodeFavicon(bookmark_node, model, &favicon_bytes); |
| 966 if (favicon_bytes.get() && favicon_bytes->size()) { | 966 if (favicon_bytes.get() && favicon_bytes->size()) { |
| 967 sync_pb::BookmarkSpecifics updated_specifics( | 967 sync_pb::BookmarkSpecifics updated_specifics( |
| 968 sync_node->GetBookmarkSpecifics()); | 968 sync_node->GetBookmarkSpecifics()); |
| 969 updated_specifics.set_favicon(favicon_bytes->front(), | 969 updated_specifics.set_favicon(favicon_bytes->front(), |
| 970 favicon_bytes->size()); | 970 favicon_bytes->size()); |
| 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 sync_bookmarks | 980 } // namespace sync_bookmarks |
| OLD | NEW |