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