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 <algorithm> | 5 #include <algorithm> |
6 #include <memory> | 6 #include <memory> |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
731 | 731 |
732 // Set a widget to Close() the next time the Widget being observed is hidden. | 732 // Set a widget to Close() the next time the Widget being observed is hidden. |
733 void CloseOnNextHide(Widget* widget) { | 733 void CloseOnNextHide(Widget* widget) { |
734 widget_to_close_on_hide_ = widget; | 734 widget_to_close_on_hide_ = widget; |
735 } | 735 } |
736 | 736 |
737 // Overridden from WidgetObserver: | 737 // Overridden from WidgetObserver: |
738 void OnWidgetDestroying(Widget* widget) override { | 738 void OnWidgetDestroying(Widget* widget) override { |
739 if (active_ == widget) | 739 if (active_ == widget) |
740 active_ = nullptr; | 740 active_ = nullptr; |
741 if (widget_activated_ == widget) | |
742 widget_activated_ = nullptr; | |
741 widget_closed_ = widget; | 743 widget_closed_ = widget; |
742 } | 744 } |
743 | 745 |
744 void OnWidgetActivationChanged(Widget* widget, bool active) override { | 746 void OnWidgetActivationChanged(Widget* widget, bool active) override { |
745 if (active) { | 747 if (active) { |
746 if (widget_activated_) | 748 if (widget_activated_) |
747 widget_activated_->Deactivate(); | 749 widget_activated_->Deactivate(); |
748 widget_activated_ = widget; | 750 widget_activated_ = widget; |
749 active_ = widget; | 751 active_ = widget; |
750 } else { | 752 } else { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
801 Widget* widget_closed_; | 803 Widget* widget_closed_; |
802 Widget* widget_activated_; | 804 Widget* widget_activated_; |
803 Widget* widget_deactivated_; | 805 Widget* widget_deactivated_; |
804 Widget* widget_shown_; | 806 Widget* widget_shown_; |
805 Widget* widget_hidden_; | 807 Widget* widget_hidden_; |
806 Widget* widget_bounds_changed_; | 808 Widget* widget_bounds_changed_; |
807 | 809 |
808 Widget* widget_to_close_on_hide_; | 810 Widget* widget_to_close_on_hide_; |
809 }; | 811 }; |
810 | 812 |
811 TEST_F(WidgetObserverTest, DISABLED_ActivationChange) { | 813 TEST_F(WidgetObserverTest, ActivationChange) { |
812 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); | 814 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); |
813 | 815 WidgetAutoclosePtr toplevel1(NewWidget()); |
814 Widget* toplevel1 = NewWidget(); | 816 WidgetAutoclosePtr toplevel2(NewWidget()); |
815 Widget* toplevel2 = NewWidget(); | |
816 | 817 |
817 toplevel1->Show(); | 818 toplevel1->Show(); |
818 toplevel2->Show(); | 819 toplevel2->Show(); |
819 | 820 |
820 reset(); | 821 reset(); |
821 | 822 |
822 toplevel1->Activate(); | 823 toplevel1->Activate(); |
823 | 824 |
824 RunPendingMessages(); | 825 RunPendingMessages(); |
825 EXPECT_EQ(toplevel1, widget_activated()); | 826 EXPECT_EQ(toplevel1.get(), widget_activated()); |
826 | 827 |
827 toplevel2->Activate(); | 828 toplevel2->Activate(); |
828 RunPendingMessages(); | 829 RunPendingMessages(); |
829 EXPECT_EQ(toplevel1, widget_deactivated()); | 830 EXPECT_EQ(toplevel1.get(), widget_deactivated()); |
830 EXPECT_EQ(toplevel2, widget_activated()); | 831 EXPECT_EQ(toplevel2.get(), widget_activated()); |
831 EXPECT_EQ(toplevel2, active()); | 832 EXPECT_EQ(toplevel2.get(), active()); |
832 } | 833 } |
833 | 834 |
834 TEST_F(WidgetObserverTest, DISABLED_VisibilityChange) { | 835 namespace { |
836 | |
837 // This class simulates a focus manager that moves focus to a second widget when | |
838 // the first one is closed. It simulates a situation where a sequence of widget | |
839 // observers might try to call Widget::Close in response to a OnWidgetClosing(). | |
840 class WidgetFocusManager : public TestWidgetObserver { | |
sky
2017/04/25 05:04:10
This name implies it's some how related to views::
Evan Stade
2017/04/25 22:52:51
done (WidgetActivationForwarder)
| |
841 public: | |
842 explicit WidgetFocusManager(Widget* first_widget, Widget* second_widget) | |
sky
2017/04/25 05:04:10
no explicit.
Evan Stade
2017/04/25 22:52:51
Done.
| |
843 : TestWidgetObserver(first_widget), second_widget_(second_widget) {} | |
844 | |
845 ~WidgetFocusManager() override {} | |
846 | |
847 private: | |
848 // WidgetObserver overrides: | |
849 void OnWidgetClosing(Widget* widget) override { | |
850 widget->OnNativeWidgetActivationChanged(false); | |
851 second_widget_->Activate(); | |
852 } | |
853 void OnWidgetActivationChanged(Widget* widget, bool active) override { | |
854 if (!active) | |
855 widget->Close(); | |
856 } | |
857 | |
858 Widget* second_widget_; | |
sky
2017/04/25 05:04:10
optional: widget_to_close_?
Evan Stade
2017/04/25 22:52:51
Done.
| |
859 | |
860 DISALLOW_COPY_AND_ASSIGN(WidgetFocusManager); | |
861 }; | |
862 | |
863 // This class observes a widget and counts the number of times OnWidgetClosing | |
864 // is called. | |
865 class WidgetCloseCounter : public TestWidgetObserver { | |
866 public: | |
867 explicit WidgetCloseCounter(Widget* widget) : TestWidgetObserver(widget) {} | |
868 | |
869 ~WidgetCloseCounter() override {} | |
870 | |
871 int close_count() const { return close_count_; } | |
872 | |
873 private: | |
874 // WidgetObserver overrides: | |
875 void OnWidgetClosing(Widget* widget) override { close_count_++; } | |
876 | |
877 int close_count_ = 0; | |
878 | |
879 DISALLOW_COPY_AND_ASSIGN(WidgetCloseCounter); | |
880 }; | |
881 | |
882 } // namespace | |
883 | |
884 // Test for crbug.com/714334 | |
sky
2017/04/25 05:04:10
I'm ok referencing bugs ids, but I shouldn't need
Evan Stade
2017/04/25 22:52:51
Done.
| |
885 TEST_F(WidgetObserverTest, CloseReentrancy) { | |
886 Widget* widget1 = CreateTopLevelPlatformWidget(); | |
887 Widget* widget2 = CreateTopLevelPlatformWidget(); | |
888 WidgetCloseCounter counter(widget1); | |
889 WidgetFocusManager focus_manager(widget1, widget2); | |
890 widget1->Close(); | |
891 EXPECT_EQ(1, counter.close_count()); | |
892 widget2->Close(); | |
893 } | |
894 | |
895 TEST_F(WidgetObserverTest, VisibilityChange) { | |
835 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); | 896 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); |
836 | 897 WidgetAutoclosePtr child1(NewWidget()); |
837 Widget* child1 = NewWidget(); | 898 WidgetAutoclosePtr child2(NewWidget()); |
838 Widget* child2 = NewWidget(); | |
839 | 899 |
840 toplevel->Show(); | 900 toplevel->Show(); |
841 child1->Show(); | 901 child1->Show(); |
842 child2->Show(); | 902 child2->Show(); |
843 | 903 |
844 reset(); | 904 reset(); |
845 | 905 |
846 child1->Hide(); | 906 child1->Hide(); |
847 EXPECT_EQ(child1, widget_hidden()); | 907 EXPECT_EQ(child1.get(), widget_hidden()); |
848 | 908 |
849 child2->Hide(); | 909 child2->Hide(); |
850 EXPECT_EQ(child2, widget_hidden()); | 910 EXPECT_EQ(child2.get(), widget_hidden()); |
851 | 911 |
852 child1->Show(); | 912 child1->Show(); |
853 EXPECT_EQ(child1, widget_shown()); | 913 EXPECT_EQ(child1.get(), widget_shown()); |
854 | 914 |
855 child2->Show(); | 915 child2->Show(); |
856 EXPECT_EQ(child2, widget_shown()); | 916 EXPECT_EQ(child2.get(), widget_shown()); |
857 } | 917 } |
858 | 918 |
859 TEST_F(WidgetObserverTest, DestroyBubble) { | 919 TEST_F(WidgetObserverTest, DestroyBubble) { |
860 // This test expect NativeWidgetAura, force its creation. | 920 // This test expect NativeWidgetAura, force its creation. |
861 ViewsDelegate::GetInstance()->set_native_widget_factory( | 921 ViewsDelegate::GetInstance()->set_native_widget_factory( |
862 ViewsDelegate::NativeWidgetFactory()); | 922 ViewsDelegate::NativeWidgetFactory()); |
863 | 923 |
864 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); | 924 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); |
865 anchor->Show(); | 925 anchor->Show(); |
866 | 926 |
(...skipping 3005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3872 } | 3932 } |
3873 | 3933 |
3874 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { | 3934 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { |
3875 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); | 3935 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); |
3876 } | 3936 } |
3877 | 3937 |
3878 #endif // !defined(OS_CHROMEOS) | 3938 #endif // !defined(OS_CHROMEOS) |
3879 | 3939 |
3880 } // namespace test | 3940 } // namespace test |
3881 } // namespace views | 3941 } // namespace views |
OLD | NEW |