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

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

Issue 1550173002: Fix bug in not exiting menu when choosing 'delete' (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add test coverage Created 5 years 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_unittest.cc
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc
index df57570271826896794f224183cf2cab092dc84c..8112101d087787ab21065392b6bcb499add4c43c 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate_unittest.cc
@@ -37,20 +37,30 @@ class BookmarkMenuDelegateTest : public BrowserWithTestWindowTest {
}
void TearDown() override {
- if (bookmark_menu_delegate_.get()) {
- // Since we never show the menu we need to pass the MenuItemView to
- // MenuRunner so that the MenuItemView is destroyed.
- views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
- bookmark_menu_delegate_.reset();
- }
+ DestroyDelegate();
+
BrowserWithTestWindowTest::TearDown();
}
protected:
+ bool ShouldCloseOnRemove(const bookmarks::BookmarkNode* node) const {
+ return bookmark_menu_delegate_->ShouldCloseOnRemove(node);
+ }
+
+ // Destroys the delegate. Do this rather than directly deleting
+ // |bookmark_menu_delegate_| as otherwise the menu is leaked.
+ void DestroyDelegate() {
+ if (!bookmark_menu_delegate_.get())
+ return;
+
+ // Since we never show the menu we need to pass the MenuItemView to
+ // MenuRunner so that the MenuItemView is destroyed.
+ views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
+ bookmark_menu_delegate_.reset();
+ }
+
void NewDelegate() {
- // Destroy current menu if available, see comments in TearDown().
- if (bookmark_menu_delegate_.get())
- views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
+ DestroyDelegate();
bookmark_menu_delegate_.reset(
new BookmarkMenuDelegate(browser(), nullptr, nullptr));
@@ -187,3 +197,36 @@ TEST_F(BookmarkMenuDelegateTest, RemoveBookmarks) {
nodes_to_remove.clear();
bookmark_menu_delegate_->DidRemoveBookmarks();
}
+
+// Verifies WillRemoveBookmarks() doesn't attempt to access MenuItemViews that
+// have since been deleted.
+TEST_F(BookmarkMenuDelegateTest, CloseOnRemove) {
+ views::MenuDelegate test_delegate;
+ const BookmarkNode* node = model_->bookmark_bar_node()->GetChild(1);
+ NewDelegate();
+ bookmark_menu_delegate_->Init(&test_delegate, NULL, node, 0,
Devlin 2015/12/29 19:30:04 nit: nullptr
sky 2015/12/29 19:38:43 Done.
+ BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS,
+ BOOKMARK_LAUNCH_LOCATION_NONE);
+ // Any nodes on the bookmark bar should close on remove.
+ EXPECT_TRUE(ShouldCloseOnRemove(model_->bookmark_bar_node()->GetChild(2)));
+
+ // Descendants of the bookmark should not close on remove.
+ EXPECT_FALSE(ShouldCloseOnRemove(
+ model_->bookmark_bar_node()->GetChild(1)->GetChild(0)));
+
+ EXPECT_FALSE(ShouldCloseOnRemove(model_->other_node()->GetChild(0)));
+
+ // Make it so the other node only has one child.
+ // Destroy the current delegate so that it doesn't have any references to
+ // deleted nodes.
+ DestroyDelegate();
+ while (model_->other_node()->child_count() > 1)
+ model_->Remove(model_->other_node()->GetChild(1));
+
+ NewDelegate();
+ bookmark_menu_delegate_->Init(&test_delegate, NULL, node, 0,
+ BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS,
+ BOOKMARK_LAUNCH_LOCATION_NONE);
+ // Any nodes on the bookmark bar should close on remove.
+ EXPECT_TRUE(ShouldCloseOnRemove(model_->other_node()->GetChild(0)));
+}

Powered by Google App Engine
This is Rietveld 408576698