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

Side by Side Diff: chrome/browser/ui/views/menu_item_view_test.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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/automation/ui_controls.h" 5 #include "chrome/browser/automation/ui_controls.h"
6 #include "chrome/test/base/view_event_test_base.h" 6 #include "chrome/test/base/view_event_test_base.h"
7 #include "views/controls/button/menu_button.h" 7 #include "views/controls/button/menu_button.h"
8 #include "views/controls/menu/menu_controller.h" 8 #include "views/controls/menu/menu_controller.h"
9 #include "views/controls/menu/menu_item_view.h" 9 #include "views/controls/menu/menu_item_view.h"
10 #include "views/controls/menu/menu_runner.h"
10 #include "views/controls/menu/submenu_view.h" 11 #include "views/controls/menu/submenu_view.h"
11 #include "views/controls/menu/view_menu_delegate.h" 12 #include "views/controls/menu/view_menu_delegate.h"
12 #include "views/widget/root_view.h" 13 #include "views/widget/root_view.h"
13 #include "views/widget/widget.h" 14 #include "views/widget/widget.h"
14 15
15 // This is a convenience base class for all tests to provide some 16 // This is a convenience base class for all tests to provide some
16 // common functionality. It sets up a MenuButton and a MenuItemView 17 // common functionality. It sets up a MenuButton and a MenuItemView
17 // and clicks the MenuButton. 18 // and clicks the MenuButton.
18 // 19 //
19 // Subclasses should implement: 20 // Subclasses should implement:
20 // BuildMenu() populate the menu 21 // BuildMenu() populate the menu
21 // DoTestOnMessageLoop() initiate the test 22 // DoTestOnMessageLoop() initiate the test
22 // 23 //
23 // Subclasses can call: 24 // Subclasses can call:
24 // Click() to post a mouse click on a View 25 // Click() to post a mouse click on a View
25 // 26 //
26 // Although it should be possible to post a menu multiple times, 27 // Although it should be possible to post a menu multiple times,
27 // MenuItemView prevents repeated activation of a menu by clicks too 28 // MenuItemView prevents repeated activation of a menu by clicks too
28 // close in time. 29 // close in time.
29 class MenuItemViewTestBase : public ViewEventTestBase, 30 class MenuItemViewTestBase : public ViewEventTestBase,
30 public views::ViewMenuDelegate, 31 public views::ViewMenuDelegate,
31 public views::MenuDelegate { 32 public views::MenuDelegate {
32 public: 33 public:
33 MenuItemViewTestBase() : 34 MenuItemViewTestBase()
34 ViewEventTestBase(), 35 : ViewEventTestBase(),
35 button_(NULL), 36 button_(NULL),
36 menu_(NULL) { 37 menu_(NULL) {
37 } 38 }
38 39
39 virtual ~MenuItemViewTestBase() { 40 virtual ~MenuItemViewTestBase() {
40 } 41 }
41 42
42 // ViewEventTestBase implementation. 43 // ViewEventTestBase implementation.
43 44
44 virtual void SetUp() OVERRIDE { 45 virtual void SetUp() OVERRIDE {
45 button_ = new views::MenuButton(NULL, L"Menu Test", this, true); 46 button_ = new views::MenuButton(NULL, L"Menu Test", this, true);
46 menu_.reset(new views::MenuItemView(this)); 47 menu_ = new views::MenuItemView(this);
47 BuildMenu(menu_.get()); 48 BuildMenu(menu_);
49 menu_runner_.reset(new views::MenuRunner(menu_));
48 50
49 ViewEventTestBase::SetUp(); 51 ViewEventTestBase::SetUp();
50 } 52 }
51 53
52 virtual void TearDown() OVERRIDE { 54 virtual void TearDown() OVERRIDE {
53 menu_.reset(NULL); 55 menu_runner_.reset(NULL);
56 menu_ = NULL;
54 ViewEventTestBase::TearDown(); 57 ViewEventTestBase::TearDown();
55 } 58 }
56 59
57 virtual views::View* CreateContentsView() OVERRIDE { 60 virtual views::View* CreateContentsView() OVERRIDE {
58 return button_; 61 return button_;
59 } 62 }
60 63
61 virtual gfx::Size GetPreferredSize() OVERRIDE { 64 virtual gfx::Size GetPreferredSize() OVERRIDE {
62 return button_->GetPreferredSize(); 65 return button_->GetPreferredSize();
63 } 66 }
64 67
65 // views::ViewMenuDelegate implementation. 68 // views::ViewMenuDelegate implementation.
66 virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE { 69 virtual void RunMenu(views::View* source, const gfx::Point& pt) OVERRIDE {
67 gfx::Point screen_location; 70 gfx::Point screen_location;
68 views::View::ConvertPointToScreen(source, &screen_location); 71 views::View::ConvertPointToScreen(source, &screen_location);
69 gfx::Rect bounds(screen_location, source->size()); 72 gfx::Rect bounds(screen_location, source->size());
70 menu_->RunMenuAt( 73 ignore_result(menu_runner_->RunMenuAt(
71 source->GetWidget(), 74 source->GetWidget(),
72 button_, 75 button_,
73 bounds, 76 bounds,
74 views::MenuItemView::TOPLEFT, 77 views::MenuItemView::TOPLEFT,
75 true); 78 views::MenuRunner::HAS_MNEMONICS));
76 } 79 }
77 80
78 protected: 81 protected:
79 // Generate a mouse click on the specified view and post a new task. 82 // Generate a mouse click on the specified view and post a new task.
80 virtual void Click(views::View* view, Task* next) { 83 virtual void Click(views::View* view, Task* next) {
81 ui_controls::MoveMouseToCenterAndPress( 84 ui_controls::MoveMouseToCenterAndPress(
82 view, 85 view,
83 ui_controls::LEFT, 86 ui_controls::LEFT,
84 ui_controls::DOWN | ui_controls::UP, 87 ui_controls::DOWN | ui_controls::UP,
85 next); 88 next);
86 } 89 }
87 90
88 virtual void BuildMenu(views::MenuItemView* menu) { 91 virtual void BuildMenu(views::MenuItemView* menu) {
89 } 92 }
90 93
91 views::MenuButton* button_; 94 views::MenuButton* button_;
92 scoped_ptr<views::MenuItemView> menu_; 95 views::MenuItemView* menu_;
96 scoped_ptr<views::MenuRunner> menu_runner_;
93 }; 97 };
94 98
95 // Simple test for clicking a menu item. This template class clicks on an 99 // Simple test for clicking a menu item. This template class clicks on an
96 // item and checks that the returned id matches. The index of the item 100 // item and checks that the returned id matches. The index of the item
97 // is the template argument. 101 // is the template argument.
98 template<int INDEX> 102 template<int INDEX>
99 class MenuItemViewTestBasic : public MenuItemViewTestBase { 103 class MenuItemViewTestBasic : public MenuItemViewTestBase {
100 public: 104 public:
101 MenuItemViewTestBasic() : 105 MenuItemViewTestBasic() :
102 last_command_(0) { 106 last_command_(0) {
(...skipping 15 matching lines...) Expand all
118 menu->AppendMenuItemWithLabel(3, L"item 3"); 122 menu->AppendMenuItemWithLabel(3, L"item 3");
119 } 123 }
120 124
121 // ViewEventTestBase implementation 125 // ViewEventTestBase implementation
122 virtual void DoTestOnMessageLoop() OVERRIDE { 126 virtual void DoTestOnMessageLoop() OVERRIDE {
123 Click(button_, CreateEventTask(this, &MenuItemViewTestBasic::Step1)); 127 Click(button_, CreateEventTask(this, &MenuItemViewTestBasic::Step1));
124 } 128 }
125 129
126 // Click on item INDEX. 130 // Click on item INDEX.
127 void Step1() { 131 void Step1() {
128 ASSERT_TRUE(menu_.get()); 132 ASSERT_TRUE(menu_);
129 133
130 views::SubmenuView* submenu = menu_->GetSubmenu(); 134 views::SubmenuView* submenu = menu_->GetSubmenu();
131 ASSERT_TRUE(submenu); 135 ASSERT_TRUE(submenu);
132 ASSERT_TRUE(submenu->IsShowing()); 136 ASSERT_TRUE(submenu->IsShowing());
133 ASSERT_EQ(3, submenu->GetMenuItemCount()); 137 ASSERT_EQ(3, submenu->GetMenuItemCount());
134 138
135 // click an item and pass control to the next step 139 // click an item and pass control to the next step
136 views::MenuItemView* item = submenu->GetMenuItemAt(INDEX); 140 views::MenuItemView* item = submenu->GetMenuItemAt(INDEX);
137 ASSERT_TRUE(item); 141 ASSERT_TRUE(item);
138 Click(item, CreateEventTask(this, &MenuItemViewTestBasic::Step2)); 142 Click(item, CreateEventTask(this, &MenuItemViewTestBasic::Step2));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 menu->AppendMenuItemWithLabel(2, L"item 2"); 184 menu->AppendMenuItemWithLabel(2, L"item 2");
181 } 185 }
182 186
183 // ViewEventTestBase implementation 187 // ViewEventTestBase implementation
184 virtual void DoTestOnMessageLoop() OVERRIDE { 188 virtual void DoTestOnMessageLoop() OVERRIDE {
185 Click(button_, CreateEventTask(this, &MenuItemViewTestInsert::Step1)); 189 Click(button_, CreateEventTask(this, &MenuItemViewTestInsert::Step1));
186 } 190 }
187 191
188 // Insert item at INSERT_INDEX and click item at SELECT_INDEX. 192 // Insert item at INSERT_INDEX and click item at SELECT_INDEX.
189 void Step1() { 193 void Step1() {
190 ASSERT_TRUE(menu_.get()); 194 ASSERT_TRUE(menu_);
191 195
192 views::SubmenuView* submenu = menu_->GetSubmenu(); 196 views::SubmenuView* submenu = menu_->GetSubmenu();
193 ASSERT_TRUE(submenu); 197 ASSERT_TRUE(submenu);
194 ASSERT_TRUE(submenu->IsShowing()); 198 ASSERT_TRUE(submenu->IsShowing());
195 ASSERT_EQ(2, submenu->GetMenuItemCount()); 199 ASSERT_EQ(2, submenu->GetMenuItemCount());
196 200
197 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX, 1000, 201 inserted_item_ = menu_->AddMenuItemAt(INSERT_INDEX, 1000,
198 L"inserted item", SkBitmap(), 202 L"inserted item", SkBitmap(),
199 views::MenuItemView::NORMAL); 203 views::MenuItemView::NORMAL);
200 ASSERT_TRUE(inserted_item_); 204 ASSERT_TRUE(inserted_item_);
201 menu_->ChildrenChanged(); 205 menu_->ChildrenChanged();
202 206
203 // click an item and pass control to the next step 207 // click an item and pass control to the next step
204 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX); 208 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
205 ASSERT_TRUE(item); 209 ASSERT_TRUE(item);
206 Click(item, CreateEventTask(this, &MenuItemViewTestInsert::Step2)); 210 Click(item, CreateEventTask(this, &MenuItemViewTestInsert::Step2));
207 } 211 }
208 212
209 // Check clicked item and complete test. 213 // Check clicked item and complete test.
210 void Step2() { 214 void Step2() {
211 ASSERT_TRUE(menu_.get()); 215 ASSERT_TRUE(menu_);
212 216
213 views::SubmenuView* submenu = menu_->GetSubmenu(); 217 views::SubmenuView* submenu = menu_->GetSubmenu();
214 ASSERT_TRUE(submenu); 218 ASSERT_TRUE(submenu);
215 ASSERT_FALSE(submenu->IsShowing()); 219 ASSERT_FALSE(submenu->IsShowing());
216 ASSERT_EQ(3, submenu->GetMenuItemCount()); 220 ASSERT_EQ(3, submenu->GetMenuItemCount());
217 221
218 if (SELECT_INDEX == INSERT_INDEX) 222 if (SELECT_INDEX == INSERT_INDEX)
219 ASSERT_EQ(1000, last_command_); 223 ASSERT_EQ(1000, last_command_);
220 else if (SELECT_INDEX < INSERT_INDEX) 224 else if (SELECT_INDEX < INSERT_INDEX)
221 ASSERT_EQ(SELECT_INDEX + 1, last_command_); 225 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 // then inserts an item in the top-level menu at X. 315 // then inserts an item in the top-level menu at X.
312 typedef MenuItemViewTestInsertWithSubmenu<0> MenuItemViewTestInsertWithSubmenu0; 316 typedef MenuItemViewTestInsertWithSubmenu<0> MenuItemViewTestInsertWithSubmenu0;
313 typedef MenuItemViewTestInsertWithSubmenu<1> MenuItemViewTestInsertWithSubmenu1; 317 typedef MenuItemViewTestInsertWithSubmenu<1> MenuItemViewTestInsertWithSubmenu1;
314 VIEW_TEST(MenuItemViewTestInsertWithSubmenu0, InsertItemWithSubmenu0) 318 VIEW_TEST(MenuItemViewTestInsertWithSubmenu0, InsertItemWithSubmenu0)
315 VIEW_TEST(MenuItemViewTestInsertWithSubmenu1, InsertItemWithSubmenu1) 319 VIEW_TEST(MenuItemViewTestInsertWithSubmenu1, InsertItemWithSubmenu1)
316 320
317 // Test class for removing a menu item while the menu is open. 321 // Test class for removing a menu item while the menu is open.
318 template<int REMOVE_INDEX, int SELECT_INDEX> 322 template<int REMOVE_INDEX, int SELECT_INDEX>
319 class MenuItemViewTestRemove : public MenuItemViewTestBase { 323 class MenuItemViewTestRemove : public MenuItemViewTestBase {
320 public: 324 public:
321 MenuItemViewTestRemove() : 325 MenuItemViewTestRemove()
322 last_command_(0) { 326 : last_command_(0) {
323 } 327 }
324 328
325 virtual ~MenuItemViewTestRemove() { 329 virtual ~MenuItemViewTestRemove() {
326 } 330 }
327 331
328 // views::MenuDelegate implementation 332 // views::MenuDelegate implementation
329 virtual void ExecuteCommand(int id) OVERRIDE { 333 virtual void ExecuteCommand(int id) OVERRIDE {
330 last_command_ = id; 334 last_command_ = id;
331 } 335 }
332 336
333 // MenuItemViewTestBase implementation 337 // MenuItemViewTestBase implementation
334 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE { 338 virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
335 menu->AppendMenuItemWithLabel(1, L"item 1"); 339 menu->AppendMenuItemWithLabel(1, L"item 1");
336 menu->AppendMenuItemWithLabel(2, L"item 2"); 340 menu->AppendMenuItemWithLabel(2, L"item 2");
337 menu->AppendMenuItemWithLabel(3, L"item 3"); 341 menu->AppendMenuItemWithLabel(3, L"item 3");
338 } 342 }
339 343
340 // ViewEventTestBase implementation 344 // ViewEventTestBase implementation
341 virtual void DoTestOnMessageLoop() OVERRIDE { 345 virtual void DoTestOnMessageLoop() OVERRIDE {
342 Click(button_, CreateEventTask(this, &MenuItemViewTestRemove::Step1)); 346 Click(button_, CreateEventTask(this, &MenuItemViewTestRemove::Step1));
343 } 347 }
344 348
345 // Remove item at REMOVE_INDEX and click item at SELECT_INDEX. 349 // Remove item at REMOVE_INDEX and click item at SELECT_INDEX.
346 void Step1() { 350 void Step1() {
347 ASSERT_TRUE(menu_.get()); 351 ASSERT_TRUE(menu_);
348 352
349 views::SubmenuView* submenu = menu_->GetSubmenu(); 353 views::SubmenuView* submenu = menu_->GetSubmenu();
350 ASSERT_TRUE(submenu); 354 ASSERT_TRUE(submenu);
351 ASSERT_TRUE(submenu->IsShowing()); 355 ASSERT_TRUE(submenu->IsShowing());
352 ASSERT_EQ(3, submenu->GetMenuItemCount()); 356 ASSERT_EQ(3, submenu->GetMenuItemCount());
353 357
354 // remove 358 // remove
355 menu_->RemoveMenuItemAt(REMOVE_INDEX); 359 menu_->RemoveMenuItemAt(REMOVE_INDEX);
356 menu_->ChildrenChanged(); 360 menu_->ChildrenChanged();
357 361
358 // click 362 // click
359 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX); 363 views::MenuItemView* item = submenu->GetMenuItemAt(SELECT_INDEX);
360 ASSERT_TRUE(item); 364 ASSERT_TRUE(item);
361 Click(item, CreateEventTask(this, &MenuItemViewTestRemove::Step2)); 365 Click(item, CreateEventTask(this, &MenuItemViewTestRemove::Step2));
362 } 366 }
363 367
364 // Check clicked item and complete test. 368 // Check clicked item and complete test.
365 void Step2() { 369 void Step2() {
366 ASSERT_TRUE(menu_.get()); 370 ASSERT_TRUE(menu_);
367 371
368 views::SubmenuView* submenu = menu_->GetSubmenu(); 372 views::SubmenuView* submenu = menu_->GetSubmenu();
369 ASSERT_TRUE(submenu); 373 ASSERT_TRUE(submenu);
370 ASSERT_FALSE(submenu->IsShowing()); 374 ASSERT_FALSE(submenu->IsShowing());
371 ASSERT_EQ(2, submenu->GetMenuItemCount()); 375 ASSERT_EQ(2, submenu->GetMenuItemCount());
372 376
373 if (SELECT_INDEX < REMOVE_INDEX) 377 if (SELECT_INDEX < REMOVE_INDEX)
374 ASSERT_EQ(SELECT_INDEX + 1, last_command_); 378 ASSERT_EQ(SELECT_INDEX + 1, last_command_);
375 else 379 else
376 ASSERT_EQ(SELECT_INDEX + 2, last_command_); 380 ASSERT_EQ(SELECT_INDEX + 2, last_command_);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 } 425 }
422 426
423 // ViewEventTestBase implementation 427 // ViewEventTestBase implementation
424 virtual void DoTestOnMessageLoop() OVERRIDE { 428 virtual void DoTestOnMessageLoop() OVERRIDE {
425 Click(button_, 429 Click(button_,
426 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step1)); 430 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step1));
427 } 431 }
428 432
429 // Post submenu. 433 // Post submenu.
430 void Step1() { 434 void Step1() {
431 ASSERT_TRUE(menu_.get()); 435 ASSERT_TRUE(menu_);
432 436
433 views::SubmenuView* submenu = menu_->GetSubmenu(); 437 views::SubmenuView* submenu = menu_->GetSubmenu();
434 ASSERT_TRUE(submenu); 438 ASSERT_TRUE(submenu);
435 ASSERT_TRUE(submenu->IsShowing()); 439 ASSERT_TRUE(submenu->IsShowing());
436 440
437 Click(submenu_, 441 Click(submenu_,
438 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step2)); 442 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step2));
439 } 443 }
440 444
441 // Remove item at REMOVE_INDEX and select it to exit the menu loop. 445 // Remove item at REMOVE_INDEX and select it to exit the menu loop.
442 void Step2() { 446 void Step2() {
443 ASSERT_TRUE(menu_.get()); 447 ASSERT_TRUE(menu_);
444 448
445 views::SubmenuView* submenu = menu_->GetSubmenu(); 449 views::SubmenuView* submenu = menu_->GetSubmenu();
446 ASSERT_TRUE(submenu); 450 ASSERT_TRUE(submenu);
447 ASSERT_TRUE(submenu->IsShowing()); 451 ASSERT_TRUE(submenu->IsShowing());
448 ASSERT_EQ(2, submenu->GetMenuItemCount()); 452 ASSERT_EQ(2, submenu->GetMenuItemCount());
449 453
450 // remove 454 // remove
451 menu_->RemoveMenuItemAt(REMOVE_INDEX); 455 menu_->RemoveMenuItemAt(REMOVE_INDEX);
452 menu_->ChildrenChanged(); 456 menu_->ChildrenChanged();
453 457
454 // click 458 // click
455 Click(button_, 459 Click(button_,
456 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step3)); 460 CreateEventTask(this, &MenuItemViewTestRemoveWithSubmenu::Step3));
457 } 461 }
458 462
459 void Step3() { 463 void Step3() {
460 ASSERT_TRUE(menu_.get()); 464 ASSERT_TRUE(menu_);
461 465
462 views::SubmenuView* submenu = menu_->GetSubmenu(); 466 views::SubmenuView* submenu = menu_->GetSubmenu();
463 ASSERT_TRUE(submenu); 467 ASSERT_TRUE(submenu);
464 ASSERT_FALSE(submenu->IsShowing()); 468 ASSERT_FALSE(submenu->IsShowing());
465 ASSERT_EQ(1, submenu->GetMenuItemCount()); 469 ASSERT_EQ(1, submenu->GetMenuItemCount());
466 470
467 Done(); 471 Done();
468 } 472 }
469 473
470 private: 474 private:
471 int last_command_; 475 int last_command_;
472 views::MenuItemView* submenu_; 476 views::MenuItemView* submenu_;
473 }; 477 };
474 478
475 typedef MenuItemViewTestRemoveWithSubmenu<0> MenuItemViewTestRemoveWithSubmenu0; 479 typedef MenuItemViewTestRemoveWithSubmenu<0> MenuItemViewTestRemoveWithSubmenu0;
476 typedef MenuItemViewTestRemoveWithSubmenu<1> MenuItemViewTestRemoveWithSubmenu1; 480 typedef MenuItemViewTestRemoveWithSubmenu<1> MenuItemViewTestRemoveWithSubmenu1;
477 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu0, RemoveItemWithSubmenu0) 481 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu0, RemoveItemWithSubmenu0)
478 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu1, RemoveItemWithSubmenu1) 482 VIEW_TEST(MenuItemViewTestRemoveWithSubmenu1, RemoveItemWithSubmenu1)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698