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

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: dont touch that one 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
« ui/views/widget/widget.cc ('K') | « 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 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
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
OLDNEW
« ui/views/widget/widget.cc ('K') | « ui/views/widget/widget.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698