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

Side by Side Diff: ui/views/controls/menu/menu_controller_unittest.cc

Issue 2876203003: Make shelf item can be dragged when context menu is opened.
Patch Set: Add widget observer for |owner_| in MenuHost. Created 3 years, 3 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
« no previous file with comments | « ui/views/controls/menu/menu_controller.cc ('k') | ui/views/controls/menu/menu_host.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ui/views/controls/menu/menu_controller.h" 5 #include "ui/views/controls/menu/menu_controller.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 } 147 }
148 } 148 }
149 149
150 int outstanding_touches() const { return outstanding_touches_; } 150 int outstanding_touches() const { return outstanding_touches_; }
151 151
152 private: 152 private:
153 int outstanding_touches_; 153 int outstanding_touches_;
154 DISALLOW_COPY_AND_ASSIGN(TestEventHandler); 154 DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
155 }; 155 };
156 156
157 // A test widget that counts gesture events.
158 class GestureTestWidget : public Widget {
159 public:
160 GestureTestWidget() : gesture_count_(0) {}
161
162 void OnGestureEvent(ui::GestureEvent* event) override { gesture_count_++; }
163
164 int gesture_count() const { return gesture_count_; }
165
166 private:
167 int gesture_count_;
168 DISALLOW_COPY_AND_ASSIGN(GestureTestWidget);
169 };
170
157 #if defined(USE_AURA) 171 #if defined(USE_AURA)
158 // A DragDropClient which does not trigger a nested run loop. Instead a 172 // A DragDropClient which does not trigger a nested run loop. Instead a
159 // callback is triggered during StartDragAndDrop in order to allow testing. 173 // callback is triggered during StartDragAndDrop in order to allow testing.
160 class TestDragDropClient : public aura::client::DragDropClient { 174 class TestDragDropClient : public aura::client::DragDropClient {
161 public: 175 public:
162 explicit TestDragDropClient(const base::Closure& callback) 176 explicit TestDragDropClient(const base::Closure& callback)
163 : start_drag_and_drop_callback_(callback), drag_in_progress_(false) {} 177 : start_drag_and_drop_callback_(callback), drag_in_progress_(false) {}
164 ~TestDragDropClient() override {} 178 ~TestDragDropClient() override {}
165 179
166 // aura::client::DragDropClient: 180 // aura::client::DragDropClient:
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 470
457 // Causes the |menu_controller_| to begin dragging. Use TestDragDropClient to 471 // Causes the |menu_controller_| to begin dragging. Use TestDragDropClient to
458 // avoid nesting message loops. 472 // avoid nesting message loops.
459 void StartDrag() { 473 void StartDrag() {
460 const gfx::Point location; 474 const gfx::Point location;
461 menu_controller_->state_.item = menu_item()->GetSubmenu()->GetMenuItemAt(0); 475 menu_controller_->state_.item = menu_item()->GetSubmenu()->GetMenuItemAt(0);
462 menu_controller_->StartDrag( 476 menu_controller_->StartDrag(
463 menu_item()->GetSubmenu()->GetMenuItemAt(0)->CreateSubmenu(), location); 477 menu_item()->GetSubmenu()->GetMenuItemAt(0)->CreateSubmenu(), location);
464 } 478 }
465 479
466 Widget* owner() { return owner_.get(); } 480 GestureTestWidget* owner() { return owner_.get(); }
467 ui::test::EventGenerator* event_generator() { return event_generator_.get(); } 481 ui::test::EventGenerator* event_generator() { return event_generator_.get(); }
468 TestMenuItemViewShown* menu_item() { return menu_item_.get(); } 482 TestMenuItemViewShown* menu_item() { return menu_item_.get(); }
469 TestMenuDelegate* menu_delegate() { return menu_delegate_.get(); } 483 TestMenuDelegate* menu_delegate() { return menu_delegate_.get(); }
470 TestMenuControllerDelegate* menu_controller_delegate() { 484 TestMenuControllerDelegate* menu_controller_delegate() {
471 return menu_controller_delegate_.get(); 485 return menu_controller_delegate_.get();
472 } 486 }
473 MenuController* menu_controller() { return menu_controller_; } 487 MenuController* menu_controller() { return menu_controller_; }
474 const MenuItemView* pending_state_item() const { 488 const MenuItemView* pending_state_item() const {
475 return menu_controller_->pending_state_.item; 489 return menu_controller_->pending_state_.item;
476 } 490 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 525
512 if (!owner_->IsClosed()) 526 if (!owner_->IsClosed())
513 owner_->RemoveObserver(menu_controller_); 527 owner_->RemoveObserver(menu_controller_);
514 528
515 menu_controller_->showing_ = false; 529 menu_controller_->showing_ = false;
516 menu_controller_->owner_ = nullptr; 530 menu_controller_->owner_ = nullptr;
517 delete menu_controller_; 531 delete menu_controller_;
518 menu_controller_ = nullptr; 532 menu_controller_ = nullptr;
519 } 533 }
520 534
535 int CountOwnerOnGestureEvent() { return owner_->gesture_count(); }
536
521 private: 537 private:
522 void Init() { 538 void Init() {
523 owner_.reset(new Widget); 539 owner_ = base::MakeUnique<GestureTestWidget>();
524 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 540 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
525 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 541 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
526 owner_->Init(params); 542 owner_->Init(params);
527 event_generator_.reset( 543 event_generator_.reset(
528 new ui::test::EventGenerator(owner_->GetNativeWindow())); 544 new ui::test::EventGenerator(owner_->GetNativeWindow()));
529 owner_->Show(); 545 owner_->Show();
530 546
531 SetupMenuItem(); 547 SetupMenuItem();
532 SetupMenuController(); 548 SetupMenuController();
533 } 549 }
(...skipping 14 matching lines...) Expand all
548 menu_controller_->owner_ = owner_.get(); 564 menu_controller_->owner_ = owner_.get();
549 menu_controller_->showing_ = true; 565 menu_controller_->showing_ = true;
550 menu_controller_->SetSelection( 566 menu_controller_->SetSelection(
551 menu_item_.get(), MenuController::SELECTION_UPDATE_IMMEDIATELY); 567 menu_item_.get(), MenuController::SELECTION_UPDATE_IMMEDIATELY);
552 menu_item_->SetController(menu_controller_); 568 menu_item_->SetController(menu_controller_);
553 } 569 }
554 570
555 // Not owned. 571 // Not owned.
556 DestructingTestViewsDelegate* test_views_delegate_; 572 DestructingTestViewsDelegate* test_views_delegate_;
557 573
558 std::unique_ptr<Widget> owner_; 574 std::unique_ptr<GestureTestWidget> owner_;
559 std::unique_ptr<ui::test::EventGenerator> event_generator_; 575 std::unique_ptr<ui::test::EventGenerator> event_generator_;
560 std::unique_ptr<TestMenuItemViewShown> menu_item_; 576 std::unique_ptr<TestMenuItemViewShown> menu_item_;
561 std::unique_ptr<TestMenuControllerDelegate> menu_controller_delegate_; 577 std::unique_ptr<TestMenuControllerDelegate> menu_controller_delegate_;
562 std::unique_ptr<TestMenuDelegate> menu_delegate_; 578 std::unique_ptr<TestMenuDelegate> menu_delegate_;
563 MenuController* menu_controller_; 579 MenuController* menu_controller_;
564 580
565 DISALLOW_COPY_AND_ASSIGN(MenuControllerTest); 581 DISALLOW_COPY_AND_ASSIGN(MenuControllerTest);
566 }; 582 };
567 583
568 #if defined(OS_LINUX) && defined(USE_X11) 584 #if defined(OS_LINUX) && defined(USE_X11)
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1093 // Nested run 1109 // Nested run
1094 controller->AddNestedDelegate(nested_delegate.get()); 1110 controller->AddNestedDelegate(nested_delegate.get());
1095 controller->Run(owner(), nullptr, menu_item(), gfx::Rect(), 1111 controller->Run(owner(), nullptr, menu_item(), gfx::Rect(),
1096 MENU_ANCHOR_TOPLEFT, false, false); 1112 MENU_ANCHOR_TOPLEFT, false, false);
1097 1113
1098 controller->CancelAll(); 1114 controller->CancelAll();
1099 EXPECT_EQ(1, delegate->on_menu_closed_called()); 1115 EXPECT_EQ(1, delegate->on_menu_closed_called());
1100 EXPECT_EQ(1, nested_delegate->on_menu_closed_called()); 1116 EXPECT_EQ(1, nested_delegate->on_menu_closed_called());
1101 } 1117 }
1102 1118
1119 #if !defined(OS_MACOSX)
1120 TEST_F(MenuControllerTest, PreserveGestureForOwner) {
1121 MenuController* controller = menu_controller();
1122 MenuItemView* item = menu_item();
1123 controller->Run(owner(), nullptr, item, gfx::Rect(),
1124 MENU_ANCHOR_FIXED_BOTTOMCENTER, false, false);
1125 SubmenuView* sub_menu = item->GetSubmenu();
1126 sub_menu->ShowAt(owner(), gfx::Rect(0, 0, 100, 100), true);
1127
1128 gfx::Point location(sub_menu->bounds().bottom_left().x(),
1129 sub_menu->bounds().bottom_left().y() + 10);
1130 ui::GestureEvent event(location.x(), location.y(), 0, ui::EventTimeForNow(),
1131 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
1132
1133 // Gesture events should not be forwarded if the flag is not set.
1134 EXPECT_EQ(CountOwnerOnGestureEvent(), 0);
1135 EXPECT_FALSE(controller->send_gesture_events_to_owner());
1136 controller->OnGestureEvent(sub_menu, &event);
1137 EXPECT_EQ(CountOwnerOnGestureEvent(), 0);
1138
1139 // The menu's owner should receive gestures triggered outside the menu.
1140 controller->set_send_gesture_events_to_owner(true);
1141 controller->OnGestureEvent(sub_menu, &event);
1142 EXPECT_EQ(CountOwnerOnGestureEvent(), 1);
1143
1144 ui::GestureEvent event2(location.x(), location.y(), 0, ui::EventTimeForNow(),
1145 ui::GestureEventDetails(ui::ET_GESTURE_END));
1146
1147 controller->OnGestureEvent(sub_menu, &event2);
1148 EXPECT_EQ(CountOwnerOnGestureEvent(), 2);
1149
1150 // ET_GESTURE_END resets the |send_gesture_events_to_owner_| flag, so futher
1151 // gesture events should not be sent to the owner.
1152 controller->OnGestureEvent(sub_menu, &event2);
1153 EXPECT_EQ(CountOwnerOnGestureEvent(), 2);
1154 }
1155 #endif // !defined(OS_MACOSX)
1156
1103 // Tests that a nested menu does not crash when trying to repost events that 1157 // Tests that a nested menu does not crash when trying to repost events that
1104 // occur outside of the bounds of the menu. Instead a proper shutdown should 1158 // occur outside of the bounds of the menu. Instead a proper shutdown should
1105 // occur. 1159 // occur.
1106 TEST_F(MenuControllerTest, AsynchronousRepostEvent) { 1160 TEST_F(MenuControllerTest, AsynchronousRepostEvent) {
1107 MenuController* controller = menu_controller(); 1161 MenuController* controller = menu_controller();
1108 TestMenuControllerDelegate* delegate = menu_controller_delegate(); 1162 TestMenuControllerDelegate* delegate = menu_controller_delegate();
1109 std::unique_ptr<TestMenuControllerDelegate> nested_delegate( 1163 std::unique_ptr<TestMenuControllerDelegate> nested_delegate(
1110 new TestMenuControllerDelegate()); 1164 new TestMenuControllerDelegate());
1111 1165
1112 controller->AddNestedDelegate(nested_delegate.get()); 1166 controller->AddNestedDelegate(nested_delegate.get());
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, release_location, 1503 ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, release_location,
1450 release_location, ui::EventTimeForNow(), 1504 release_location, ui::EventTimeForNow(),
1451 ui::EF_LEFT_MOUSE_BUTTON, 0); 1505 ui::EF_LEFT_MOUSE_BUTTON, 0);
1452 ProcessMouseReleased(sub_menu, release_event); 1506 ProcessMouseReleased(sub_menu, release_event);
1453 } 1507 }
1454 1508
1455 #endif // defined(USE_AURA) 1509 #endif // defined(USE_AURA)
1456 1510
1457 } // namespace test 1511 } // namespace test
1458 } // namespace views 1512 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/menu/menu_controller.cc ('k') | ui/views/controls/menu/menu_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698