Chromium Code Reviews| 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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 } | 146 } |
| 147 } | 147 } |
| 148 | 148 |
| 149 int outstanding_touches() const { return outstanding_touches_; } | 149 int outstanding_touches() const { return outstanding_touches_; } |
| 150 | 150 |
| 151 private: | 151 private: |
| 152 int outstanding_touches_; | 152 int outstanding_touches_; |
| 153 DISALLOW_COPY_AND_ASSIGN(TestEventHandler); | 153 DISALLOW_COPY_AND_ASSIGN(TestEventHandler); |
| 154 }; | 154 }; |
| 155 | 155 |
| 156 // A test widget that counts gesture events. | |
| 157 class GestureTestWidget : public Widget { | |
| 158 public: | |
| 159 GestureTestWidget() : gesture_count_(0) {} | |
| 160 | |
| 161 void OnGestureEvent(ui::GestureEvent* event) override { gesture_count_++; } | |
| 162 | |
| 163 int gesture_count() const { return gesture_count_; } | |
| 164 | |
| 165 private: | |
| 166 int gesture_count_; | |
| 167 DISALLOW_COPY_AND_ASSIGN(GestureTestWidget); | |
| 168 }; | |
| 169 | |
| 156 #if defined(USE_AURA) | 170 #if defined(USE_AURA) |
| 157 // A DragDropClient which does not trigger a nested run loop. Instead a | 171 // A DragDropClient which does not trigger a nested run loop. Instead a |
| 158 // callback is triggered during StartDragAndDrop in order to allow testing. | 172 // callback is triggered during StartDragAndDrop in order to allow testing. |
| 159 class TestDragDropClient : public aura::client::DragDropClient { | 173 class TestDragDropClient : public aura::client::DragDropClient { |
| 160 public: | 174 public: |
| 161 explicit TestDragDropClient(const base::Closure& callback) | 175 explicit TestDragDropClient(const base::Closure& callback) |
| 162 : start_drag_and_drop_callback_(callback), drag_in_progress_(false) {} | 176 : start_drag_and_drop_callback_(callback), drag_in_progress_(false) {} |
| 163 ~TestDragDropClient() override {} | 177 ~TestDragDropClient() override {} |
| 164 | 178 |
| 165 // aura::client::DragDropClient: | 179 // aura::client::DragDropClient: |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 451 | 465 |
| 452 // Causes the |menu_controller_| to begin dragging. Use TestDragDropClient to | 466 // Causes the |menu_controller_| to begin dragging. Use TestDragDropClient to |
| 453 // avoid nesting message loops. | 467 // avoid nesting message loops. |
| 454 void StartDrag() { | 468 void StartDrag() { |
| 455 const gfx::Point location; | 469 const gfx::Point location; |
| 456 menu_controller_->state_.item = menu_item()->GetSubmenu()->GetMenuItemAt(0); | 470 menu_controller_->state_.item = menu_item()->GetSubmenu()->GetMenuItemAt(0); |
| 457 menu_controller_->StartDrag( | 471 menu_controller_->StartDrag( |
| 458 menu_item()->GetSubmenu()->GetMenuItemAt(0)->CreateSubmenu(), location); | 472 menu_item()->GetSubmenu()->GetMenuItemAt(0)->CreateSubmenu(), location); |
| 459 } | 473 } |
| 460 | 474 |
| 461 Widget* owner() { return owner_.get(); } | 475 GestureTestWidget* owner() { return owner_.get(); } |
| 462 ui::test::EventGenerator* event_generator() { return event_generator_.get(); } | 476 ui::test::EventGenerator* event_generator() { return event_generator_.get(); } |
| 463 TestMenuItemViewShown* menu_item() { return menu_item_.get(); } | 477 TestMenuItemViewShown* menu_item() { return menu_item_.get(); } |
| 464 TestMenuDelegate* menu_delegate() { return menu_delegate_.get(); } | 478 TestMenuDelegate* menu_delegate() { return menu_delegate_.get(); } |
| 465 TestMenuControllerDelegate* menu_controller_delegate() { | 479 TestMenuControllerDelegate* menu_controller_delegate() { |
| 466 return menu_controller_delegate_.get(); | 480 return menu_controller_delegate_.get(); |
| 467 } | 481 } |
| 468 MenuController* menu_controller() { return menu_controller_; } | 482 MenuController* menu_controller() { return menu_controller_; } |
| 469 const MenuItemView* pending_state_item() const { | 483 const MenuItemView* pending_state_item() const { |
| 470 return menu_controller_->pending_state_.item; | 484 return menu_controller_->pending_state_.item; |
| 471 } | 485 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 | 522 |
| 509 if (!owner_->IsClosed()) | 523 if (!owner_->IsClosed()) |
| 510 owner_->RemoveObserver(menu_controller_); | 524 owner_->RemoveObserver(menu_controller_); |
| 511 | 525 |
| 512 menu_controller_->showing_ = false; | 526 menu_controller_->showing_ = false; |
| 513 menu_controller_->owner_ = nullptr; | 527 menu_controller_->owner_ = nullptr; |
| 514 delete menu_controller_; | 528 delete menu_controller_; |
| 515 menu_controller_ = nullptr; | 529 menu_controller_ = nullptr; |
| 516 } | 530 } |
| 517 | 531 |
| 532 int CountOwnerOnGestureEvent() { return owner_->gesture_count(); } | |
| 533 | |
| 518 private: | 534 private: |
| 519 void Init() { | 535 void Init() { |
| 520 owner_.reset(new Widget); | 536 owner_ = base::MakeUnique<GestureTestWidget>(); |
| 521 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); | 537 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); |
| 522 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 538 params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 523 owner_->Init(params); | 539 owner_->Init(params); |
| 524 event_generator_.reset( | 540 event_generator_.reset( |
| 525 new ui::test::EventGenerator(owner_->GetNativeWindow())); | 541 new ui::test::EventGenerator(owner_->GetNativeWindow())); |
| 526 owner_->Show(); | 542 owner_->Show(); |
| 527 | 543 |
| 528 SetupMenuItem(); | 544 SetupMenuItem(); |
| 529 SetupMenuController(); | 545 SetupMenuController(); |
| 530 } | 546 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 545 menu_controller_->owner_ = owner_.get(); | 561 menu_controller_->owner_ = owner_.get(); |
| 546 menu_controller_->showing_ = true; | 562 menu_controller_->showing_ = true; |
| 547 menu_controller_->SetSelection( | 563 menu_controller_->SetSelection( |
| 548 menu_item_.get(), MenuController::SELECTION_UPDATE_IMMEDIATELY); | 564 menu_item_.get(), MenuController::SELECTION_UPDATE_IMMEDIATELY); |
| 549 menu_item_->SetController(menu_controller_); | 565 menu_item_->SetController(menu_controller_); |
| 550 } | 566 } |
| 551 | 567 |
| 552 // Not owned. | 568 // Not owned. |
| 553 DestructingTestViewsDelegate* test_views_delegate_; | 569 DestructingTestViewsDelegate* test_views_delegate_; |
| 554 | 570 |
| 555 std::unique_ptr<Widget> owner_; | 571 std::unique_ptr<GestureTestWidget> owner_; |
| 556 std::unique_ptr<ui::test::EventGenerator> event_generator_; | 572 std::unique_ptr<ui::test::EventGenerator> event_generator_; |
| 557 std::unique_ptr<TestMenuItemViewShown> menu_item_; | 573 std::unique_ptr<TestMenuItemViewShown> menu_item_; |
| 558 std::unique_ptr<TestMenuControllerDelegate> menu_controller_delegate_; | 574 std::unique_ptr<TestMenuControllerDelegate> menu_controller_delegate_; |
| 559 std::unique_ptr<TestMenuDelegate> menu_delegate_; | 575 std::unique_ptr<TestMenuDelegate> menu_delegate_; |
| 560 MenuController* menu_controller_; | 576 MenuController* menu_controller_; |
| 561 | 577 |
| 562 DISALLOW_COPY_AND_ASSIGN(MenuControllerTest); | 578 DISALLOW_COPY_AND_ASSIGN(MenuControllerTest); |
| 563 }; | 579 }; |
| 564 | 580 |
| 565 #if defined(OS_LINUX) && defined(USE_X11) | 581 #if defined(OS_LINUX) && defined(USE_X11) |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1099 // Nested run | 1115 // Nested run |
| 1100 controller->AddNestedDelegate(nested_delegate.get()); | 1116 controller->AddNestedDelegate(nested_delegate.get()); |
| 1101 controller->Run(owner(), nullptr, menu_item(), gfx::Rect(), | 1117 controller->Run(owner(), nullptr, menu_item(), gfx::Rect(), |
| 1102 MENU_ANCHOR_TOPLEFT, false, false); | 1118 MENU_ANCHOR_TOPLEFT, false, false); |
| 1103 | 1119 |
| 1104 controller->CancelAll(); | 1120 controller->CancelAll(); |
| 1105 EXPECT_EQ(1, delegate->on_menu_closed_called()); | 1121 EXPECT_EQ(1, delegate->on_menu_closed_called()); |
| 1106 EXPECT_EQ(1, nested_delegate->on_menu_closed_called()); | 1122 EXPECT_EQ(1, nested_delegate->on_menu_closed_called()); |
| 1107 } | 1123 } |
| 1108 | 1124 |
| 1125 #if !defined(OS_MACOSX) | |
| 1126 TEST_F(MenuControllerTest, PreserveGestureForOwner) { | |
| 1127 MenuController* controller = menu_controller(); | |
| 1128 MenuItemView* item = menu_item(); | |
| 1129 controller->Run(owner(), nullptr, item, gfx::Rect(), | |
| 1130 MENU_ANCHOR_FIXED_BOTTOMCENTER, false, false); | |
| 1131 SubmenuView* sub_menu = item->GetSubmenu(); | |
| 1132 sub_menu->ShowAt(owner(), gfx::Rect(0, 0, 100, 100), true); | |
| 1133 | |
| 1134 gfx::Point location(sub_menu->bounds().bottom_left().x(), | |
| 1135 sub_menu->bounds().bottom_left().y() + 10); | |
| 1136 ui::GestureEvent event(location.x(), location.y(), 0, ui::EventTimeForNow(), | |
| 1137 ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN)); | |
| 1138 | |
| 1139 // Gesture events should not be forwarded if the flag it not set. | |
|
msw
2017/06/30 20:22:39
nit: "flag is not set."
minch1
2017/08/04 17:22:35
Done.
| |
| 1140 EXPECT_EQ(CountOwnerOnGestureEvent(), 0); | |
| 1141 EXPECT_FALSE(controller->send_gesture_events_to_owner()); | |
| 1142 controller->OnGestureEvent(sub_menu, &event); | |
| 1143 EXPECT_EQ(CountOwnerOnGestureEvent(), 0); | |
| 1144 | |
| 1145 // The menu's owner should receive gestures triggered outside the menu. | |
| 1146 controller->set_send_gesture_events_to_owner(true); | |
| 1147 controller->OnGestureEvent(sub_menu, &event); | |
| 1148 EXPECT_EQ(CountOwnerOnGestureEvent(), 1); | |
| 1149 | |
| 1150 ui::GestureEvent event2(location.x(), location.y(), 0, ui::EventTimeForNow(), | |
| 1151 ui::GestureEventDetails(ui::ET_GESTURE_END)); | |
| 1152 | |
| 1153 controller->OnGestureEvent(sub_menu, &event2); | |
| 1154 EXPECT_EQ(CountOwnerOnGestureEvent(), 2); | |
| 1155 | |
| 1156 // ET_GESTURE_END resets the |send_gesture_events_to_owner_| flag, so futher | |
| 1157 // gesture events should not be sent to the owner. | |
| 1158 controller->OnGestureEvent(sub_menu, &event2); | |
| 1159 EXPECT_EQ(CountOwnerOnGestureEvent(), 2); | |
| 1160 } | |
| 1161 #endif // !defined(OS_MACOSX) | |
| 1162 | |
| 1109 // Tests that a nested menu does not crash when trying to repost events that | 1163 // Tests that a nested menu does not crash when trying to repost events that |
| 1110 // occur outside of the bounds of the menu. Instead a proper shutdown should | 1164 // occur outside of the bounds of the menu. Instead a proper shutdown should |
| 1111 // occur. | 1165 // occur. |
| 1112 TEST_F(MenuControllerTest, AsynchronousRepostEvent) { | 1166 TEST_F(MenuControllerTest, AsynchronousRepostEvent) { |
| 1113 MenuController* controller = menu_controller(); | 1167 MenuController* controller = menu_controller(); |
| 1114 TestMenuControllerDelegate* delegate = menu_controller_delegate(); | 1168 TestMenuControllerDelegate* delegate = menu_controller_delegate(); |
| 1115 std::unique_ptr<TestMenuControllerDelegate> nested_delegate( | 1169 std::unique_ptr<TestMenuControllerDelegate> nested_delegate( |
| 1116 new TestMenuControllerDelegate()); | 1170 new TestMenuControllerDelegate()); |
| 1117 | 1171 |
| 1118 controller->AddNestedDelegate(nested_delegate.get()); | 1172 controller->AddNestedDelegate(nested_delegate.get()); |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1414 // crash. | 1468 // crash. |
| 1415 TestAsyncEscapeKey(); | 1469 TestAsyncEscapeKey(); |
| 1416 EXPECT_EQ(nested_controller_delegate_2->on_menu_closed_called(), 1); | 1470 EXPECT_EQ(nested_controller_delegate_2->on_menu_closed_called(), 1); |
| 1417 EXPECT_EQ(menu_controller_delegate(), GetCurrentDelegate()); | 1471 EXPECT_EQ(menu_controller_delegate(), GetCurrentDelegate()); |
| 1418 } | 1472 } |
| 1419 | 1473 |
| 1420 #endif // defined(USE_AURA) | 1474 #endif // defined(USE_AURA) |
| 1421 | 1475 |
| 1422 } // namespace test | 1476 } // namespace test |
| 1423 } // namespace views | 1477 } // namespace views |
| OLD | NEW |