Chromium Code Reviews| 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 |