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

Unified 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, 3 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 side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698