OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |