OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ash/common/shelf/shelf_view.h" | 5 #include "ash/common/shelf/shelf_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "ash/common/shelf/app_list_button.h" | 12 #include "ash/common/shelf/app_list_button.h" |
13 #include "ash/common/shelf/overflow_bubble.h" | 13 #include "ash/common/shelf/overflow_bubble.h" |
14 #include "ash/common/shelf/overflow_bubble_view.h" | 14 #include "ash/common/shelf/overflow_bubble_view.h" |
| 15 #include "ash/common/shelf/overflow_button.h" |
15 #include "ash/common/shelf/shelf_button.h" | 16 #include "ash/common/shelf/shelf_button.h" |
16 #include "ash/common/shelf/shelf_constants.h" | 17 #include "ash/common/shelf/shelf_constants.h" |
17 #include "ash/common/shelf/shelf_icon_observer.h" | 18 #include "ash/common/shelf/shelf_icon_observer.h" |
18 #include "ash/common/shelf/shelf_menu_model.h" | 19 #include "ash/common/shelf/shelf_menu_model.h" |
19 #include "ash/common/shelf/shelf_model.h" | 20 #include "ash/common/shelf/shelf_model.h" |
20 #include "ash/common/shelf/shelf_tooltip_manager.h" | 21 #include "ash/common/shelf/shelf_tooltip_manager.h" |
21 #include "ash/common/shelf/wm_shelf.h" | 22 #include "ash/common/shelf/wm_shelf.h" |
22 #include "ash/common/shell_window_ids.h" | 23 #include "ash/common/shell_window_ids.h" |
23 #include "ash/common/system/web_notification/web_notification_tray.h" | 24 #include "ash/common/system/web_notification/web_notification_tray.h" |
24 #include "ash/common/test/material_design_controller_test_api.h" | 25 #include "ash/common/test/material_design_controller_test_api.h" |
(...skipping 10 matching lines...) Expand all Loading... |
35 #include "ash/test/test_shelf_item_delegate.h" | 36 #include "ash/test/test_shelf_item_delegate.h" |
36 #include "ash/test/test_shell_delegate.h" | 37 #include "ash/test/test_shell_delegate.h" |
37 #include "ash/test/test_system_tray_delegate.h" | 38 #include "ash/test/test_system_tray_delegate.h" |
38 #include "base/i18n/rtl.h" | 39 #include "base/i18n/rtl.h" |
39 #include "base/macros.h" | 40 #include "base/macros.h" |
40 #include "base/memory/ptr_util.h" | 41 #include "base/memory/ptr_util.h" |
41 #include "base/run_loop.h" | 42 #include "base/run_loop.h" |
42 #include "base/strings/string_number_conversions.h" | 43 #include "base/strings/string_number_conversions.h" |
43 #include "base/strings/utf_string_conversions.h" | 44 #include "base/strings/utf_string_conversions.h" |
44 #include "base/test/histogram_tester.h" | 45 #include "base/test/histogram_tester.h" |
| 46 #include "base/test/test_mock_time_task_runner.h" |
45 #include "base/test/user_action_tester.h" | 47 #include "base/test/user_action_tester.h" |
46 #include "base/threading/thread_task_runner_handle.h" | 48 #include "base/threading/thread_task_runner_handle.h" |
47 #include "base/time/time.h" | 49 #include "base/time/time.h" |
48 #include "testing/gmock/include/gmock/gmock.h" | 50 #include "testing/gmock/include/gmock/gmock.h" |
49 #include "ui/app_list/presenter/app_list_presenter.h" | 51 #include "ui/app_list/presenter/app_list_presenter.h" |
50 #include "ui/aura/test/aura_test_base.h" | 52 #include "ui/aura/test/aura_test_base.h" |
51 #include "ui/aura/window.h" | 53 #include "ui/aura/window.h" |
52 #include "ui/aura/window_event_dispatcher.h" | 54 #include "ui/aura/window_event_dispatcher.h" |
53 #include "ui/compositor/layer.h" | 55 #include "ui/compositor/layer.h" |
54 #include "ui/events/event.h" | 56 #include "ui/events/event.h" |
(...skipping 2073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 } // namespace | 2130 } // namespace |
2129 | 2131 |
2130 // Test fixture that forces material design mode in order to test ink drop | 2132 // Test fixture that forces material design mode in order to test ink drop |
2131 // ripples on shelf. | 2133 // ripples on shelf. |
2132 class ShelfViewInkDropTest : public ShelfViewTest { | 2134 class ShelfViewInkDropTest : public ShelfViewTest { |
2133 public: | 2135 public: |
2134 ShelfViewInkDropTest() {} | 2136 ShelfViewInkDropTest() {} |
2135 ~ShelfViewInkDropTest() override {} | 2137 ~ShelfViewInkDropTest() override {} |
2136 | 2138 |
2137 void SetUp() override { | 2139 void SetUp() override { |
2138 shell_delegate_ = new TestAppListShellDelegate; | 2140 if (!ash_test_helper()->test_shell_delegate()) { |
2139 ash_test_helper()->set_test_shell_delegate(shell_delegate_); | 2141 shell_delegate_ = new TestAppListShellDelegate; |
| 2142 ash_test_helper()->set_test_shell_delegate(shell_delegate_); |
| 2143 } |
2140 | 2144 |
2141 set_material_mode(ash::MaterialDesignController::MATERIAL_EXPERIMENTAL); | 2145 set_material_mode(ash::MaterialDesignController::MATERIAL_EXPERIMENTAL); |
2142 | 2146 |
2143 ShelfViewTest::SetUp(); | 2147 ShelfViewTest::SetUp(); |
2144 } | 2148 } |
2145 | 2149 |
2146 protected: | 2150 protected: |
2147 void InitAppListButtonInkDrop() { | 2151 void InitAppListButtonInkDrop() { |
2148 app_list_button_ = shelf_view_->GetAppListButton(); | 2152 app_list_button_ = shelf_view_->GetAppListButton(); |
2149 | 2153 |
2150 views::InkDropImpl* ink_drop_impl = | 2154 views::InkDropImpl* ink_drop_impl = |
2151 new views::InkDropImpl(app_list_button_); | 2155 new views::InkDropImpl(app_list_button_); |
2152 app_list_button_ink_drop_ = new InkDropSpy(base::WrapUnique(ink_drop_impl)); | 2156 app_list_button_ink_drop_ = new InkDropSpy(base::WrapUnique(ink_drop_impl)); |
2153 views::test::InkDropHostViewTestApi(app_list_button_) | 2157 views::test::InkDropHostViewTestApi(app_list_button_) |
2154 .SetInkDrop(base::WrapUnique(app_list_button_ink_drop_), false); | 2158 .SetInkDrop(base::WrapUnique(app_list_button_ink_drop_), false); |
2155 } | 2159 } |
2156 | 2160 |
2157 void InitBrowserButtonInkDrop() { | 2161 void InitBrowserButtonInkDrop() { |
2158 browser_button_ = test_api_->GetButton(browser_index_); | 2162 browser_button_ = test_api_->GetButton(browser_index_); |
2159 | 2163 |
2160 views::InkDropImpl* ink_drop_impl = new views::InkDropImpl(browser_button_); | 2164 views::InkDropImpl* ink_drop_impl = new views::InkDropImpl(browser_button_); |
2161 browser_button_ink_drop_ = new InkDropSpy(base::WrapUnique(ink_drop_impl)); | 2165 browser_button_ink_drop_ = new InkDropSpy(base::WrapUnique(ink_drop_impl)); |
2162 views::test::InkDropHostViewTestApi(browser_button_) | 2166 views::test::InkDropHostViewTestApi(browser_button_) |
2163 .SetInkDrop(base::WrapUnique(browser_button_ink_drop_)); | 2167 .SetInkDrop(base::WrapUnique(browser_button_ink_drop_)); |
2164 } | 2168 } |
2165 | 2169 |
2166 void ShowAppList() { | 2170 void ShowAppList() { |
| 2171 DCHECK(shelf_delegate_); |
2167 shell_delegate_->app_list_presenter()->Show(0); | 2172 shell_delegate_->app_list_presenter()->Show(0); |
2168 // Similar to real AppListPresenter, notify button that the app list is | 2173 // Similar to real AppListPresenter, notify button that the app list is |
2169 // shown. | 2174 // shown. |
2170 app_list_button_->OnAppListShown(); | 2175 app_list_button_->OnAppListShown(); |
2171 } | 2176 } |
2172 | 2177 |
2173 void DismissAppList() { | 2178 void DismissAppList() { |
| 2179 DCHECK(shelf_delegate_); |
2174 shell_delegate_->app_list_presenter()->Dismiss(); | 2180 shell_delegate_->app_list_presenter()->Dismiss(); |
2175 // Similar to real AppListPresenter, notify button that the app list is | 2181 // Similar to real AppListPresenter, notify button that the app list is |
2176 // dismissed. | 2182 // dismissed. |
2177 app_list_button_->OnAppListDismissed(); | 2183 app_list_button_->OnAppListDismissed(); |
2178 } | 2184 } |
2179 | 2185 |
2180 void FinishAppListVisibilityChange() { | 2186 void FinishAppListVisibilityChange() { |
| 2187 DCHECK(shelf_delegate_); |
2181 shell_delegate_->app_list_presenter()->FinishVisibilityChange(); | 2188 shell_delegate_->app_list_presenter()->FinishVisibilityChange(); |
2182 } | 2189 } |
2183 | 2190 |
2184 TestAppListShellDelegate* shell_delegate_ = nullptr; // Owned by Shell. | 2191 TestAppListShellDelegate* shell_delegate_ = nullptr; // Owned by Shell. |
2185 | 2192 |
2186 AppListButton* app_list_button_ = nullptr; | 2193 AppListButton* app_list_button_ = nullptr; |
2187 InkDropSpy* app_list_button_ink_drop_ = nullptr; | 2194 InkDropSpy* app_list_button_ink_drop_ = nullptr; |
2188 ShelfButton* browser_button_ = nullptr; | 2195 ShelfButton* browser_button_ = nullptr; |
2189 InkDropSpy* browser_button_ink_drop_ = nullptr; | 2196 InkDropSpy* browser_button_ink_drop_ = nullptr; |
2190 | 2197 |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2572 ui::EF_LEFT_MOUSE_BUTTON, 0); | 2579 ui::EF_LEFT_MOUSE_BUTTON, 0); |
2573 button->OnMouseReleased(release_event); | 2580 button->OnMouseReleased(release_event); |
2574 test_api_->CloseMenu(); | 2581 test_api_->CloseMenu(); |
2575 EXPECT_EQ(views::InkDropState::HIDDEN, | 2582 EXPECT_EQ(views::InkDropState::HIDDEN, |
2576 browser_button_ink_drop_->GetTargetInkDropState()); | 2583 browser_button_ink_drop_->GetTargetInkDropState()); |
2577 EXPECT_THAT(browser_button_ink_drop_->GetAndResetRequestedStates(), | 2584 EXPECT_THAT(browser_button_ink_drop_->GetAndResetRequestedStates(), |
2578 ElementsAre(views::InkDropState::ACTIVATED, | 2585 ElementsAre(views::InkDropState::ACTIVATED, |
2579 views::InkDropState::DEACTIVATED)); | 2586 views::InkDropState::DEACTIVATED)); |
2580 } | 2587 } |
2581 | 2588 |
| 2589 namespace { |
| 2590 |
| 2591 // An empty menu model for shell context menu just to have a menu. |
| 2592 class TestShellMenuModel : public ui::SimpleMenuModel, |
| 2593 public ui::SimpleMenuModel::Delegate { |
| 2594 public: |
| 2595 TestShellMenuModel() : ui::SimpleMenuModel(this) {} |
| 2596 ~TestShellMenuModel() override {} |
| 2597 |
| 2598 private: |
| 2599 // ui::SimpleMenuModel::Delegate: |
| 2600 bool IsCommandIdChecked(int command_id) const override { return false; } |
| 2601 bool IsCommandIdEnabled(int command_id) const override { return true; } |
| 2602 void ExecuteCommand(int command_id, int event_flags) override {} |
| 2603 |
| 2604 DISALLOW_COPY_AND_ASSIGN(TestShellMenuModel); |
| 2605 }; |
| 2606 |
| 2607 // A test ShellDelegate implementation for overflow button tests that returns a |
| 2608 // TestShelfMenuModel for the shell context menu. |
| 2609 class TestOverflowButtonShellDelegate : public TestShellDelegate { |
| 2610 public: |
| 2611 TestOverflowButtonShellDelegate() {} |
| 2612 ~TestOverflowButtonShellDelegate() override {} |
| 2613 |
| 2614 // TestShellDelegate: |
| 2615 ui::MenuModel* CreateContextMenu(WmShelf* wm_shelf, |
| 2616 const ShelfItem* item) override { |
| 2617 // Caller takes ownership of the returned object. |
| 2618 return new TestShellMenuModel; |
| 2619 } |
| 2620 |
| 2621 private: |
| 2622 DISALLOW_COPY_AND_ASSIGN(TestOverflowButtonShellDelegate); |
| 2623 }; |
| 2624 |
| 2625 // A scoped wrapper around TestMockTimeTaskRunner that replaces message loop's |
| 2626 // task runner with a TestMockTimeTaskRunner and resets it back at the end of |
| 2627 // the scope. |
| 2628 class ScopedMockTaskRunnerWrapper { |
| 2629 public: |
| 2630 ScopedMockTaskRunnerWrapper() { |
| 2631 mock_task_runner_ = new base::TestMockTimeTaskRunner; |
| 2632 previous_task_runner_ = base::MessageLoop::current()->task_runner(); |
| 2633 base::MessageLoop::current()->SetTaskRunner(mock_task_runner_); |
| 2634 } |
| 2635 |
| 2636 ~ScopedMockTaskRunnerWrapper() { |
| 2637 DCHECK_EQ(mock_task_runner_, base::MessageLoop::current()->task_runner()); |
| 2638 mock_task_runner_->ClearPendingTasks(); |
| 2639 base::MessageLoop::current()->SetTaskRunner(previous_task_runner_); |
| 2640 } |
| 2641 |
| 2642 void FastForwardUntilNoTasksRemain() { |
| 2643 mock_task_runner_->FastForwardUntilNoTasksRemain(); |
| 2644 } |
| 2645 |
| 2646 private: |
| 2647 scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_; |
| 2648 scoped_refptr<base::SingleThreadTaskRunner> previous_task_runner_; |
| 2649 |
| 2650 DISALLOW_COPY_AND_ASSIGN(ScopedMockTaskRunnerWrapper); |
| 2651 }; |
| 2652 |
| 2653 } // namespace |
| 2654 |
| 2655 // Test fixture for testing material design ink drop on overflow button. |
| 2656 class OverflowButtonInkDropTest : public ShelfViewInkDropTest { |
| 2657 public: |
| 2658 OverflowButtonInkDropTest() {} |
| 2659 ~OverflowButtonInkDropTest() override {} |
| 2660 |
| 2661 void SetUp() override { |
| 2662 // Shell takes ownership of the test shell delegate. |
| 2663 ash_test_helper()->set_test_shell_delegate( |
| 2664 new TestOverflowButtonShellDelegate); |
| 2665 |
| 2666 ShelfViewInkDropTest::SetUp(); |
| 2667 |
| 2668 InitOverflowButtonInkDrop(); |
| 2669 |
| 2670 AddButtonsUntilOverflow(); |
| 2671 EXPECT_TRUE(test_api_->IsOverflowButtonVisible()); |
| 2672 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2673 test_api_->overflow_bubble()->IsShowing()); |
| 2674 } |
| 2675 |
| 2676 protected: |
| 2677 void InitOverflowButtonInkDrop() { |
| 2678 overflow_button_ = test_api_->overflow_button(); |
| 2679 |
| 2680 views::InkDropImpl* ink_drop_impl = |
| 2681 new views::InkDropImpl(overflow_button_); |
| 2682 overflow_button_ink_drop_ = new InkDropSpy(base::WrapUnique(ink_drop_impl)); |
| 2683 views::test::InkDropHostViewTestApi(overflow_button_) |
| 2684 .SetInkDrop(base::WrapUnique(overflow_button_ink_drop_)); |
| 2685 } |
| 2686 |
| 2687 gfx::Point GetScreenPointInsideOverflowButton() const { |
| 2688 return overflow_button_->GetBoundsInScreen().CenterPoint(); |
| 2689 } |
| 2690 |
| 2691 gfx::Point GetScreenPointOutsideOverflowButton() const { |
| 2692 gfx::Point point = GetScreenPointInsideOverflowButton(); |
| 2693 point.Offset(overflow_button_->width(), 0); |
| 2694 return point; |
| 2695 } |
| 2696 |
| 2697 OverflowButton* overflow_button_ = nullptr; |
| 2698 InkDropSpy* overflow_button_ink_drop_ = nullptr; |
| 2699 |
| 2700 private: |
| 2701 DISALLOW_COPY_AND_ASSIGN(OverflowButtonInkDropTest); |
| 2702 }; |
| 2703 |
| 2704 // Tests ink drop state transitions for the overflow button when the overflow |
| 2705 // bubble is shown or hidden. |
| 2706 TEST_F(OverflowButtonInkDropTest, OnOverflowBubbleShowHide) { |
| 2707 test_api_->ShowOverflowBubble(); |
| 2708 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 2709 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 2710 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2711 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2712 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2713 ElementsAre(views::InkDropState::ACTIVATED)); |
| 2714 |
| 2715 test_api_->HideOverflowBubble(); |
| 2716 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2717 test_api_->overflow_bubble()->IsShowing()); |
| 2718 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2719 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2720 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2721 ElementsAre(views::InkDropState::DEACTIVATED)); |
| 2722 } |
| 2723 |
| 2724 // Tests ink drop state transitions for the overflow button when the user clicks |
| 2725 // on it. |
| 2726 TEST_F(OverflowButtonInkDropTest, MouseActivate) { |
| 2727 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2728 gfx::Point mouse_location = GetScreenPointInsideOverflowButton(); |
| 2729 generator.MoveMouseTo(mouse_location); |
| 2730 |
| 2731 generator.PressLeftButton(); |
| 2732 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2733 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2734 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2735 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2736 |
| 2737 generator.ReleaseLeftButton(); |
| 2738 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2739 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2740 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2741 ElementsAre(views::InkDropState::ACTIVATED)); |
| 2742 |
| 2743 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 2744 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 2745 } |
| 2746 |
| 2747 // Tests ink drop state transitions for the overflow button when the user |
| 2748 // presses left mouse button on it and drags it out of the button bounds. |
| 2749 TEST_F(OverflowButtonInkDropTest, MouseDragOut) { |
| 2750 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2751 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 2752 |
| 2753 generator.PressLeftButton(); |
| 2754 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2755 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2756 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2757 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2758 |
| 2759 generator.MoveMouseTo(GetScreenPointOutsideOverflowButton()); |
| 2760 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2761 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2762 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2763 ElementsAre(views::InkDropState::HIDDEN)); |
| 2764 |
| 2765 generator.ReleaseLeftButton(); |
| 2766 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2767 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2768 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2769 IsEmpty()); |
| 2770 |
| 2771 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2772 test_api_->overflow_bubble()->IsShowing()); |
| 2773 } |
| 2774 |
| 2775 // Tests ink drop state transitions for the overflow button when the user |
| 2776 // presses left mouse button on it and drags it out of the button bounds and |
| 2777 // back. |
| 2778 TEST_F(OverflowButtonInkDropTest, MouseDragOutAndBack) { |
| 2779 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2780 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 2781 |
| 2782 generator.PressLeftButton(); |
| 2783 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2784 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2785 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2786 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2787 |
| 2788 generator.MoveMouseTo(GetScreenPointOutsideOverflowButton()); |
| 2789 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2790 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2791 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2792 ElementsAre(views::InkDropState::HIDDEN)); |
| 2793 |
| 2794 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 2795 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2796 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2797 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2798 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2799 |
| 2800 generator.ReleaseLeftButton(); |
| 2801 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2802 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2803 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2804 ElementsAre(views::InkDropState::ACTIVATED)); |
| 2805 |
| 2806 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 2807 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 2808 } |
| 2809 |
| 2810 // Tests ink drop state transitions for the overflow button when the user right |
| 2811 // clicks on the button to show the context menu. |
| 2812 TEST_F(OverflowButtonInkDropTest, MouseContextMenu) { |
| 2813 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2814 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 2815 |
| 2816 generator.PressRightButton(); |
| 2817 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2818 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2819 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2820 IsEmpty()); |
| 2821 |
| 2822 generator.ReleaseRightButton(); |
| 2823 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2824 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2825 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2826 IsEmpty()); |
| 2827 |
| 2828 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2829 test_api_->overflow_bubble()->IsShowing()); |
| 2830 } |
| 2831 |
| 2832 #if !defined(OS_WIN) |
| 2833 // There is no ink drop effect for gesture events on Windows. |
| 2834 |
| 2835 // Tests ink drop state transitions for the overflow button when the user taps |
| 2836 // on it. |
| 2837 TEST_F(OverflowButtonInkDropTest, TouchActivate) { |
| 2838 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2839 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 2840 |
| 2841 generator.PressTouch(); |
| 2842 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2843 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2844 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2845 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2846 |
| 2847 generator.ReleaseTouch(); |
| 2848 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2849 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2850 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2851 ElementsAre(views::InkDropState::ACTIVATED)); |
| 2852 |
| 2853 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 2854 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 2855 } |
| 2856 |
| 2857 // Tests ink drop state transitions for the overflow button when the user taps |
| 2858 // down on it and drags it out of the button bounds. |
| 2859 TEST_F(OverflowButtonInkDropTest, TouchDragOut) { |
| 2860 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2861 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 2862 |
| 2863 generator.PressTouch(); |
| 2864 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2865 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2866 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2867 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2868 |
| 2869 generator.MoveTouch(GetScreenPointOutsideOverflowButton()); |
| 2870 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2871 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2872 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2873 ElementsAre(views::InkDropState::HIDDEN)); |
| 2874 |
| 2875 generator.ReleaseTouch(); |
| 2876 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2877 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2878 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2879 IsEmpty()); |
| 2880 |
| 2881 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2882 test_api_->overflow_bubble()->IsShowing()); |
| 2883 } |
| 2884 |
| 2885 // Tests ink drop state transitions for the overflow button when the user taps |
| 2886 // down on it and drags it out of the button bounds and back. |
| 2887 TEST_F(OverflowButtonInkDropTest, TouchDragOutAndBack) { |
| 2888 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2889 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 2890 |
| 2891 generator.PressTouch(); |
| 2892 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2893 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2894 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2895 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2896 |
| 2897 generator.MoveTouch(GetScreenPointOutsideOverflowButton()); |
| 2898 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2899 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2900 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2901 ElementsAre(views::InkDropState::HIDDEN)); |
| 2902 |
| 2903 generator.MoveTouch(GetScreenPointInsideOverflowButton()); |
| 2904 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2905 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2906 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2907 IsEmpty()); |
| 2908 |
| 2909 generator.ReleaseTouch(); |
| 2910 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2911 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2912 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2913 IsEmpty()); |
| 2914 |
| 2915 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2916 test_api_->overflow_bubble()->IsShowing()); |
| 2917 } |
| 2918 |
| 2919 // Tests ink drop state transitions for the overflow button when the user long |
| 2920 // presses on the button to show the context menu. |
| 2921 TEST_F(OverflowButtonInkDropTest, TouchContextMenu) { |
| 2922 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2923 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 2924 |
| 2925 { |
| 2926 RunAllPendingInMessageLoop(); |
| 2927 ScopedMockTaskRunnerWrapper mock_task_runner; |
| 2928 |
| 2929 generator.PressTouch(); |
| 2930 EXPECT_EQ(views::InkDropState::ACTION_PENDING, |
| 2931 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2932 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2933 ElementsAre(views::InkDropState::ACTION_PENDING)); |
| 2934 |
| 2935 mock_task_runner.FastForwardUntilNoTasksRemain(); |
| 2936 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2937 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2938 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2939 ElementsAre(views::InkDropState::ALTERNATE_ACTION_PENDING, |
| 2940 views::InkDropState::HIDDEN)); |
| 2941 |
| 2942 generator.ReleaseTouch(); |
| 2943 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2944 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2945 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2946 IsEmpty()); |
| 2947 |
| 2948 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2949 test_api_->overflow_bubble()->IsShowing()); |
| 2950 } |
| 2951 } |
| 2952 |
| 2953 #endif // !defined(OS_WIN) |
| 2954 |
| 2955 // Test fixture for testing material design ink drop on overflow button when it |
| 2956 // is active. |
| 2957 class OverflowButtonActiveInkDropTest : public OverflowButtonInkDropTest { |
| 2958 public: |
| 2959 OverflowButtonActiveInkDropTest() {} |
| 2960 ~OverflowButtonActiveInkDropTest() override {} |
| 2961 |
| 2962 void SetUp() override { |
| 2963 OverflowButtonInkDropTest::SetUp(); |
| 2964 |
| 2965 test_api_->ShowOverflowBubble(); |
| 2966 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 2967 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 2968 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2969 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2970 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2971 ElementsAre(views::InkDropState::ACTIVATED)); |
| 2972 } |
| 2973 |
| 2974 private: |
| 2975 DISALLOW_COPY_AND_ASSIGN(OverflowButtonActiveInkDropTest); |
| 2976 }; |
| 2977 |
| 2978 // Tests ink drop state transitions for the overflow button when it is active |
| 2979 // and the user clicks on it. |
| 2980 TEST_F(OverflowButtonActiveInkDropTest, MouseDeactivate) { |
| 2981 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 2982 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 2983 |
| 2984 generator.PressLeftButton(); |
| 2985 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 2986 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2987 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2988 IsEmpty()); |
| 2989 |
| 2990 generator.ReleaseLeftButton(); |
| 2991 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 2992 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 2993 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 2994 ElementsAre(views::InkDropState::DEACTIVATED)); |
| 2995 |
| 2996 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 2997 test_api_->overflow_bubble()->IsShowing()); |
| 2998 } |
| 2999 |
| 3000 // Tests ink drop state transitions for the overflow button when it is active |
| 3001 // and the user presses left mouse button on it and drags it out of the button |
| 3002 // bounds. |
| 3003 TEST_F(OverflowButtonActiveInkDropTest, MouseDragOut) { |
| 3004 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3005 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 3006 |
| 3007 generator.PressLeftButton(); |
| 3008 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3009 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3010 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3011 IsEmpty()); |
| 3012 |
| 3013 generator.MoveMouseTo(GetScreenPointOutsideOverflowButton()); |
| 3014 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3015 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3016 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3017 IsEmpty()); |
| 3018 |
| 3019 generator.ReleaseLeftButton(); |
| 3020 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3021 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3022 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3023 IsEmpty()); |
| 3024 |
| 3025 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 3026 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 3027 } |
| 3028 |
| 3029 // Tests ink drop state transitions for the overflow button when it is active |
| 3030 // and the user presses left mouse button on it and drags it out of the button |
| 3031 // bounds and back. |
| 3032 TEST_F(OverflowButtonActiveInkDropTest, MouseDragOutAndBack) { |
| 3033 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3034 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 3035 |
| 3036 generator.PressLeftButton(); |
| 3037 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3038 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3039 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3040 IsEmpty()); |
| 3041 |
| 3042 generator.MoveMouseTo(GetScreenPointOutsideOverflowButton()); |
| 3043 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3044 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3045 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3046 IsEmpty()); |
| 3047 |
| 3048 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 3049 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3050 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3051 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3052 IsEmpty()); |
| 3053 |
| 3054 generator.ReleaseLeftButton(); |
| 3055 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 3056 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3057 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3058 ElementsAre(views::InkDropState::DEACTIVATED)); |
| 3059 |
| 3060 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 3061 test_api_->overflow_bubble()->IsShowing()); |
| 3062 } |
| 3063 |
| 3064 // Tests ink drop state transitions for the overflow button when it is active |
| 3065 // and the user right clicks on the button to show the context menu. |
| 3066 TEST_F(OverflowButtonActiveInkDropTest, MouseContextMenu) { |
| 3067 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3068 generator.MoveMouseTo(GetScreenPointInsideOverflowButton()); |
| 3069 |
| 3070 generator.PressRightButton(); |
| 3071 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3072 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3073 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3074 IsEmpty()); |
| 3075 |
| 3076 generator.ReleaseRightButton(); |
| 3077 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3078 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3079 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3080 IsEmpty()); |
| 3081 |
| 3082 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 3083 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 3084 } |
| 3085 |
| 3086 #if !defined(OS_WIN) |
| 3087 // There is no ink drop effect for gesture events on Windows. |
| 3088 |
| 3089 // Tests ink drop state transitions for the overflow button when it is active |
| 3090 // and the user taps on it. |
| 3091 TEST_F(OverflowButtonActiveInkDropTest, TouchDeactivate) { |
| 3092 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3093 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 3094 |
| 3095 generator.PressTouch(); |
| 3096 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3097 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3098 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3099 IsEmpty()); |
| 3100 |
| 3101 generator.ReleaseTouch(); |
| 3102 EXPECT_EQ(views::InkDropState::HIDDEN, |
| 3103 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3104 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3105 ElementsAre(views::InkDropState::DEACTIVATED, |
| 3106 views::InkDropState::HIDDEN)); |
| 3107 |
| 3108 EXPECT_FALSE(test_api_->overflow_bubble() && |
| 3109 test_api_->overflow_bubble()->IsShowing()); |
| 3110 } |
| 3111 |
| 3112 // Tests ink drop state transitions for the overflow button when it is active |
| 3113 // and the user taps down on it and drags it out of the button bounds. |
| 3114 TEST_F(OverflowButtonActiveInkDropTest, TouchDragOut) { |
| 3115 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3116 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 3117 |
| 3118 generator.PressTouch(); |
| 3119 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3120 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3121 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3122 IsEmpty()); |
| 3123 |
| 3124 generator.MoveTouch(GetScreenPointOutsideOverflowButton()); |
| 3125 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3126 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3127 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3128 IsEmpty()); |
| 3129 |
| 3130 generator.ReleaseTouch(); |
| 3131 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3132 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3133 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3134 IsEmpty()); |
| 3135 |
| 3136 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 3137 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 3138 } |
| 3139 |
| 3140 // Tests ink drop state transitions for the overflow button when it is active |
| 3141 // and the user taps down on it and drags it out of the button bounds and back. |
| 3142 TEST_F(OverflowButtonActiveInkDropTest, TouchDragOutAndBack) { |
| 3143 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3144 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 3145 |
| 3146 generator.PressTouch(); |
| 3147 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3148 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3149 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3150 IsEmpty()); |
| 3151 |
| 3152 generator.MoveTouch(GetScreenPointOutsideOverflowButton()); |
| 3153 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3154 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3155 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3156 IsEmpty()); |
| 3157 |
| 3158 generator.MoveTouch(GetScreenPointInsideOverflowButton()); |
| 3159 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3160 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3161 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3162 IsEmpty()); |
| 3163 |
| 3164 generator.ReleaseTouch(); |
| 3165 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3166 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3167 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3168 IsEmpty()); |
| 3169 |
| 3170 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 3171 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 3172 } |
| 3173 |
| 3174 // Tests ink drop state transitions for the overflow button when it is active |
| 3175 // and the user long presses on the button to show the context menu. |
| 3176 TEST_F(OverflowButtonActiveInkDropTest, TouchContextMenu) { |
| 3177 ui::test::EventGenerator& generator = GetEventGenerator(); |
| 3178 generator.set_current_location(GetScreenPointInsideOverflowButton()); |
| 3179 |
| 3180 { |
| 3181 RunAllPendingInMessageLoop(); |
| 3182 ScopedMockTaskRunnerWrapper mock_task_runner; |
| 3183 |
| 3184 generator.PressTouch(); |
| 3185 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3186 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3187 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3188 IsEmpty()); |
| 3189 |
| 3190 mock_task_runner.FastForwardUntilNoTasksRemain(); |
| 3191 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3192 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3193 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3194 IsEmpty()); |
| 3195 |
| 3196 generator.ReleaseTouch(); |
| 3197 EXPECT_EQ(views::InkDropState::ACTIVATED, |
| 3198 overflow_button_ink_drop_->GetTargetInkDropState()); |
| 3199 EXPECT_THAT(overflow_button_ink_drop_->GetAndResetRequestedStates(), |
| 3200 IsEmpty()); |
| 3201 |
| 3202 ASSERT_TRUE(test_api_->overflow_bubble()); |
| 3203 EXPECT_TRUE(test_api_->overflow_bubble()->IsShowing()); |
| 3204 } |
| 3205 } |
| 3206 |
| 3207 #endif // !defined(OS_WIN) |
| 3208 |
2582 } // namespace test | 3209 } // namespace test |
2583 } // namespace ash | 3210 } // namespace ash |
OLD | NEW |