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