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

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: Fixed msw's comments. Created 3 years, 5 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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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