Chromium Code Reviews| 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))); |
| +} |