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

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

Issue 2834943002: Don't allow a widget to send close notifications more than once. (Closed)
Patch Set: sky review Created 3 years, 8 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;
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
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
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
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