Index: components/bookmarks/browser/bookmark_model.cc |
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc |
index 5709533dba2d0be60f7f29ded432599ba10be75a..91f14dc785a508d65d6b452c0efc936c61e6b5e9 100644 |
--- a/components/bookmarks/browser/bookmark_model.cc |
+++ b/components/bookmarks/browser/bookmark_model.cc |
@@ -1,4 +1,4 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
+// RemvCopyright 2014 The Chromium Authors. All rights reserved. |
sky
2015/10/02 15:40:30
fix
jianli
2015/10/06 22:08:24
Done.
|
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -104,7 +104,8 @@ BookmarkModel::BookmarkModel(BookmarkClient* client) |
observers_( |
base::ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), |
loaded_signal_(true, false), |
- extensive_changes_(0) { |
+ extensive_changes_(0), |
+ undoable_remove_enabled_(false) { |
DCHECK(client_); |
} |
@@ -117,6 +118,8 @@ BookmarkModel::~BookmarkModel() { |
// so that it doesn't try and invoke a method back on us again. |
store_->BookmarkModelDeleted(); |
} |
+ |
+ DiscardAllUndoableRemovedNodes(); |
} |
void BookmarkModel::Shutdown() { |
@@ -469,6 +472,45 @@ void BookmarkModel::OnFaviconsChanged(const std::set<GURL>& page_urls, |
} |
} |
+void BookmarkModel::EnableUndoableRemove() { |
+ undoable_remove_enabled_ = true; |
+} |
+ |
+void BookmarkModel::DisableUndoableRemove() { |
+ DiscardAllUndoableRemovedNodes(); |
+ undoable_remove_enabled_ = false; |
+} |
+ |
+void BookmarkModel::UndoRemove(int64_t node_id) { |
+ DCHECK(undoable_remove_enabled_); |
+ auto iter = undoable_deleted_nodes_.find(node_id); |
+ if (iter == undoable_deleted_nodes_.end()) |
+ return; |
+ // If the parent node cannot be found, no need to track the deleted node. |
+ const BookmarkNode* parent = GetBookmarkNodeByID( |
+ this, iter->second.parent_node_id); |
+ if (parent) |
+ AddNode(AsMutable(parent), iter->second.index, iter->second.node); |
+ undoable_deleted_nodes_.erase(iter); |
+} |
+ |
+void BookmarkModel::DiscardUndoableRemovedNode(int64_t node_id) { |
+ DCHECK(undoable_remove_enabled_); |
+ auto iter = undoable_deleted_nodes_.find(node_id); |
+ if (iter == undoable_deleted_nodes_.end()) |
+ return; |
+ delete iter->second.node; |
+ undoable_deleted_nodes_.erase(iter); |
+} |
+ |
+void BookmarkModel::DiscardAllUndoableRemovedNodes() { |
+ for (auto iter = undoable_deleted_nodes_.begin(); |
+ iter != undoable_deleted_nodes_.end(); ++iter) { |
+ delete iter->second.node; |
+ } |
+ undoable_deleted_nodes_.clear(); |
+} |
+ |
void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) { |
DCHECK(node && !is_permanent_node(node)); |
@@ -859,6 +901,15 @@ void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) { |
BookmarkModelObserver, |
observers_, |
BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls)); |
+ |
+ if (!undoable_remove_enabled_) |
+ return; |
+ int64_t node_id = node->id(); |
+ RestorableDeletedNodeInfo restore_info; |
+ restore_info.parent_node_id = parent->id(); |
+ restore_info.index = index; |
+ restore_info.node = node.release(); |
+ undoable_deleted_nodes_[node_id] = restore_info; |
} |
void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) { |