Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: ui/views/widget/widget_unittest.cc

Issue 2844933002: Revert of Don't allow a widget to send close notifications more than once. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/views/widget/widget.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « ui/views/widget/widget.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698