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 "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" | 5 #include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" |
6 | 6 |
7 #include "ash/display/display_controller.h" | 7 #include "ash/display/display_controller.h" |
8 #include "ash/shell.h" | 8 #include "ash/shell.h" |
9 #include "ash/test/ash_test_base.h" | 9 #include "ash/test/ash_test_base.h" |
10 #include "chrome/browser/ui/immersive_fullscreen_configuration.h" | 10 #include "chrome/browser/ui/immersive_fullscreen_configuration.h" |
11 #include "ui/aura/client/cursor_client.h" | 11 #include "ui/aura/client/cursor_client.h" |
12 #include "ui/aura/env.h" | 12 #include "ui/aura/env.h" |
13 #include "ui/aura/root_window.h" | 13 #include "ui/aura/root_window.h" |
14 #include "ui/aura/test/event_generator.h" | 14 #include "ui/aura/test/event_generator.h" |
15 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
| 16 #include "ui/base/animation/slide_animation.h" |
16 #include "ui/views/bubble/bubble_delegate.h" | 17 #include "ui/views/bubble/bubble_delegate.h" |
17 | 18 |
18 // For now, immersive fullscreen is Chrome OS only. | 19 // For now, immersive fullscreen is Chrome OS only. |
19 #if defined(OS_CHROMEOS) | 20 #if defined(OS_CHROMEOS) |
20 | 21 |
21 ///////////////////////////////////////////////////////////////////////////// | 22 ///////////////////////////////////////////////////////////////////////////// |
22 | 23 |
23 class MockImmersiveModeControllerDelegate | 24 class MockImmersiveModeControllerDelegate |
24 : public ImmersiveModeController::Delegate { | 25 : public ImmersiveModeController::Delegate { |
25 public: | 26 public: |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 widget_->Init(params); | 90 widget_->Init(params); |
90 widget_->Show(); | 91 widget_->Show(); |
91 | 92 |
92 top_container_ = new views::View(); | 93 top_container_ = new views::View(); |
93 top_container_->SetBounds(0, 0, 500, 100); | 94 top_container_->SetBounds(0, 0, 500, 100); |
94 top_container_->set_focusable(true); | 95 top_container_->set_focusable(true); |
95 | 96 |
96 widget_->GetContentsView()->AddChildView(top_container_); | 97 widget_->GetContentsView()->AddChildView(top_container_); |
97 | 98 |
98 controller_->Init(delegate_.get(), widget_, top_container_); | 99 controller_->Init(delegate_.get(), widget_, top_container_); |
99 controller_->DisableAnimationsForTest(); | 100 SetAnimationsDisabled(true); |
| 101 } |
| 102 |
| 103 // Enable or disable the immersive mode controller's animations. When the |
| 104 // immersive mode controller's animations are disabled, some behavior is |
| 105 // slightly different. In particular, the behavior is different when there |
| 106 // is a transfer in which lock keeps the top-of-window views revealed (eg |
| 107 // bubble keeps top-of-window views revealed -> mouse keeps top-of-window |
| 108 // views revealed). It is necessary to temparily enable the immersive |
| 109 // controller's animations to get the correct behavior in tests. |
| 110 void SetAnimationsDisabled(bool disabled) { |
| 111 controller_->animations_disabled_for_test_ = disabled; |
| 112 // Force any in progress animations to finish. |
| 113 if (disabled) |
| 114 controller_->animation_->End(); |
100 } | 115 } |
101 | 116 |
102 // Attempt to reveal the top-of-window views via |modality|. | 117 // Attempt to reveal the top-of-window views via |modality|. |
103 // The top-of-window views can only be revealed via mouse hover or a gesture. | 118 // The top-of-window views can only be revealed via mouse hover or a gesture. |
104 void AttemptReveal(Modality modality) { | 119 void AttemptReveal(Modality modality) { |
105 ASSERT_NE(modality, MODALITY_TOUCH); | 120 ASSERT_NE(modality, MODALITY_TOUCH); |
106 AttemptRevealStateChange(true, modality); | 121 AttemptRevealStateChange(true, modality); |
107 } | 122 } |
108 | 123 |
109 // Attempt to unreveal the top-of-window views via |modality|. The | 124 // Attempt to unreveal the top-of-window views via |modality|. The |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 views::Widget* bubble_widget2 = views::BubbleDelegateView::CreateBubble( | 662 views::Widget* bubble_widget2 = views::BubbleDelegateView::CreateBubble( |
648 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); | 663 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); |
649 bubble_widget2->Show(); | 664 bubble_widget2->Show(); |
650 EXPECT_TRUE(controller()->IsRevealed()); | 665 EXPECT_TRUE(controller()->IsRevealed()); |
651 revealed_lock.reset(); | 666 revealed_lock.reset(); |
652 SetHovered(false); | 667 SetHovered(false); |
653 EXPECT_TRUE(controller()->IsRevealed()); | 668 EXPECT_TRUE(controller()->IsRevealed()); |
654 bubble_widget2->Close(); | 669 bubble_widget2->Close(); |
655 EXPECT_FALSE(controller()->IsRevealed()); | 670 EXPECT_FALSE(controller()->IsRevealed()); |
656 | 671 |
657 // 2) Test that the top-of-window views stay revealed as long as at least one | 672 // 2) Test that transitioning from keeping the top-of-window views revealed |
| 673 // because of a bubble to keeping the top-of-window views revealed because of |
| 674 // mouse hover by activating |top_container_widget| works. |
| 675 views::Widget* bubble_widget3 = views::BubbleDelegateView::CreateBubble( |
| 676 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); |
| 677 bubble_widget3->Show(); |
| 678 SetHovered(true); |
| 679 EXPECT_TRUE(controller()->IsRevealed()); |
| 680 |
| 681 SetAnimationsDisabled(false); |
| 682 // Activating |top_container_widget| will close |bubble_widget3|. |
| 683 top_container_widget->Activate(); |
| 684 SetAnimationsDisabled(true); |
| 685 EXPECT_TRUE(controller()->IsRevealed()); |
| 686 |
| 687 // 3) Test that the top-of-window views stay revealed as long as at least one |
658 // bubble anchored to a child of the top container is visible. | 688 // bubble anchored to a child of the top container is visible. |
659 views::BubbleDelegateView* bubble_delegate3(new views::BubbleDelegateView( | 689 SetHovered(false); |
660 child_view, views::BubbleBorder::NONE)); | 690 EXPECT_FALSE(controller()->IsRevealed()); |
661 bubble_delegate3->set_use_focusless(true); | |
662 views::Widget* bubble_widget3(views::BubbleDelegateView::CreateBubble( | |
663 bubble_delegate3)); | |
664 bubble_widget3->Show(); | |
665 | 691 |
666 views::BubbleDelegateView* bubble_delegate4(new views::BubbleDelegateView( | 692 views::BubbleDelegateView* bubble_delegate4(new views::BubbleDelegateView( |
667 child_view, views::BubbleBorder::NONE)); | 693 child_view, views::BubbleBorder::NONE)); |
668 bubble_delegate4->set_use_focusless(true); | 694 bubble_delegate4->set_use_focusless(true); |
669 views::Widget* bubble_widget4(views::BubbleDelegateView::CreateBubble( | 695 views::Widget* bubble_widget4(views::BubbleDelegateView::CreateBubble( |
670 bubble_delegate4)); | 696 bubble_delegate4)); |
671 bubble_widget4->Show(); | 697 bubble_widget4->Show(); |
672 | 698 |
673 EXPECT_TRUE(controller()->IsRevealed()); | 699 views::BubbleDelegateView* bubble_delegate5(new views::BubbleDelegateView( |
674 bubble_widget3->Hide(); | 700 child_view, views::BubbleBorder::NONE)); |
| 701 bubble_delegate5->set_use_focusless(true); |
| 702 views::Widget* bubble_widget5(views::BubbleDelegateView::CreateBubble( |
| 703 bubble_delegate5)); |
| 704 bubble_widget5->Show(); |
| 705 |
675 EXPECT_TRUE(controller()->IsRevealed()); | 706 EXPECT_TRUE(controller()->IsRevealed()); |
676 bubble_widget4->Hide(); | 707 bubble_widget4->Hide(); |
| 708 EXPECT_TRUE(controller()->IsRevealed()); |
| 709 bubble_widget5->Hide(); |
677 EXPECT_FALSE(controller()->IsRevealed()); | 710 EXPECT_FALSE(controller()->IsRevealed()); |
678 bubble_widget4->Show(); | 711 bubble_widget5->Show(); |
679 EXPECT_TRUE(controller()->IsRevealed()); | 712 EXPECT_TRUE(controller()->IsRevealed()); |
680 | 713 |
681 // 3) Test that visibility changes which occur while immersive fullscreen is | 714 // 4) Test that visibility changes which occur while immersive fullscreen is |
682 // disabled are handled upon reenabling immersive fullscreen. | 715 // disabled are handled upon reenabling immersive fullscreen. |
683 controller()->SetEnabled(false); | 716 controller()->SetEnabled(false); |
684 bubble_widget4->Hide(); | 717 bubble_widget5->Hide(); |
685 controller()->SetEnabled(true); | 718 controller()->SetEnabled(true); |
686 EXPECT_FALSE(controller()->IsRevealed()); | 719 EXPECT_FALSE(controller()->IsRevealed()); |
687 | 720 |
688 // We do not need |bubble_widget3| or |bubble_widget4| anymore, close them. | 721 // We do not need |bubble_widget4| or |bubble_widget5| anymore, close them. |
689 bubble_widget3->Close(); | |
690 bubble_widget4->Close(); | 722 bubble_widget4->Close(); |
| 723 bubble_widget5->Close(); |
691 | 724 |
692 // 4) Test that a bubble added while immersive fullscreen is disabled is | 725 // 5) Test that a bubble added while immersive fullscreen is disabled is |
693 // handled upon reenabling immersive fullscreen. | 726 // handled upon reenabling immersive fullscreen. |
694 controller()->SetEnabled(false); | 727 controller()->SetEnabled(false); |
695 | 728 |
696 views::Widget* bubble_widget5 = views::BubbleDelegateView::CreateBubble( | 729 views::Widget* bubble_widget6 = views::BubbleDelegateView::CreateBubble( |
697 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); | 730 new views::BubbleDelegateView(child_view, views::BubbleBorder::NONE)); |
698 bubble_widget5->Show(); | 731 bubble_widget6->Show(); |
699 | 732 |
700 controller()->SetEnabled(true); | 733 controller()->SetEnabled(true); |
701 EXPECT_TRUE(controller()->IsRevealed()); | 734 EXPECT_TRUE(controller()->IsRevealed()); |
702 | 735 |
703 bubble_widget5->Close(); | 736 bubble_widget6->Close(); |
704 | 737 |
705 // 5) Test that a bubble which is not anchored to a child of the | 738 // 6) Test that a bubble which is not anchored to a child of the |
706 // TopContainerView does not trigger a reveal or keep the | 739 // TopContainerView does not trigger a reveal or keep the |
707 // top-of-window views revealed if they are already revealed. | 740 // top-of-window views revealed if they are already revealed. |
708 views::Widget* bubble_widget6 = views::BubbleDelegateView::CreateBubble( | 741 views::Widget* bubble_widget7 = views::BubbleDelegateView::CreateBubble( |
709 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); | 742 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); |
710 bubble_widget6->Show(); | 743 bubble_widget7->Show(); |
711 EXPECT_FALSE(controller()->IsRevealed()); | 744 EXPECT_FALSE(controller()->IsRevealed()); |
712 | 745 |
713 // Activating |top_container_widget| will close |bubble_widget6|. | 746 // Activating |top_container_widget| will close |bubble_widget6|. |
714 top_container_widget->Activate(); | 747 top_container_widget->Activate(); |
715 AttemptReveal(MODALITY_MOUSE); | 748 AttemptReveal(MODALITY_MOUSE); |
716 EXPECT_TRUE(controller()->IsRevealed()); | 749 EXPECT_TRUE(controller()->IsRevealed()); |
717 | 750 |
718 views::Widget* bubble_widget7 = views::BubbleDelegateView::CreateBubble( | 751 views::Widget* bubble_widget8 = views::BubbleDelegateView::CreateBubble( |
719 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); | 752 new views::BubbleDelegateView(unrelated_view, views::BubbleBorder::NONE)); |
720 bubble_widget7->Show(); | 753 bubble_widget8->Show(); |
721 SetHovered(false); | 754 SetHovered(false); |
722 EXPECT_FALSE(controller()->IsRevealed()); | 755 EXPECT_FALSE(controller()->IsRevealed()); |
723 bubble_widget7->Close(); | 756 bubble_widget8->Close(); |
724 } | 757 } |
725 | 758 |
726 #endif // defined(OS_WIN) | 759 #endif // defined(OS_WIN) |
727 | 760 |
728 #endif // defined(OS_CHROMEOS) | 761 #endif // defined(OS_CHROMEOS) |
OLD | NEW |