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

Side by Side Diff: ui/views/controls/button/menu_button_unittest.cc

Issue 2880623002: [ash-md] Fixed MenuButton focus appearing after dismissing menus. (Closed)
Patch Set: Reworked solution to use CustomButton::ShouldEnterHoveredState(). Created 3 years, 7 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/button/menu_button.cc ('k') | no next file » | 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/button/menu_button.h" 5 #include "ui/views/controls/button/menu_button.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility>
8 9
9 #include "base/macros.h" 10 #include "base/macros.h"
10 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
11 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
12 #include "build/build_config.h" 13 #include "build/build_config.h"
13 #include "ui/base/dragdrop/drag_drop_types.h" 14 #include "ui/base/dragdrop/drag_drop_types.h"
14 #include "ui/events/test/event_generator.h" 15 #include "ui/events/test/event_generator.h"
15 #include "ui/views/animation/test/ink_drop_host_view_test_api.h" 16 #include "ui/views/animation/test/ink_drop_host_view_test_api.h"
16 #include "ui/views/animation/test/test_ink_drop.h" 17 #include "ui/views/animation/test/test_ink_drop.h"
17 #include "ui/views/controls/button/menu_button_listener.h" 18 #include "ui/views/controls/button/menu_button_listener.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 void CreateMenuButtonWithNoListener() { CreateMenuButton(nullptr); } 74 void CreateMenuButtonWithNoListener() { CreateMenuButton(nullptr); }
74 75
75 // Creates a MenuButton with a MenuButtonListener. In this case, when the 76 // Creates a MenuButton with a MenuButtonListener. In this case, when the
76 // MenuButton is pushed, it notifies the MenuButtonListener to open a 77 // MenuButton is pushed, it notifies the MenuButtonListener to open a
77 // drop-down menu. 78 // drop-down menu.
78 void CreateMenuButtonWithMenuButtonListener( 79 void CreateMenuButtonWithMenuButtonListener(
79 MenuButtonListener* menu_button_listener) { 80 MenuButtonListener* menu_button_listener) {
80 CreateMenuButton(menu_button_listener); 81 CreateMenuButton(menu_button_listener);
81 } 82 }
82 83
83 void AttachInkDrop() { 84 gfx::Point GetOutOfButtonLocation() const {
84 ink_drop_ = new test::TestInkDrop(); 85 return gfx::Point(button_->x() - 1, button_->y() - 1);
85 test::InkDropHostViewTestApi(button_).SetInkDrop(
86 base::WrapUnique(ink_drop_));
87 } 86 }
88 87
89 private: 88 private:
90 void CreateMenuButton(MenuButtonListener* menu_button_listener) { 89 void CreateMenuButton(MenuButtonListener* menu_button_listener) {
91 CreateWidget(); 90 CreateWidget();
92 generator_.reset(new ui::test::EventGenerator(widget_->GetNativeWindow())); 91 generator_.reset(new ui::test::EventGenerator(widget_->GetNativeWindow()));
93 // Set initial mouse location in a consistent way so that the menu button we 92 // Set initial mouse location in a consistent way so that the menu button we
94 // are about to create initializes its hover state in a consistent manner. 93 // are about to create initializes its hover state in a consistent manner.
95 generator_->set_current_location(gfx::Point(10, 10)); 94 generator_->set_current_location(gfx::Point(10, 10));
96 95
97 button_ = new TestMenuButton(menu_button_listener); 96 button_ = new TestMenuButton(menu_button_listener);
98 button_->SetBoundsRect(gfx::Rect(0, 0, 200, 20)); 97 button_->SetBoundsRect(gfx::Rect(0, 0, 200, 20));
98
99 ink_drop_ = new test::TestInkDrop();
100 test::InkDropHostViewTestApi(button_).SetInkDrop(
101 base::WrapUnique(ink_drop_));
102
99 widget_->SetContentsView(button_); 103 widget_->SetContentsView(button_);
100
101 widget_->Show(); 104 widget_->Show();
102 } 105 }
103 106
104 void CreateWidget() { 107 void CreateWidget() {
105 DCHECK(!widget_); 108 DCHECK(!widget_);
106 109
107 widget_ = new Widget; 110 widget_ = new Widget;
108 Widget::InitParams params = 111 Widget::InitParams params =
109 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); 112 CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
110 params.bounds = gfx::Rect(0, 0, 200, 200); 113 params.bounds = gfx::Rect(0, 0, 200, 200);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 void set_menu_button(MenuButton* menu_button) { menu_button_ = menu_button; } 189 void set_menu_button(MenuButton* menu_button) { menu_button_ = menu_button; }
187 190
188 void OnMenuButtonClicked(MenuButton* source, 191 void OnMenuButtonClicked(MenuButton* source,
189 const gfx::Point& point, 192 const gfx::Point& point,
190 const ui::Event* event) override { 193 const ui::Event* event) override {
191 pressed_lock_.reset(new MenuButton::PressedLock(menu_button_)); 194 pressed_lock_.reset(new MenuButton::PressedLock(menu_button_));
192 if (release_lock_) 195 if (release_lock_)
193 pressed_lock_.reset(); 196 pressed_lock_.reset();
194 } 197 }
195 198
199 void ReleasePressedLock() { pressed_lock_.reset(); }
200
196 private: 201 private:
197 MenuButton* menu_button_; 202 MenuButton* menu_button_;
198 203
199 std::unique_ptr<MenuButton::PressedLock> pressed_lock_; 204 std::unique_ptr<MenuButton::PressedLock> pressed_lock_;
200 205
201 // The |pressed_lock_| will be released when true. 206 // The |pressed_lock_| will be released when true.
202 bool release_lock_; 207 bool release_lock_;
203 208
204 DISALLOW_COPY_AND_ASSIGN(PressStateMenuButtonListener); 209 DISALLOW_COPY_AND_ASSIGN(PressStateMenuButtonListener);
205 }; 210 };
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 generator()->PressLeftButton(); 466 generator()->PressLeftButton();
462 EXPECT_EQ(nullptr, menu_button_listener.last_source()); 467 EXPECT_EQ(nullptr, menu_button_listener.last_source());
463 468
464 generator()->ReleaseLeftButton(); 469 generator()->ReleaseLeftButton();
465 EXPECT_EQ(button(), menu_button_listener.last_source()); 470 EXPECT_EQ(button(), menu_button_listener.last_source());
466 EXPECT_EQ(Button::STATE_HOVERED, menu_button_listener.last_source_state()); 471 EXPECT_EQ(Button::STATE_HOVERED, menu_button_listener.last_source_state());
467 } 472 }
468 473
469 TEST_F(MenuButtonTest, InkDropStateForMenuButtonActivationsWithoutListener) { 474 TEST_F(MenuButtonTest, InkDropStateForMenuButtonActivationsWithoutListener) {
470 CreateMenuButtonWithNoListener(); 475 CreateMenuButtonWithNoListener();
471 AttachInkDrop();
472 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); 476 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
473 button()->Activate(nullptr); 477 button()->Activate(nullptr);
474 478
475 EXPECT_EQ(InkDropState::HIDDEN, ink_drop()->GetTargetInkDropState()); 479 EXPECT_EQ(InkDropState::HIDDEN, ink_drop()->GetTargetInkDropState());
476 } 480 }
477 481
478 TEST_F(MenuButtonTest, 482 TEST_F(MenuButtonTest,
479 InkDropStateForMenuButtonActivationsWithListenerThatDoesntAcquireALock) { 483 InkDropStateForMenuButtonActivationsWithListenerThatDoesntAcquireALock) {
480 TestMenuButtonListener menu_button_listener; 484 TestMenuButtonListener menu_button_listener;
481 CreateMenuButtonWithMenuButtonListener(&menu_button_listener); 485 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
482 AttachInkDrop();
483 button()->Activate(nullptr); 486 button()->Activate(nullptr);
484 487
485 EXPECT_EQ(InkDropState::ACTION_TRIGGERED, 488 EXPECT_EQ(InkDropState::ACTION_TRIGGERED,
486 ink_drop()->GetTargetInkDropState()); 489 ink_drop()->GetTargetInkDropState());
487 } 490 }
488 491
489 TEST_F( 492 TEST_F(
490 MenuButtonTest, 493 MenuButtonTest,
491 InkDropStateForMenuButtonActivationsWithListenerThatDontReleaseAllLocks) { 494 InkDropStateForMenuButtonActivationsWithListenerThatDontReleaseAllLocks) {
492 PressStateMenuButtonListener menu_button_listener(false); 495 PressStateMenuButtonListener menu_button_listener(false);
493 CreateMenuButtonWithMenuButtonListener(&menu_button_listener); 496 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
494 AttachInkDrop();
495 menu_button_listener.set_menu_button(button()); 497 menu_button_listener.set_menu_button(button());
496 button()->Activate(nullptr); 498 button()->Activate(nullptr);
497 499
498 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 500 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
499 } 501 }
500 502
501 TEST_F(MenuButtonTest, 503 TEST_F(MenuButtonTest,
502 InkDropStateForMenuButtonActivationsWithListenerThatReleaseAllLocks) { 504 InkDropStateForMenuButtonActivationsWithListenerThatReleaseAllLocks) {
503 PressStateMenuButtonListener menu_button_listener(true); 505 PressStateMenuButtonListener menu_button_listener(true);
504 CreateMenuButtonWithMenuButtonListener(&menu_button_listener); 506 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
505 menu_button_listener.set_menu_button(button()); 507 menu_button_listener.set_menu_button(button());
506 AttachInkDrop();
507 button()->Activate(nullptr); 508 button()->Activate(nullptr);
508 509
509 EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop()->GetTargetInkDropState()); 510 EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop()->GetTargetInkDropState());
510 } 511 }
511 512
512 TEST_F(MenuButtonTest, InkDropStateForMenuButtonsWithPressedLocks) { 513 TEST_F(MenuButtonTest, InkDropStateForMenuButtonsWithPressedLocks) {
513 CreateMenuButtonWithNoListener(); 514 CreateMenuButtonWithNoListener();
514 AttachInkDrop();
515 515
516 std::unique_ptr<MenuButton::PressedLock> pressed_lock1( 516 std::unique_ptr<MenuButton::PressedLock> pressed_lock1(
517 new MenuButton::PressedLock(button())); 517 new MenuButton::PressedLock(button()));
518 518
519 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 519 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
520 520
521 std::unique_ptr<MenuButton::PressedLock> pressed_lock2( 521 std::unique_ptr<MenuButton::PressedLock> pressed_lock2(
522 new MenuButton::PressedLock(button())); 522 new MenuButton::PressedLock(button()));
523 523
524 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 524 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
525 525
526 pressed_lock1.reset(); 526 pressed_lock1.reset();
527 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 527 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
528 528
529 pressed_lock2.reset(); 529 pressed_lock2.reset();
530 EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop()->GetTargetInkDropState()); 530 EXPECT_EQ(InkDropState::DEACTIVATED, ink_drop()->GetTargetInkDropState());
531 } 531 }
532 532
533 // Verifies only one ink drop animation is triggered when multiple PressedLocks 533 // Verifies only one ink drop animation is triggered when multiple PressedLocks
534 // are attached to a MenuButton. 534 // are attached to a MenuButton.
535 TEST_F(MenuButtonTest, OneInkDropAnimationForReentrantPressedLocks) { 535 TEST_F(MenuButtonTest, OneInkDropAnimationForReentrantPressedLocks) {
536 CreateMenuButtonWithNoListener(); 536 CreateMenuButtonWithNoListener();
537 AttachInkDrop();
538 537
539 std::unique_ptr<MenuButton::PressedLock> pressed_lock1( 538 std::unique_ptr<MenuButton::PressedLock> pressed_lock1(
540 new MenuButton::PressedLock(button())); 539 new MenuButton::PressedLock(button()));
541 540
542 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 541 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
543 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING); 542 ink_drop()->AnimateToState(InkDropState::ACTION_PENDING);
544 543
545 std::unique_ptr<MenuButton::PressedLock> pressed_lock2( 544 std::unique_ptr<MenuButton::PressedLock> pressed_lock2(
546 new MenuButton::PressedLock(button())); 545 new MenuButton::PressedLock(button()));
547 546
548 EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop()->GetTargetInkDropState()); 547 EXPECT_EQ(InkDropState::ACTION_PENDING, ink_drop()->GetTargetInkDropState());
549 } 548 }
550 549
551 // Verifies the InkDropState is left as ACTIVATED if a PressedLock is active 550 // Verifies the InkDropState is left as ACTIVATED if a PressedLock is active
552 // before another Activation occurs. 551 // before another Activation occurs.
553 TEST_F(MenuButtonTest, 552 TEST_F(MenuButtonTest,
554 InkDropStateForMenuButtonWithPressedLockBeforeActivation) { 553 InkDropStateForMenuButtonWithPressedLockBeforeActivation) {
555 TestMenuButtonListener menu_button_listener; 554 TestMenuButtonListener menu_button_listener;
556 CreateMenuButtonWithMenuButtonListener(&menu_button_listener); 555 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
557 AttachInkDrop();
558 MenuButton::PressedLock lock(button()); 556 MenuButton::PressedLock lock(button());
559 557
560 button()->Activate(nullptr); 558 button()->Activate(nullptr);
561 559
562 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState()); 560 EXPECT_EQ(InkDropState::ACTIVATED, ink_drop()->GetTargetInkDropState());
563 } 561 }
564 562
565 #if defined(USE_AURA) 563 #if defined(USE_AURA)
566 564
567 // Tests that the MenuButton does not become pressed if it can be dragged, and a 565 // Tests that the MenuButton does not become pressed if it can be dragged, and a
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 EXPECT_EQ(Button::STATE_HOVERED, button()->state()); 636 EXPECT_EQ(Button::STATE_HOVERED, button()->state());
639 637
640 generator()->MoveTouch(gfx::Point(10, 30)); 638 generator()->MoveTouch(gfx::Point(10, 30));
641 generator()->ReleaseTouch(); 639 generator()->ReleaseTouch();
642 EXPECT_EQ(Button::STATE_NORMAL, button()->state()); 640 EXPECT_EQ(Button::STATE_NORMAL, button()->state());
643 EXPECT_EQ(nullptr, menu_button_listener.last_source()); 641 EXPECT_EQ(nullptr, menu_button_listener.last_source());
644 } 642 }
645 643
646 #endif // !defined(OS_MACOSX) || defined(USE_AURA) 644 #endif // !defined(OS_MACOSX) || defined(USE_AURA)
647 645
646 TEST_F(MenuButtonTest, InkDropHoverWhenShowingMenu) {
647 PressStateMenuButtonListener menu_button_listener(false);
648 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
649 menu_button_listener.set_menu_button(button());
650
651 generator()->MoveMouseTo(GetOutOfButtonLocation());
652 EXPECT_FALSE(ink_drop()->is_hovered());
653
654 generator()->MoveMouseTo(button()->bounds().CenterPoint());
655 EXPECT_TRUE(ink_drop()->is_hovered());
656
657 generator()->PressLeftButton();
658 EXPECT_FALSE(ink_drop()->is_hovered());
659 }
660
661 TEST_F(MenuButtonTest, InkDropIsHoveredAfterDismissingMenuWhenMouseOverButton) {
662 PressStateMenuButtonListener menu_button_listener(false);
663 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
664 menu_button_listener.set_menu_button(button());
665
666 generator()->MoveMouseTo(button()->bounds().CenterPoint());
667 generator()->PressLeftButton();
668 EXPECT_FALSE(ink_drop()->is_hovered());
669 menu_button_listener.ReleasePressedLock();
670
671 EXPECT_TRUE(ink_drop()->is_hovered());
672 }
673
674 TEST_F(MenuButtonTest,
675 InkDropIsntHoveredAfterDismissingMenuWhenMouseOutsideButton) {
676 PressStateMenuButtonListener menu_button_listener(false);
677 CreateMenuButtonWithMenuButtonListener(&menu_button_listener);
678 menu_button_listener.set_menu_button(button());
679
680 generator()->MoveMouseTo(button()->bounds().CenterPoint());
681 generator()->PressLeftButton();
682 generator()->MoveMouseTo(GetOutOfButtonLocation());
683 menu_button_listener.ReleasePressedLock();
684
685 EXPECT_FALSE(ink_drop()->is_hovered());
686 }
687
648 } // namespace views 688 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/controls/button/menu_button.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698