| 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..d734afe0d5a4ceed5856f38b596388a8af0e0a7c 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, nullptr, node, 0,
|
| + 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, nullptr, 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)));
|
| +}
|
|
|