| 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 |