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 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) { |
835 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); | 899 WidgetAutoclosePtr toplevel(CreateTopLevelPlatformWidget()); |
836 | 900 WidgetAutoclosePtr child1(NewWidget()); |
837 Widget* child1 = NewWidget(); | 901 WidgetAutoclosePtr child2(NewWidget()); |
838 Widget* child2 = NewWidget(); | |
839 | 902 |
840 toplevel->Show(); | 903 toplevel->Show(); |
841 child1->Show(); | 904 child1->Show(); |
842 child2->Show(); | 905 child2->Show(); |
843 | 906 |
844 reset(); | 907 reset(); |
845 | 908 |
846 child1->Hide(); | 909 child1->Hide(); |
847 EXPECT_EQ(child1, widget_hidden()); | 910 EXPECT_EQ(child1.get(), widget_hidden()); |
848 | 911 |
849 child2->Hide(); | 912 child2->Hide(); |
850 EXPECT_EQ(child2, widget_hidden()); | 913 EXPECT_EQ(child2.get(), widget_hidden()); |
851 | 914 |
852 child1->Show(); | 915 child1->Show(); |
853 EXPECT_EQ(child1, widget_shown()); | 916 EXPECT_EQ(child1.get(), widget_shown()); |
854 | 917 |
855 child2->Show(); | 918 child2->Show(); |
856 EXPECT_EQ(child2, widget_shown()); | 919 EXPECT_EQ(child2.get(), widget_shown()); |
857 } | 920 } |
858 | 921 |
859 TEST_F(WidgetObserverTest, DestroyBubble) { | 922 TEST_F(WidgetObserverTest, DestroyBubble) { |
860 // This test expect NativeWidgetAura, force its creation. | 923 // This test expect NativeWidgetAura, force its creation. |
861 ViewsDelegate::GetInstance()->set_native_widget_factory( | 924 ViewsDelegate::GetInstance()->set_native_widget_factory( |
862 ViewsDelegate::NativeWidgetFactory()); | 925 ViewsDelegate::NativeWidgetFactory()); |
863 | 926 |
864 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); | 927 WidgetAutoclosePtr anchor(CreateTopLevelPlatformWidget()); |
865 anchor->Show(); | 928 anchor->Show(); |
866 | 929 |
(...skipping 3005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3872 } | 3935 } |
3873 | 3936 |
3874 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { | 3937 TEST_F(CompositingWidgetTest, Transparency_DesktopWidgetTranslucent) { |
3875 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); | 3938 CheckAllWidgetsForOpacity(Widget::InitParams::TRANSLUCENT_WINDOW); |
3876 } | 3939 } |
3877 | 3940 |
3878 #endif // !defined(OS_CHROMEOS) | 3941 #endif // !defined(OS_CHROMEOS) |
3879 | 3942 |
3880 } // namespace test | 3943 } // namespace test |
3881 } // namespace views | 3944 } // namespace views |
OLD | NEW |