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; | |
743 widget_closed_ = widget; | 741 widget_closed_ = widget; |
744 } | 742 } |
745 | 743 |
746 void OnWidgetActivationChanged(Widget* widget, bool active) override { | 744 void OnWidgetActivationChanged(Widget* widget, bool active) override { |
747 if (active) { | 745 if (active) { |
748 if (widget_activated_) | 746 if (widget_activated_) |
749 widget_activated_->Deactivate(); | 747 widget_activated_->Deactivate(); |
750 widget_activated_ = widget; | 748 widget_activated_ = widget; |
751 active_ = widget; | 749 active_ = widget; |
752 } else { | 750 } else { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 Widget* widget_closed_; | 801 Widget* widget_closed_; |
804 Widget* widget_activated_; | 802 Widget* widget_activated_; |
805 Widget* widget_deactivated_; | 803 Widget* widget_deactivated_; |
806 Widget* widget_shown_; | 804 Widget* widget_shown_; |
807 Widget* widget_hidden_; | 805 Widget* widget_hidden_; |
808 Widget* widget_bounds_changed_; | 806 Widget* widget_bounds_changed_; |
809 | 807 |
810 Widget* widget_to_close_on_hide_; | 808 Widget* widget_to_close_on_hide_; |
811 }; | 809 }; |
812 | 810 |
813 TEST_F(WidgetObserverTest, ActivationChange) { | 811 TEST_F(WidgetObserverTest, DISABLED_ActivationChange) { |
814 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); | 812 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); |
815 WidgetAutoclosePtr toplevel1(NewWidget()); | 813 |
816 WidgetAutoclosePtr toplevel2(NewWidget()); | 814 Widget* toplevel1 = NewWidget(); |
| 815 Widget* toplevel2 = NewWidget(); |
817 | 816 |
818 toplevel1->Show(); | 817 toplevel1->Show(); |
819 toplevel2->Show(); | 818 toplevel2->Show(); |
820 | 819 |
821 reset(); | 820 reset(); |
822 | 821 |
823 toplevel1->Activate(); | 822 toplevel1->Activate(); |
824 | 823 |
825 RunPendingMessages(); | 824 RunPendingMessages(); |
826 EXPECT_EQ(toplevel1.get(), widget_activated()); | 825 EXPECT_EQ(toplevel1, widget_activated()); |
827 | 826 |
828 toplevel2->Activate(); | 827 toplevel2->Activate(); |
829 RunPendingMessages(); | 828 RunPendingMessages(); |
830 EXPECT_EQ(toplevel1.get(), widget_deactivated()); | 829 EXPECT_EQ(toplevel1, widget_deactivated()); |
831 EXPECT_EQ(toplevel2.get(), widget_activated()); | 830 EXPECT_EQ(toplevel2, widget_activated()); |
832 EXPECT_EQ(toplevel2.get(), active()); | 831 EXPECT_EQ(toplevel2, active()); |
833 } | 832 } |
834 | 833 |
835 namespace { | 834 TEST_F(WidgetObserverTest, DISABLED_VisibilityChange) { |
| 835 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); |
836 | 836 |
837 // This class simulates a focus manager that moves focus to a second widget when | 837 Widget* child1 = NewWidget(); |
838 // the first one is closed. It simulates a situation where a sequence of widget | 838 Widget* child2 = NewWidget(); |
839 // observers might try to call Widget::Close in response to a OnWidgetClosing(). | |
840 class WidgetActivationForwarder : public TestWidgetObserver { | |
841 public: | |
842 WidgetActivationForwarder(Widget* current_active_widget, | |
843 Widget* widget_to_activate) | |
844 : TestWidgetObserver(current_active_widget), | |
845 widget_to_activate_(widget_to_activate) {} | |
846 | |
847 ~WidgetActivationForwarder() override {} | |
848 | |
849 private: | |
850 // WidgetObserver overrides: | |
851 void OnWidgetClosing(Widget* widget) override { | |
852 widget->OnNativeWidgetActivationChanged(false); | |
853 widget_to_activate_->Activate(); | |
854 } | |
855 void OnWidgetActivationChanged(Widget* widget, bool active) override { | |
856 if (!active) | |
857 widget->Close(); | |
858 } | |
859 | |
860 Widget* widget_to_activate_; | |
861 | |
862 DISALLOW_COPY_AND_ASSIGN(WidgetActivationForwarder); | |
863 }; | |
864 | |
865 // This class observes a widget and counts the number of times OnWidgetClosing | |
866 // is called. | |
867 class WidgetCloseCounter : public TestWidgetObserver { | |
868 public: | |
869 explicit WidgetCloseCounter(Widget* widget) : TestWidgetObserver(widget) {} | |
870 | |
871 ~WidgetCloseCounter() override {} | |
872 | |
873 int close_count() const { return close_count_; } | |
874 | |
875 private: | |
876 // WidgetObserver overrides: | |
877 void OnWidgetClosing(Widget* widget) override { close_count_++; } | |
878 | |
879 int close_count_ = 0; | |
880 | |
881 DISALLOW_COPY_AND_ASSIGN(WidgetCloseCounter); | |
882 }; | |
883 | |
884 } // namespace | |
885 | |
886 // Makes sure close notifications aren't sent more than once when a Widget is | |
887 // shutting down. Test for crbug.com/714334 | |
888 TEST_F(WidgetObserverTest, CloseReentrancy) { | |
889 Widget* widget1 = CreateTopLevelPlatformWidget(); | |
890 Widget* widget2 = CreateTopLevelPlatformWidget(); | |
891 WidgetCloseCounter counter(widget1); | |
892 WidgetActivationForwarder focus_manager(widget1, widget2); | |
893 widget1->Close(); | |
894 EXPECT_EQ(1, counter.close_count()); | |
895 widget2->Close(); | |
896 } | |
897 | |
898 TEST_F(WidgetObserverTest, VisibilityChange) { | |
899 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); | |
900 WidgetAutoclosePtr child1(NewWidget()); | |
901 WidgetAutoclosePtr child2(NewWidget()); | |
902 | 839 |
903 toplevel->Show(); | 840 toplevel->Show(); |
904 child1->Show(); | 841 child1->Show(); |
905 child2->Show(); | 842 child2->Show(); |
906 | 843 |
907 reset(); | 844 reset(); |
908 | 845 |
909 child1->Hide(); | 846 child1->Hide(); |
910 EXPECT_EQ(child1.get(), widget_hidden()); | 847 EXPECT_EQ(child1, widget_hidden()); |
911 | 848 |
912 child2->Hide(); | 849 child2->Hide(); |
913 EXPECT_EQ(child2.get(), widget_hidden()); | 850 EXPECT_EQ(child2, widget_hidden()); |
914 | 851 |
915 child1->Show(); | 852 child1->Show(); |
916 EXPECT_EQ(child1.get(), widget_shown()); | 853 EXPECT_EQ(child1, widget_shown()); |
917 | 854 |
918 child2->Show(); | 855 child2->Show(); |
919 EXPECT_EQ(child2.get(), widget_shown()); | 856 EXPECT_EQ(child2, widget_shown()); |
920 } | 857 } |
921 | 858 |
922 TEST_F(WidgetObserverTest, DestroyBubble) { | 859 TEST_F(WidgetObserverTest, DestroyBubble) { |
923 // This test expect NativeWidgetAura, force its creation. | 860 // This test expect NativeWidgetAura, force its creation. |
924 ViewsDelegate::GetInstance()->set_native_widget_factory( | 861 ViewsDelegate::GetInstance()->set_native_widget_factory( |
925 ViewsDelegate::NativeWidgetFactory()); | 862 ViewsDelegate::NativeWidgetFactory()); |
926 | 863 |
927 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); | 864 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); |
928 anchor->Show(); | 865 anchor->Show(); |
929 | 866 |
(...skipping 3005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3935 } | 3872 } |
3936 | 3873 |
3937 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { | 3874 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { |
3938 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); | 3875 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); |
3939 } | 3876 } |
3940 | 3877 |
3941 #endif // !defined(OS_CHROMEOS) | 3878 #endif // !defined(OS_CHROMEOS) |
3942 | 3879 |
3943 } // namespace test | 3880 } // namespace test |
3944 } // namespace views | 3881 } // namespace views |
OLD | NEW |