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

Unified Diff: chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc

Issue 7720012: Moves ownership of MenuItemView to MenuRunner as well as responbility (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit test Created 9 years, 4 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: chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
index 2f5d002b4a0b5fcdd8a918a82815aeafa0613309..4a24db3cbf5db5c26225af237682d963b583d73a 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -4,7 +4,6 @@
#include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h"
-#include "base/stl_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/bookmarks/bookmark_node_data.h"
@@ -51,7 +50,6 @@ BookmarkMenuDelegate::BookmarkMenuDelegate(Profile* profile,
BookmarkMenuDelegate::~BookmarkMenuDelegate() {
profile_->GetBookmarkModel()->RemoveObserver(this);
- STLDeleteValues(&node_to_menu_map_);
}
void BookmarkMenuDelegate::Init(views::MenuDelegate* real_delegate,
@@ -313,9 +311,56 @@ void BookmarkMenuDelegate::WillRemoveBookmarks(
const std::vector<const BookmarkNode*>& bookmarks) {
DCHECK(!is_mutating_model_);
is_mutating_model_ = true;
- std::set<MenuItemView*> removed_menus;
- WillRemoveBookmarksImpl(bookmarks, &removed_menus);
- STLDeleteElements(&removed_menus);
+
+ // Remove the observer so that when the remove happens we don't prematurely
+ // cancel the menu. The observer ias added back in DidRemoveBookmarks.
+ profile_->GetBookmarkModel()->RemoveObserver(this);
+
+ // Remove the menu items.
+ std::set<MenuItemView*> changed_parent_menus;
+ for (std::vector<const BookmarkNode*>::const_iterator i = bookmarks.begin();
+ i != bookmarks.end(); ++i) {
+ NodeToMenuIDMap::iterator node_to_menu = node_to_menu_id_map_.find(*i);
+ if (node_to_menu != node_to_menu_id_map_.end()) {
+ MenuItemView* menu = GetMenuByID(node_to_menu->second);
+ DCHECK(menu); // If there an entry in node_to_menu_id_map_, there should
+ // be a menu.
+ DCHECK(menu->GetParentMenuItem());
+ changed_parent_menus.insert(menu->GetParentMenuItem());
+ menu->GetParentMenuItem()->RemoveMenuItemAt(
+ menu->parent()->GetIndexOf(menu));
+ node_to_menu_id_map_.erase(node_to_menu);
+ }
+ }
+
+ // All the bookmarks in |bookmarks| should have the same parent. It's possible
+ // to support different parents, but this would need to prune any nodes whose
+ // parent has been removed. As all nodes currently have the same parent, there
+ // is the DCHECK.
+ DCHECK(changed_parent_menus.size() <= 1);
+
+ for (std::set<MenuItemView*>::const_iterator i = changed_parent_menus.begin();
+ i != changed_parent_menus.end(); ++i) {
+ (*i)->ChildrenChanged();
+ }
+
+ // Remove any descendants of the removed nodes in node_to_menu_id_map_.
+ for (NodeToMenuIDMap::iterator i = node_to_menu_id_map_.begin();
+ i != node_to_menu_id_map_.end(); ) {
+ bool ancestor_removed = false;
+ for (std::vector<const BookmarkNode*>::const_iterator j = bookmarks.begin();
+ j != bookmarks.end(); ++j) {
+ if (i->first->HasAncestor(*j)) {
+ ancestor_removed = true;
+ break;
+ }
+ }
+ if (ancestor_removed) {
+ node_to_menu_id_map_.erase(i++);
+ } else {
+ ++i;
+ }
+ }
}
void BookmarkMenuDelegate::DidRemoveBookmarks() {
@@ -397,56 +442,3 @@ MenuItemView* BookmarkMenuDelegate::GetMenuByID(int id) {
return parent_menu_item_ ? parent_menu_item_->GetMenuItemByID(id) : NULL;
}
-
-void BookmarkMenuDelegate::WillRemoveBookmarksImpl(
- const std::vector<const BookmarkNode*>& bookmarks,
- std::set<views::MenuItemView*>* removed_menus) {
- // Remove the observer so that when the remove happens we don't prematurely
- // cancel the menu. The observer ias added back in DidRemoveBookmarks.
- profile_->GetBookmarkModel()->RemoveObserver(this);
-
- // Remove the menu items.
- std::set<MenuItemView*> changed_parent_menus;
- for (std::vector<const BookmarkNode*>::const_iterator i = bookmarks.begin();
- i != bookmarks.end(); ++i) {
- NodeToMenuIDMap::iterator node_to_menu = node_to_menu_id_map_.find(*i);
- if (node_to_menu != node_to_menu_id_map_.end()) {
- MenuItemView* menu = GetMenuByID(node_to_menu->second);
- DCHECK(menu); // If there an entry in node_to_menu_id_map_, there should
- // be a menu.
- removed_menus->insert(menu);
- changed_parent_menus.insert(menu->GetParentMenuItem());
- menu->parent()->RemoveChildView(menu);
- node_to_menu_id_map_.erase(node_to_menu);
- }
- }
-
- // All the bookmarks in |bookmarks| should have the same parent. It's possible
- // to support different parents, but this would need to prune any nodes whose
- // parent has been removed. As all nodes currently have the same parent, there
- // is the DCHECK.
- DCHECK(changed_parent_menus.size() <= 1);
-
- for (std::set<MenuItemView*>::const_iterator i = changed_parent_menus.begin();
- i != changed_parent_menus.end(); ++i) {
- (*i)->ChildrenChanged();
- }
-
- // Remove any descendants of the removed nodes in node_to_menu_id_map_.
- for (NodeToMenuIDMap::iterator i = node_to_menu_id_map_.begin();
- i != node_to_menu_id_map_.end(); ) {
- bool ancestor_removed = false;
- for (std::vector<const BookmarkNode*>::const_iterator j = bookmarks.begin();
- j != bookmarks.end(); ++j) {
- if (i->first->HasAncestor(*j)) {
- ancestor_removed = true;
- break;
- }
- }
- if (ancestor_removed) {
- node_to_menu_id_map_.erase(i++);
- } else {
- ++i;
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698