| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |