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