OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/wm/immersive_fullscreen_controller.h" | 5 #include "ash/wm/immersive_fullscreen_controller.h" |
6 | 6 |
7 #include "ash/display/display_manager.h" | 7 #include "ash/display/display_manager.h" |
8 #include "ash/display/mouse_cursor_event_filter.h" | 8 #include "ash/display/mouse_cursor_event_filter.h" |
9 #include "ash/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
10 #include "ash/shelf/shelf_layout_manager.h" | 10 #include "ash/shelf/shelf_layout_manager.h" |
11 #include "ash/shelf/shelf_types.h" | 11 #include "ash/shelf/shelf_types.h" |
12 #include "ash/shell.h" | 12 #include "ash/shell.h" |
13 #include "ash/test/ash_test_base.h" | 13 #include "ash/test/ash_test_base.h" |
14 #include "ash/test/display_manager_test_api.h" | 14 #include "ash/test/display_manager_test_api.h" |
15 #include "ash/wm/window_state.h" | 15 #include "ash/wm/window_state.h" |
16 #include "ash/wm/window_state_aura.h" | 16 #include "ash/wm/window_state_aura.h" |
17 #include "ui/aura/client/aura_constants.h" | 17 #include "ui/aura/client/aura_constants.h" |
18 #include "ui/aura/client/cursor_client.h" | 18 #include "ui/aura/client/cursor_client.h" |
19 #include "ui/aura/env.h" | 19 #include "ui/aura/env.h" |
20 #include "ui/aura/test/test_window_delegate.h" | 20 #include "ui/aura/test/test_window_delegate.h" |
21 #include "ui/aura/window.h" | 21 #include "ui/aura/window.h" |
22 #include "ui/aura/window_event_dispatcher.h" | 22 #include "ui/aura/window_event_dispatcher.h" |
23 #include "ui/display/manager/display_layout.h" | 23 #include "ui/display/manager/display_layout.h" |
24 #include "ui/events/event_utils.h" | 24 #include "ui/events/event_utils.h" |
25 #include "ui/events/test/event_generator.h" | 25 #include "ui/events/test/event_generator.h" |
26 #include "ui/events/test/test_event_handler.h" | 26 #include "ui/events/test/test_event_handler.h" |
27 #include "ui/gfx/animation/slide_animation.h" | 27 #include "ui/gfx/animation/slide_animation.h" |
28 #include "ui/views/bubble/bubble_delegate.h" | 28 #include "ui/views/bubble/bubble_dialog_delegate.h" |
29 #include "ui/views/controls/native/native_view_host.h" | 29 #include "ui/views/controls/native/native_view_host.h" |
30 #include "ui/views/view.h" | 30 #include "ui/views/view.h" |
31 #include "ui/views/widget/widget.h" | 31 #include "ui/views/widget/widget.h" |
32 | 32 |
33 namespace ash { | 33 namespace ash { |
34 | 34 |
35 namespace { | 35 namespace { |
36 | 36 |
| 37 class TestBubbleDialogDelegate : public views::BubbleDialogDelegateView { |
| 38 public: |
| 39 explicit TestBubbleDialogDelegate(views::View* anchor) |
| 40 : BubbleDialogDelegateView(anchor, views::BubbleBorder::NONE) {} |
| 41 ~TestBubbleDialogDelegate() override {} |
| 42 |
| 43 private: |
| 44 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegate); |
| 45 }; |
| 46 |
37 class MockImmersiveFullscreenControllerDelegate | 47 class MockImmersiveFullscreenControllerDelegate |
38 : public ImmersiveFullscreenController::Delegate { | 48 : public ImmersiveFullscreenController::Delegate { |
39 public: | 49 public: |
40 MockImmersiveFullscreenControllerDelegate(views::View* top_container_view) | 50 MockImmersiveFullscreenControllerDelegate(views::View* top_container_view) |
41 : top_container_view_(top_container_view), | 51 : top_container_view_(top_container_view), |
42 enabled_(false), | 52 enabled_(false), |
43 visible_fraction_(1) { | 53 visible_fraction_(1) { |
44 } | 54 } |
45 ~MockImmersiveFullscreenControllerDelegate() override {} | 55 ~MockImmersiveFullscreenControllerDelegate() override {} |
46 | 56 |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 EXPECT_FALSE(controller()->IsRevealed()); | 668 EXPECT_FALSE(controller()->IsRevealed()); |
659 | 669 |
660 // Initiate reveal via mouse, end reveal via touch. | 670 // Initiate reveal via mouse, end reveal via touch. |
661 AttemptReveal(MODALITY_MOUSE); | 671 AttemptReveal(MODALITY_MOUSE); |
662 EXPECT_TRUE(controller()->IsRevealed()); | 672 EXPECT_TRUE(controller()->IsRevealed()); |
663 AttemptUnreveal(MODALITY_GESTURE_TAP); | 673 AttemptUnreveal(MODALITY_GESTURE_TAP); |
664 EXPECT_FALSE(controller()->IsRevealed()); | 674 EXPECT_FALSE(controller()->IsRevealed()); |
665 } | 675 } |
666 | 676 |
667 // Test when the SWIPE_CLOSE edge gesture closes the top-of-window views. | 677 // Test when the SWIPE_CLOSE edge gesture closes the top-of-window views. |
668 #if defined(OS_WIN) | 678 #if !defined(OS_CHROMEOS) |
669 // On Windows, touch events do not result in mouse events being disabled. As | 679 // On Windows/Linux, touch events do not result in mouse events being disabled. |
670 // a result, the last part of this test which ends the reveal via a gesture will | 680 // As a result, the last part of this test which ends the reveal via a gesture |
671 // not work correctly. See crbug.com/332430, and the function | 681 // will not work correctly. See crbug.com/332430, and the function |
672 // ShouldHideCursorOnTouch() in compound_event_filter.cc. | 682 // ShouldHideCursorOnTouch() in compound_event_filter.cc. |
673 #define MAYBE_EndRevealViaGesture DISABLED_EndRevealViaGesture | 683 #define MAYBE_EndRevealViaGesture DISABLED_EndRevealViaGesture |
674 #else | 684 #else |
675 #define MAYBE_EndRevealViaGesture EndRevealViaGesture | 685 #define MAYBE_EndRevealViaGesture EndRevealViaGesture |
676 #endif | 686 #endif |
677 TEST_F(ImmersiveFullscreenControllerTest, MAYBE_EndRevealViaGesture) { | 687 TEST_F(ImmersiveFullscreenControllerTest, MAYBE_EndRevealViaGesture) { |
678 SetEnabled(true); | 688 SetEnabled(true); |
679 EXPECT_TRUE(controller()->IsEnabled()); | 689 EXPECT_TRUE(controller()->IsEnabled()); |
680 EXPECT_FALSE(controller()->IsRevealed()); | 690 EXPECT_FALSE(controller()->IsRevealed()); |
681 | 691 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 views::View* unrelated_view = new views::View(); | 917 views::View* unrelated_view = new views::View(); |
908 unrelated_view->SetBounds(0, 100, 10, 10); | 918 unrelated_view->SetBounds(0, 100, 10, 10); |
909 top_container()->parent()->AddChildView(unrelated_view); | 919 top_container()->parent()->AddChildView(unrelated_view); |
910 | 920 |
911 SetEnabled(true); | 921 SetEnabled(true); |
912 ASSERT_FALSE(controller()->IsRevealed()); | 922 ASSERT_FALSE(controller()->IsRevealed()); |
913 | 923 |
914 // 1) Test that a bubble anchored to a child of the top container triggers | 924 // 1) Test that a bubble anchored to a child of the top container triggers |
915 // a reveal and keeps the top-of-window views revealed for the duration of | 925 // a reveal and keeps the top-of-window views revealed for the duration of |
916 // its visibility. | 926 // its visibility. |
917 views::Widget* bubble_widget1(views::BubbleDelegateView::CreateBubble( | 927 views::Widget* bubble_widget1(views::BubbleDialogDelegateView::CreateBubble( |
918 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE))); | 928 new TestBubbleDialogDelegate(child_view))); |
919 bubble_widget1->Show(); | 929 bubble_widget1->Show(); |
920 EXPECT_TRUE(controller()->IsRevealed()); | 930 EXPECT_TRUE(controller()->IsRevealed()); |
921 | 931 |
922 // Activating |top_container_widget| will close |bubble_widget1|. | 932 // Activating |top_container_widget| will close |bubble_widget1|. |
923 top_container_widget->Activate(); | 933 top_container_widget->Activate(); |
924 AttemptReveal(MODALITY_MOUSE); | 934 AttemptReveal(MODALITY_MOUSE); |
925 revealed_lock.reset(controller()->GetRevealedLock( | 935 revealed_lock.reset(controller()->GetRevealedLock( |
926 ImmersiveFullscreenController::ANIMATE_REVEAL_NO)); | 936 ImmersiveFullscreenController::ANIMATE_REVEAL_NO)); |
927 EXPECT_TRUE(controller()->IsRevealed()); | 937 EXPECT_TRUE(controller()->IsRevealed()); |
928 | 938 |
929 views::Widget* bubble_widget2 = views::BubbleDelegateView::CreateBubble( | 939 views::Widget* bubble_widget2 = views::BubbleDialogDelegateView::CreateBubble( |
930 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); | 940 new TestBubbleDialogDelegate(child_view)); |
931 bubble_widget2->Show(); | 941 bubble_widget2->Show(); |
932 EXPECT_TRUE(controller()->IsRevealed()); | 942 EXPECT_TRUE(controller()->IsRevealed()); |
933 revealed_lock.reset(); | 943 revealed_lock.reset(); |
934 SetHovered(false); | 944 SetHovered(false); |
935 EXPECT_TRUE(controller()->IsRevealed()); | 945 EXPECT_TRUE(controller()->IsRevealed()); |
936 bubble_widget2->Close(); | 946 bubble_widget2->Close(); |
937 EXPECT_FALSE(controller()->IsRevealed()); | 947 EXPECT_FALSE(controller()->IsRevealed()); |
938 | 948 |
939 // 2) Test that transitioning from keeping the top-of-window views revealed | 949 // 2) Test that transitioning from keeping the top-of-window views revealed |
940 // because of a bubble to keeping the top-of-window views revealed because of | 950 // because of a bubble to keeping the top-of-window views revealed because of |
941 // mouse hover by activating |top_container_widget| works. | 951 // mouse hover by activating |top_container_widget| works. |
942 views::Widget* bubble_widget3 = views::BubbleDelegateView::CreateBubble( | 952 views::Widget* bubble_widget3 = views::BubbleDialogDelegateView::CreateBubble( |
943 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); | 953 new TestBubbleDialogDelegate(child_view)); |
944 bubble_widget3->Show(); | 954 bubble_widget3->Show(); |
945 SetHovered(true); | 955 SetHovered(true); |
946 EXPECT_TRUE(controller()->IsRevealed()); | 956 EXPECT_TRUE(controller()->IsRevealed()); |
947 top_container_widget->Activate(); | 957 top_container_widget->Activate(); |
948 EXPECT_TRUE(controller()->IsRevealed()); | 958 EXPECT_TRUE(controller()->IsRevealed()); |
949 | 959 |
950 // 3) Test that the top-of-window views stay revealed as long as at least one | 960 // 3) Test that the top-of-window views stay revealed as long as at least one |
951 // bubble anchored to a child of the top container is visible. | 961 // bubble anchored to a child of the top container is visible. |
952 SetHovered(false); | 962 SetHovered(false); |
953 EXPECT_FALSE(controller()->IsRevealed()); | 963 EXPECT_FALSE(controller()->IsRevealed()); |
954 | 964 |
955 views::BubbleDelegateView* bubble_delegate4(new views::BubbleDelegateView( | 965 views::BubbleDialogDelegateView* bubble_delegate4( |
956 child_view, views::BubbleBorder::NONE)); | 966 new TestBubbleDialogDelegate(child_view)); |
957 bubble_delegate4->set_can_activate(false); | 967 bubble_delegate4->set_can_activate(false); |
958 views::Widget* bubble_widget4(views::BubbleDelegateView::CreateBubble( | 968 views::Widget* bubble_widget4( |
959 bubble_delegate4)); | 969 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate4)); |
960 bubble_widget4->Show(); | 970 bubble_widget4->Show(); |
961 | 971 |
962 views::BubbleDelegateView* bubble_delegate5(new views::BubbleDelegateView( | 972 views::BubbleDialogDelegateView* bubble_delegate5( |
963 child_view, views::BubbleBorder::NONE)); | 973 new TestBubbleDialogDelegate(child_view)); |
964 bubble_delegate5->set_can_activate(false); | 974 bubble_delegate5->set_can_activate(false); |
965 views::Widget* bubble_widget5(views::BubbleDelegateView::CreateBubble( | 975 views::Widget* bubble_widget5( |
966 bubble_delegate5)); | 976 views::BubbleDialogDelegateView::CreateBubble(bubble_delegate5)); |
967 bubble_widget5->Show(); | 977 bubble_widget5->Show(); |
968 | 978 |
969 EXPECT_TRUE(controller()->IsRevealed()); | 979 EXPECT_TRUE(controller()->IsRevealed()); |
970 bubble_widget4->Hide(); | 980 bubble_widget4->Hide(); |
971 EXPECT_TRUE(controller()->IsRevealed()); | 981 EXPECT_TRUE(controller()->IsRevealed()); |
972 bubble_widget5->Hide(); | 982 bubble_widget5->Hide(); |
973 EXPECT_FALSE(controller()->IsRevealed()); | 983 EXPECT_FALSE(controller()->IsRevealed()); |
974 bubble_widget5->Show(); | 984 bubble_widget5->Show(); |
975 EXPECT_TRUE(controller()->IsRevealed()); | 985 EXPECT_TRUE(controller()->IsRevealed()); |
976 | 986 |
977 // 4) Test that visibility changes which occur while immersive fullscreen is | 987 // 4) Test that visibility changes which occur while immersive fullscreen is |
978 // disabled are handled upon reenabling immersive fullscreen. | 988 // disabled are handled upon reenabling immersive fullscreen. |
979 SetEnabled(false); | 989 SetEnabled(false); |
980 bubble_widget5->Hide(); | 990 bubble_widget5->Hide(); |
981 SetEnabled(true); | 991 SetEnabled(true); |
982 EXPECT_FALSE(controller()->IsRevealed()); | 992 EXPECT_FALSE(controller()->IsRevealed()); |
983 | 993 |
984 // We do not need |bubble_widget4| or |bubble_widget5| anymore, close them. | 994 // We do not need |bubble_widget4| or |bubble_widget5| anymore, close them. |
985 bubble_widget4->Close(); | 995 bubble_widget4->Close(); |
986 bubble_widget5->Close(); | 996 bubble_widget5->Close(); |
987 | 997 |
988 // 5) Test that a bubble added while immersive fullscreen is disabled is | 998 // 5) Test that a bubble added while immersive fullscreen is disabled is |
989 // handled upon reenabling immersive fullscreen. | 999 // handled upon reenabling immersive fullscreen. |
990 SetEnabled(false); | 1000 SetEnabled(false); |
991 | 1001 |
992 views::Widget* bubble_widget6 = views::BubbleDelegateView::CreateBubble( | 1002 views::Widget* bubble_widget6 = views::BubbleDialogDelegateView::CreateBubble( |
993 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); | 1003 new TestBubbleDialogDelegate(child_view)); |
994 bubble_widget6->Show(); | 1004 bubble_widget6->Show(); |
995 | 1005 |
996 SetEnabled(true); | 1006 SetEnabled(true); |
997 EXPECT_TRUE(controller()->IsRevealed()); | 1007 EXPECT_TRUE(controller()->IsRevealed()); |
998 | 1008 |
999 bubble_widget6->Close(); | 1009 bubble_widget6->Close(); |
1000 | 1010 |
1001 // 6) Test that a bubble which is not anchored to a child of the | 1011 // 6) Test that a bubble which is not anchored to a child of the |
1002 // TopContainerView does not trigger a reveal or keep the | 1012 // TopContainerView does not trigger a reveal or keep the |
1003 // top-of-window views revealed if they are already revealed. | 1013 // top-of-window views revealed if they are already revealed. |
1004 views::Widget* bubble_widget7 = views::BubbleDelegateView::CreateBubble( | 1014 views::Widget* bubble_widget7 = views::BubbleDialogDelegateView::CreateBubble( |
1005 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); | 1015 new TestBubbleDialogDelegate(unrelated_view)); |
1006 bubble_widget7->Show(); | 1016 bubble_widget7->Show(); |
1007 EXPECT_FALSE(controller()->IsRevealed()); | 1017 EXPECT_FALSE(controller()->IsRevealed()); |
1008 | 1018 |
1009 // Activating |top_container_widget| will close |bubble_widget6|. | 1019 // Activating |top_container_widget| will close |bubble_widget6|. |
1010 top_container_widget->Activate(); | 1020 top_container_widget->Activate(); |
1011 AttemptReveal(MODALITY_MOUSE); | 1021 AttemptReveal(MODALITY_MOUSE); |
1012 EXPECT_TRUE(controller()->IsRevealed()); | 1022 EXPECT_TRUE(controller()->IsRevealed()); |
1013 | 1023 |
1014 views::Widget* bubble_widget8 = views::BubbleDelegateView::CreateBubble( | 1024 views::Widget* bubble_widget8 = views::BubbleDialogDelegateView::CreateBubble( |
1015 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); | 1025 new TestBubbleDialogDelegate(unrelated_view)); |
1016 bubble_widget8->Show(); | 1026 bubble_widget8->Show(); |
1017 SetHovered(false); | 1027 SetHovered(false); |
1018 EXPECT_FALSE(controller()->IsRevealed()); | 1028 EXPECT_FALSE(controller()->IsRevealed()); |
1019 bubble_widget8->Close(); | 1029 bubble_widget8->Close(); |
1020 } | 1030 } |
1021 | 1031 |
1022 #endif // defined(OS_WIN) | 1032 #endif // defined(OS_WIN) |
1023 | 1033 |
1024 // Test that the shelf is set to auto hide as long as the window is in | 1034 // Test that the shelf is set to auto hide as long as the window is in |
1025 // immersive fullscreen and that the shelf's state before entering immersive | 1035 // immersive fullscreen and that the shelf's state before entering immersive |
(...skipping 28 matching lines...) Expand all Loading... |
1054 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | 1064 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); |
1055 | 1065 |
1056 // Disabling immersive fullscreen maintains the user's auto-hide selection. | 1066 // Disabling immersive fullscreen maintains the user's auto-hide selection. |
1057 SetEnabled(false); | 1067 SetEnabled(false); |
1058 window()->SetProperty(aura::client::kShowStateKey, | 1068 window()->SetProperty(aura::client::kShowStateKey, |
1059 ui::SHOW_STATE_NORMAL); | 1069 ui::SHOW_STATE_NORMAL); |
1060 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); | 1070 EXPECT_EQ(ash::SHELF_AUTO_HIDE, shelf->visibility_state()); |
1061 } | 1071 } |
1062 | 1072 |
1063 } // namespase ash | 1073 } // namespase ash |
OLD | NEW |