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

Side by Side Diff: components/bookmarks/browser/bookmark_model.cc

Issue 1379983002: Supporting undoing bookmark deletion without creating new ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 2014 The Chromium Authors. All rights reserved. 1 // RemvCopyright 2014 The Chromium Authors. All rights reserved.
sky 2015/10/02 15:40:30 fix
jianli 2015/10/06 22:08:24 Done.
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/bookmarks/browser/bookmark_model.h" 5 #include "components/bookmarks/browser/bookmark_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <functional> 8 #include <functional>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 : client_(client), 97 : client_(client),
98 loaded_(false), 98 loaded_(false),
99 root_(GURL()), 99 root_(GURL()),
100 bookmark_bar_node_(NULL), 100 bookmark_bar_node_(NULL),
101 other_node_(NULL), 101 other_node_(NULL),
102 mobile_node_(NULL), 102 mobile_node_(NULL),
103 next_node_id_(1), 103 next_node_id_(1),
104 observers_( 104 observers_(
105 base::ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), 105 base::ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY),
106 loaded_signal_(true, false), 106 loaded_signal_(true, false),
107 extensive_changes_(0) { 107 extensive_changes_(0),
108 undoable_remove_enabled_(false) {
108 DCHECK(client_); 109 DCHECK(client_);
109 } 110 }
110 111
111 BookmarkModel::~BookmarkModel() { 112 BookmarkModel::~BookmarkModel() {
112 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 113 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
113 BookmarkModelBeingDeleted(this)); 114 BookmarkModelBeingDeleted(this));
114 115
115 if (store_.get()) { 116 if (store_.get()) {
116 // The store maintains a reference back to us. We need to tell it we're gone 117 // The store maintains a reference back to us. We need to tell it we're gone
117 // so that it doesn't try and invoke a method back on us again. 118 // so that it doesn't try and invoke a method back on us again.
118 store_->BookmarkModelDeleted(); 119 store_->BookmarkModelDeleted();
119 } 120 }
121
122 DiscardAllUndoableRemovedNodes();
120 } 123 }
121 124
122 void BookmarkModel::Shutdown() { 125 void BookmarkModel::Shutdown() {
123 if (loaded_) 126 if (loaded_)
124 return; 127 return;
125 128
126 // See comment in HistoryService::ShutdownOnUIThread where this is invoked for 129 // See comment in HistoryService::ShutdownOnUIThread where this is invoked for
127 // details. It is also called when the BookmarkModel is deleted. 130 // details. It is also called when the BookmarkModel is deleted.
128 loaded_signal_.Signal(); 131 loaded_signal_.Signal();
129 } 132 }
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 // Rerequest the favicon. 465 // Rerequest the favicon.
463 BookmarkNode* mutable_node = AsMutable(node); 466 BookmarkNode* mutable_node = AsMutable(node);
464 mutable_node->InvalidateFavicon(); 467 mutable_node->InvalidateFavicon();
465 CancelPendingFaviconLoadRequests(mutable_node); 468 CancelPendingFaviconLoadRequests(mutable_node);
466 FOR_EACH_OBSERVER(BookmarkModelObserver, 469 FOR_EACH_OBSERVER(BookmarkModelObserver,
467 observers_, 470 observers_,
468 BookmarkNodeFaviconChanged(this, node)); 471 BookmarkNodeFaviconChanged(this, node));
469 } 472 }
470 } 473 }
471 474
475 void BookmarkModel::EnableUndoableRemove() {
476 undoable_remove_enabled_ = true;
477 }
478
479 void BookmarkModel::DisableUndoableRemove() {
480 DiscardAllUndoableRemovedNodes();
481 undoable_remove_enabled_ = false;
482 }
483
484 void BookmarkModel::UndoRemove(int64_t node_id) {
485 DCHECK(undoable_remove_enabled_);
486 auto iter = undoable_deleted_nodes_.find(node_id);
487 if (iter == undoable_deleted_nodes_.end())
488 return;
489 // If the parent node cannot be found, no need to track the deleted node.
490 const BookmarkNode* parent = GetBookmarkNodeByID(
491 this, iter->second.parent_node_id);
492 if (parent)
493 AddNode(AsMutable(parent), iter->second.index, iter->second.node);
494 undoable_deleted_nodes_.erase(iter);
495 }
496
497 void BookmarkModel::DiscardUndoableRemovedNode(int64_t node_id) {
498 DCHECK(undoable_remove_enabled_);
499 auto iter = undoable_deleted_nodes_.find(node_id);
500 if (iter == undoable_deleted_nodes_.end())
501 return;
502 delete iter->second.node;
503 undoable_deleted_nodes_.erase(iter);
504 }
505
506 void BookmarkModel::DiscardAllUndoableRemovedNodes() {
507 for (auto iter = undoable_deleted_nodes_.begin();
508 iter != undoable_deleted_nodes_.end(); ++iter) {
509 delete iter->second.node;
510 }
511 undoable_deleted_nodes_.clear();
512 }
513
472 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) { 514 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) {
473 DCHECK(node && !is_permanent_node(node)); 515 DCHECK(node && !is_permanent_node(node));
474 516
475 if (node->date_added() == date_added) 517 if (node->date_added() == date_added)
476 return; 518 return;
477 519
478 AsMutable(node)->set_date_added(date_added); 520 AsMutable(node)->set_date_added(date_added);
479 521
480 // Syncing might result in dates newer than the folder's last modified date. 522 // Syncing might result in dates newer than the folder's last modified date.
481 if (date_added > node->parent()->date_folder_modified()) { 523 if (date_added > node->parent()->date_folder_modified()) {
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls); 894 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls);
853 } 895 }
854 896
855 if (store_.get()) 897 if (store_.get())
856 store_->ScheduleSave(); 898 store_->ScheduleSave();
857 899
858 FOR_EACH_OBSERVER( 900 FOR_EACH_OBSERVER(
859 BookmarkModelObserver, 901 BookmarkModelObserver,
860 observers_, 902 observers_,
861 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls)); 903 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls));
904
905 if (!undoable_remove_enabled_)
906 return;
907 int64_t node_id = node->id();
908 RestorableDeletedNodeInfo restore_info;
909 restore_info.parent_node_id = parent->id();
910 restore_info.index = index;
911 restore_info.node = node.release();
912 undoable_deleted_nodes_[node_id] = restore_info;
862 } 913 }
863 914
864 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) { 915 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) {
865 index_->Remove(node); 916 index_->Remove(node);
866 // NOTE: this is called in such a way that url_lock_ is already held. As 917 // NOTE: this is called in such a way that url_lock_ is already held. As
867 // such, this doesn't explicitly grab the lock. 918 // such, this doesn't explicitly grab the lock.
868 url_lock_.AssertAcquired(); 919 url_lock_.AssertAcquired();
869 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); 920 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node);
870 DCHECK(i != nodes_ordered_by_url_set_.end()); 921 DCHECK(i != nodes_ordered_by_url_set_.end());
871 // i points to the first node with the URL, advance until we find the 922 // i points to the first node with the URL, advance until we find the
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( 1093 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
1043 bb_node, 1094 bb_node,
1044 other_node, 1095 other_node,
1045 mobile_node, 1096 mobile_node,
1046 client_->GetLoadExtraNodesCallback(), 1097 client_->GetLoadExtraNodesCallback(),
1047 new BookmarkIndex(client_, accept_languages), 1098 new BookmarkIndex(client_, accept_languages),
1048 next_node_id_)); 1099 next_node_id_));
1049 } 1100 }
1050 1101
1051 } // namespace bookmarks 1102 } // namespace bookmarks
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698