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

Side by Side Diff: ui/views/bubble/bubble_delegate_unittest.cc

Issue 10920028: Reland: Fix and expand upon BubbleDelegateTests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Check that the Bubble doesn't close on aura activation hack. Created 8 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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 "ui/views/bubble/bubble_delegate.h" 5 #include "ui/views/bubble/bubble_delegate.h"
6 #include "ui/views/bubble/bubble_frame_view.h" 6 #include "ui/views/bubble/bubble_frame_view.h"
7 #include "ui/views/test/views_test_base.h" 7 #include "ui/views/test/views_test_base.h"
8 #include "ui/views/widget/widget.h" 8 #include "ui/views/widget/widget.h"
9 9
10 namespace views { 10 namespace views {
11 11
12 namespace {
13
14 // A Widget observer class used in the tests below to observe bubbles closing.
15 class TestWidgetObserver : public WidgetObserver {
16 public:
17 explicit TestWidgetObserver(Widget* widget);
18 virtual ~TestWidgetObserver();
19
20 // WidgetObserver overrides:
21 virtual void OnWidgetClosing(Widget* widget) OVERRIDE;
22
23 bool widget_closed() const { return widget_ == NULL; }
24
25 private:
26 Widget* widget_;
27 };
28
29 TestWidgetObserver::TestWidgetObserver(Widget* widget)
30 : widget_(widget) {
31 widget_->AddObserver(this);
32 }
33
34 TestWidgetObserver::~TestWidgetObserver() {
35 if (widget_)
36 widget_->RemoveObserver(this);
37 }
38
39 void TestWidgetObserver::OnWidgetClosing(Widget* widget) {
40 DCHECK_EQ(widget_, widget);
41 widget_ = NULL;
42 }
43
44 } // namespace
45
12 typedef ViewsTestBase BubbleDelegateTest; 46 typedef ViewsTestBase BubbleDelegateTest;
13 47
14 TEST_F(BubbleDelegateTest, CreateDelegate) { 48 TEST_F(BubbleDelegateTest, CreateDelegate) {
15 BubbleDelegateView* bubble_delegate = 49 BubbleDelegateView* bubble_delegate =
16 new BubbleDelegateView(NULL, BubbleBorder::NONE); 50 new BubbleDelegateView(NULL, BubbleBorder::NONE);
17 bubble_delegate->set_color(SK_ColorGREEN); 51 bubble_delegate->set_color(SK_ColorGREEN);
18 Widget* bubble_widget( 52 Widget* bubble_widget(
19 BubbleDelegateView::CreateBubble(bubble_delegate)); 53 BubbleDelegateView::CreateBubble(bubble_delegate));
20 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); 54 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
21 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); 55 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
56 TestWidgetObserver bubble_observer(bubble_widget);
57 EXPECT_FALSE(bubble_observer.widget_closed());
22 58
23 BubbleBorder* border = 59 BubbleBorder* border =
24 bubble_delegate->GetBubbleFrameView()->bubble_border(); 60 bubble_delegate->GetBubbleFrameView()->bubble_border();
25 EXPECT_EQ(bubble_delegate->arrow_location(), border->arrow_location()); 61 EXPECT_EQ(bubble_delegate->arrow_location(), border->arrow_location());
26 EXPECT_EQ(bubble_delegate->color(), border->background_color()); 62 EXPECT_EQ(bubble_delegate->color(), border->background_color());
27 63
28 bubble_widget->CloseNow(); 64 bubble_widget->CloseNow();
29 RunPendingMessages(); 65 RunPendingMessages();
66 EXPECT_TRUE(bubble_observer.widget_closed());
67 }
68
69 TEST_F(BubbleDelegateTest, CloseAnchorWidget) {
70 // Create the anchor widget.
71 Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
72 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
73 scoped_ptr<Widget> anchor_widget(new Widget);
74 anchor_widget->Init(params);
75 anchor_widget->Show();
76
77 BubbleDelegateView* bubble_delegate = new BubbleDelegateView(
78 anchor_widget->GetContentsView(), BubbleBorder::NONE);
79 // Preventing close on deactivate should not prevent closing with the anchor.
80 bubble_delegate->set_close_on_deactivate(false);
81 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate);
82 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
83 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
84 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
85 TestWidgetObserver bubble_observer(bubble_widget);
86 EXPECT_FALSE(bubble_observer.widget_closed());
87
88 bubble_widget->Show();
89 RunPendingMessages();
90 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
91 EXPECT_FALSE(bubble_observer.widget_closed());
92
93 #if defined(USE_AURA)
94 // TODO(msw): Remove activation hack to prevent bookkeeping errors in:
95 // aura::test::TestActivationClient::OnWindowDestroyed().
96 scoped_ptr<Widget> smoke_and_mirrors_widget(new Widget);
97 smoke_and_mirrors_widget->Init(params);
98 smoke_and_mirrors_widget->Show();
99 EXPECT_FALSE(bubble_observer.widget_closed());
100 #endif
101
102 // Ensure that closing the anchor widget also closes the bubble itself.
103 anchor_widget->CloseNow();
104 RunPendingMessages();
105 EXPECT_TRUE(bubble_observer.widget_closed());
30 } 106 }
31 107
32 TEST_F(BubbleDelegateTest, ResetAnchorWidget) { 108 TEST_F(BubbleDelegateTest, ResetAnchorWidget) {
33 // Create the anchor widget first. 109 // Create the anchor and parent widgets.
34 Widget* widget = new Widget;
35 View* contents = new View;
36
37 Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); 110 Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
38 widget->Init(params); 111 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
39 widget->SetContentsView(contents); 112 scoped_ptr<Widget> anchor_widget(new Widget);
40 widget->Show(); 113 anchor_widget->Init(params);
41 114 anchor_widget->Show();
42 Widget* parent = new Widget; 115 scoped_ptr<Widget> parent_widget(new Widget);
43 parent->Init(params); 116 parent_widget->Init(params);
44 parent->SetContentsView(new View); 117 parent_widget->Show();
45 parent->Show();
46 118
47 // Make sure the bubble widget is parented to a widget other than the anchor 119 // Make sure the bubble widget is parented to a widget other than the anchor
48 // widget so that closing the anchor widget does not close the bubble widget. 120 // widget so that closing the anchor widget does not close the bubble widget.
49 BubbleDelegateView* bubble_delegate = 121 BubbleDelegateView* bubble_delegate = new BubbleDelegateView(
50 new BubbleDelegateView(contents, BubbleBorder::NONE); 122 anchor_widget->GetContentsView(), BubbleBorder::NONE);
51 bubble_delegate->set_parent_window(parent->GetNativeView()); 123 bubble_delegate->set_parent_window(parent_widget->GetNativeView());
52 bubble_delegate->set_color(SK_ColorGREEN); 124 // Preventing close on deactivate should not prevent closing with the parent.
53 Widget* bubble_widget( 125 bubble_delegate->set_close_on_deactivate(false);
54 BubbleDelegateView::CreateBubble(bubble_delegate)); 126 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate);
55 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); 127 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate());
56 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); 128 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget());
57 EXPECT_EQ(widget, bubble_delegate->anchor_widget()); 129 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
130 TestWidgetObserver bubble_observer(bubble_widget);
131 EXPECT_FALSE(bubble_observer.widget_closed());
58 132
133 // Showing and hiding the bubble widget should have no effect on its anchor.
59 bubble_widget->Show(); 134 bubble_widget->Show();
60 RunPendingMessages(); 135 RunPendingMessages();
61 EXPECT_EQ(widget, bubble_delegate->anchor_widget()); 136 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
62
63 bubble_widget->Hide(); 137 bubble_widget->Hide();
64 RunPendingMessages(); 138 RunPendingMessages();
65 EXPECT_EQ(widget, bubble_delegate->anchor_widget()); 139 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget());
66 140
67 // Closing the anchor widget should unset the reference to the anchor widget 141 // Ensure that closing the anchor widget clears the bubble's reference to that
68 // for the bubble. 142 // anchor widget, but the bubble itself does not close.
69 widget->CloseNow(); 143 anchor_widget->CloseNow();
70 RunPendingMessages(); 144 RunPendingMessages();
71 EXPECT_NE(bubble_delegate->anchor_widget(), widget); 145 EXPECT_NE(anchor_widget.get(), bubble_delegate->anchor_widget());
146 EXPECT_FALSE(bubble_observer.widget_closed());
72 147
73 bubble_widget->CloseNow(); 148 #if defined(USE_AURA)
74 parent->CloseNow(); 149 // TODO(msw): Remove activation hack to prevent bookkeeping errors in:
150 // aura::test::TestActivationClient::OnWindowDestroyed().
151 scoped_ptr<Widget> smoke_and_mirrors_widget(new Widget);
152 smoke_and_mirrors_widget->Init(params);
153 smoke_and_mirrors_widget->Show();
154 EXPECT_FALSE(bubble_observer.widget_closed());
155 #endif
156
157 // Ensure that closing the parent widget also closes the bubble itself.
158 parent_widget->CloseNow();
75 RunPendingMessages(); 159 RunPendingMessages();
160 EXPECT_TRUE(bubble_observer.widget_closed());
76 } 161 }
77 162
78 } // namespace views 163 } // namespace views
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698