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

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: Cleanup plus fixing build 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 // Copyright 2014 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/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"
(...skipping 86 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 undo_delegate_(nullptr) {
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.
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 } 199 }
199 200
200 void BookmarkModel::RemoveAllUserBookmarks() { 201 void BookmarkModel::RemoveAllUserBookmarks() {
201 std::set<GURL> removed_urls; 202 std::set<GURL> removed_urls;
202 ScopedVector<BookmarkNode> removed_nodes; 203 ScopedVector<BookmarkNode> removed_nodes;
203 204
204 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 205 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
205 OnWillRemoveAllUserBookmarks(this)); 206 OnWillRemoveAllUserBookmarks(this));
206 207
207 BeginExtensiveChanges(); 208 BeginExtensiveChanges();
209 BeginGroupedChanges();
208 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and 210 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and
209 // its immediate children. For removing all non permanent nodes just remove 211 // its immediate children. For removing all non permanent nodes just remove
210 // all children of non-root permanent nodes. 212 // all children of non-root permanent nodes.
211 { 213 {
212 base::AutoLock url_lock(url_lock_); 214 base::AutoLock url_lock(url_lock_);
213 for (int i = 0; i < root_.child_count(); ++i) { 215 for (int i = 0; i < root_.child_count(); ++i) {
214 BookmarkNode* permanent_node = root_.GetChild(i); 216 BookmarkNode* permanent_node = root_.GetChild(i);
215 217
216 if (!client_->CanBeEditedByUser(permanent_node)) 218 if (!client_->CanBeEditedByUser(permanent_node))
217 continue; 219 continue;
218 220
219 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { 221 for (int j = permanent_node->child_count() - 1; j >= 0; --j) {
220 BookmarkNode* child_node = permanent_node->GetChild(j); 222 BookmarkNode* child_node = permanent_node->GetChild(j);
221 removed_nodes.push_back(child_node);
222 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); 223 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls);
224 if (undo_delegate_) {
sky 2015/10/07 16:30:15 Simplify this so that there is always an UndoDeleg
jianli 2015/10/07 23:26:55 Done.
225 // The undo delegate will take the ownership.
226 undo_delegate_->OnBookmarkNodeDeleted(
sky 2015/10/07 16:30:15 Don't call out to the UndoDelegate while a lock is
jianli 2015/10/07 23:26:55 Done.
227 this, permanent_node->id(), j, child_node);
228 } else {
229 removed_nodes.push_back(child_node);
230 }
223 } 231 }
224 } 232 }
225 } 233 }
234 EndGroupedChanges();
226 EndExtensiveChanges(); 235 EndExtensiveChanges();
227 if (store_.get()) 236 if (store_.get())
228 store_->ScheduleSave(); 237 store_->ScheduleSave();
229 238
230 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 239 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
231 BookmarkAllUserNodesRemoved(this, removed_urls)); 240 BookmarkAllUserNodesRemoved(this, removed_urls));
232 } 241 }
233 242
234 void BookmarkModel::Move(const BookmarkNode* node, 243 void BookmarkModel::Move(const BookmarkNode* node,
235 const BookmarkNode* new_parent, 244 const BookmarkNode* new_parent,
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls); 861 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls);
853 } 862 }
854 863
855 if (store_.get()) 864 if (store_.get())
856 store_->ScheduleSave(); 865 store_->ScheduleSave();
857 866
858 FOR_EACH_OBSERVER( 867 FOR_EACH_OBSERVER(
859 BookmarkModelObserver, 868 BookmarkModelObserver,
860 observers_, 869 observers_,
861 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls)); 870 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls));
871
872 if (undo_delegate_) {
873 undo_delegate_->OnBookmarkNodeDeleted(
874 this, parent->id(), index, node.release());
875 }
862 } 876 }
863 877
864 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) { 878 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) {
865 index_->Remove(node); 879 index_->Remove(node);
866 // NOTE: this is called in such a way that url_lock_ is already held. As 880 // NOTE: this is called in such a way that url_lock_ is already held. As
867 // such, this doesn't explicitly grab the lock. 881 // such, this doesn't explicitly grab the lock.
868 url_lock_.AssertAcquired(); 882 url_lock_.AssertAcquired();
869 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); 883 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node);
870 DCHECK(i != nodes_ordered_by_url_set_.end()); 884 DCHECK(i != nodes_ordered_by_url_set_.end());
871 // i points to the first node with the URL, advance until we find the 885 // i points to the first node with the URL, advance until we find the
(...skipping 30 matching lines...) Expand all
902 } 916 }
903 917
904 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent, 918 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent,
905 int index, 919 int index,
906 BookmarkNode* node) { 920 BookmarkNode* node) {
907 parent->Add(node, index); 921 parent->Add(node, index);
908 922
909 if (store_.get()) 923 if (store_.get())
910 store_->ScheduleSave(); 924 store_->ScheduleSave();
911 925
912 if (node->type() == BookmarkNode::URL) { 926 {
913 base::AutoLock url_lock(url_lock_); 927 base::AutoLock url_lock(url_lock_);
914 AddNodeToInternalMaps(node); 928 AddNodeToInternalMaps(node);
915 } else {
916 index_->Add(node);
917 } 929 }
918 930
919 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 931 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
920 BookmarkNodeAdded(this, parent, index)); 932 BookmarkNodeAdded(this, parent, index));
921 933
922 return node; 934 return node;
923 } 935 }
924 936
925 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) { 937 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) {
926 index_->Add(node);
927 url_lock_.AssertAcquired(); 938 url_lock_.AssertAcquired();
928 nodes_ordered_by_url_set_.insert(node); 939 if (node->is_url()) {
940 index_->Add(node);
941 nodes_ordered_by_url_set_.insert(node);
942 }
943 for (int i = 0; i < node->child_count(); ++i)
944 AddNodeToInternalMaps(node->GetChild(i));
929 } 945 }
930 946
931 bool BookmarkModel::IsValidIndex(const BookmarkNode* parent, 947 bool BookmarkModel::IsValidIndex(const BookmarkNode* parent,
932 int index, 948 int index,
933 bool allow_end) { 949 bool allow_end) {
934 return (parent && parent->is_folder() && 950 return (parent && parent->is_folder() &&
935 (index >= 0 && (index < parent->child_count() || 951 (index >= 0 && (index < parent->child_count() ||
936 (allow_end && index == parent->child_count())))); 952 (allow_end && index == parent->child_count()))));
937 } 953 }
938 954
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( 1058 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
1043 bb_node, 1059 bb_node,
1044 other_node, 1060 other_node,
1045 mobile_node, 1061 mobile_node,
1046 client_->GetLoadExtraNodesCallback(), 1062 client_->GetLoadExtraNodesCallback(),
1047 new BookmarkIndex(client_, accept_languages), 1063 new BookmarkIndex(client_, accept_languages),
1048 next_node_id_)); 1064 next_node_id_));
1049 } 1065 }
1050 1066
1051 } // namespace bookmarks 1067 } // namespace bookmarks
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698