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

Side by Side 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 4 years, 11 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h" 5 #include "chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/bookmarks/bookmark_model_factory.h" 9 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
10 #include "chrome/browser/bookmarks/bookmark_stats.h" 10 #include "chrome/browser/bookmarks/bookmark_stats.h"
(...skipping 19 matching lines...) Expand all
30 30
31 profile()->CreateBookmarkModel(true); 31 profile()->CreateBookmarkModel(true);
32 32
33 model_ = BookmarkModelFactory::GetForProfile(profile()); 33 model_ = BookmarkModelFactory::GetForProfile(profile());
34 bookmarks::test::WaitForBookmarkModelToLoad(model_); 34 bookmarks::test::WaitForBookmarkModelToLoad(model_);
35 35
36 AddTestData(); 36 AddTestData();
37 } 37 }
38 38
39 void TearDown() override { 39 void TearDown() override {
40 if (bookmark_menu_delegate_.get()) { 40 DestroyDelegate();
41 // Since we never show the menu we need to pass the MenuItemView to 41
42 // MenuRunner so that the MenuItemView is destroyed.
43 views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
44 bookmark_menu_delegate_.reset();
45 }
46 BrowserWithTestWindowTest::TearDown(); 42 BrowserWithTestWindowTest::TearDown();
47 } 43 }
48 44
49 protected: 45 protected:
46 bool ShouldCloseOnRemove(const bookmarks::BookmarkNode* node) const {
47 return bookmark_menu_delegate_->ShouldCloseOnRemove(node);
48 }
49
50 // Destroys the delegate. Do this rather than directly deleting
51 // |bookmark_menu_delegate_| as otherwise the menu is leaked.
52 void DestroyDelegate() {
53 if (!bookmark_menu_delegate_.get())
54 return;
55
56 // Since we never show the menu we need to pass the MenuItemView to
57 // MenuRunner so that the MenuItemView is destroyed.
58 views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
59 bookmark_menu_delegate_.reset();
60 }
61
50 void NewDelegate() { 62 void NewDelegate() {
51 // Destroy current menu if available, see comments in TearDown(). 63 DestroyDelegate();
52 if (bookmark_menu_delegate_.get())
53 views::MenuRunner menu_runner(bookmark_menu_delegate_->menu(), 0);
54 64
55 bookmark_menu_delegate_.reset( 65 bookmark_menu_delegate_.reset(
56 new BookmarkMenuDelegate(browser(), nullptr, nullptr)); 66 new BookmarkMenuDelegate(browser(), nullptr, nullptr));
57 } 67 }
58 68
59 void NewAndInitDelegateForPermanent() { 69 void NewAndInitDelegateForPermanent() {
60 const BookmarkNode* node = model_->bookmark_bar_node(); 70 const BookmarkNode* node = model_->bookmark_bar_node();
61 NewDelegate(); 71 NewDelegate();
62 bookmark_menu_delegate_->Init(&test_delegate_, NULL, node, 0, 72 bookmark_menu_delegate_->Init(&test_delegate_, NULL, node, 0,
63 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS, 73 BookmarkMenuDelegate::SHOW_PERMANENT_FOLDERS,
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 bookmark_menu_delegate_->Init(&test_delegate, NULL, node, 0, 190 bookmark_menu_delegate_->Init(&test_delegate, NULL, node, 0,
181 BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS, 191 BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS,
182 BOOKMARK_LAUNCH_LOCATION_NONE); 192 BOOKMARK_LAUNCH_LOCATION_NONE);
183 LoadAllMenus(); 193 LoadAllMenus();
184 std::vector<const BookmarkNode*> nodes_to_remove; 194 std::vector<const BookmarkNode*> nodes_to_remove;
185 nodes_to_remove.push_back(node->GetChild(1)); 195 nodes_to_remove.push_back(node->GetChild(1));
186 bookmark_menu_delegate_->WillRemoveBookmarks(nodes_to_remove); 196 bookmark_menu_delegate_->WillRemoveBookmarks(nodes_to_remove);
187 nodes_to_remove.clear(); 197 nodes_to_remove.clear();
188 bookmark_menu_delegate_->DidRemoveBookmarks(); 198 bookmark_menu_delegate_->DidRemoveBookmarks();
189 } 199 }
200
201 // Verifies WillRemoveBookmarks() doesn't attempt to access MenuItemViews that
202 // have since been deleted.
203 TEST_F(BookmarkMenuDelegateTest, CloseOnRemove) {
204 views::MenuDelegate test_delegate;
205 const BookmarkNode* node = model_->bookmark_bar_node()->GetChild(1);
206 NewDelegate();
207 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.
208 BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS,
209 BOOKMARK_LAUNCH_LOCATION_NONE);
210 // Any nodes on the bookmark bar should close on remove.
211 EXPECT_TRUE(ShouldCloseOnRemove(model_->bookmark_bar_node()->GetChild(2)));
212
213 // Descendants of the bookmark should not close on remove.
214 EXPECT_FALSE(ShouldCloseOnRemove(
215 model_->bookmark_bar_node()->GetChild(1)->GetChild(0)));
216
217 EXPECT_FALSE(ShouldCloseOnRemove(model_->other_node()->GetChild(0)));
218
219 // Make it so the other node only has one child.
220 // Destroy the current delegate so that it doesn't have any references to
221 // deleted nodes.
222 DestroyDelegate();
223 while (model_->other_node()->child_count() > 1)
224 model_->Remove(model_->other_node()->GetChild(1));
225
226 NewDelegate();
227 bookmark_menu_delegate_->Init(&test_delegate, NULL, node, 0,
228 BookmarkMenuDelegate::HIDE_PERMANENT_FOLDERS,
229 BOOKMARK_LAUNCH_LOCATION_NONE);
230 // Any nodes on the bookmark bar should close on remove.
231 EXPECT_TRUE(ShouldCloseOnRemove(model_->other_node()->GetChild(0)));
232 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698