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 "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/test_widget_observer.h" |
7 #include "ui/views/test/views_test_base.h" | 8 #include "ui/views/test/views_test_base.h" |
8 #include "ui/views/widget/widget.h" | 9 #include "ui/views/widget/widget.h" |
9 | 10 |
10 namespace views { | 11 namespace views { |
11 | 12 |
12 namespace { | 13 namespace { |
13 | 14 |
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 class TestBubbleDelegateView : public BubbleDelegateView { | 15 class TestBubbleDelegateView : public BubbleDelegateView { |
45 public: | 16 public: |
46 TestBubbleDelegateView(View* anchor_view); | 17 TestBubbleDelegateView(View* anchor_view); |
47 virtual ~TestBubbleDelegateView(); | 18 virtual ~TestBubbleDelegateView(); |
48 | 19 |
49 virtual View* GetInitiallyFocusedView() OVERRIDE; | 20 virtual View* GetInitiallyFocusedView() OVERRIDE; |
50 | 21 |
51 private: | 22 private: |
52 View* view_; | 23 View* view_; |
53 }; | 24 }; |
(...skipping 24 matching lines...) Expand all Loading... |
78 anchor_widget->Show(); | 49 anchor_widget->Show(); |
79 | 50 |
80 BubbleDelegateView* bubble_delegate = | 51 BubbleDelegateView* bubble_delegate = |
81 new BubbleDelegateView(anchor_widget->GetContentsView(), | 52 new BubbleDelegateView(anchor_widget->GetContentsView(), |
82 BubbleBorder::NONE); | 53 BubbleBorder::NONE); |
83 bubble_delegate->set_color(SK_ColorGREEN); | 54 bubble_delegate->set_color(SK_ColorGREEN); |
84 Widget* bubble_widget( | 55 Widget* bubble_widget( |
85 BubbleDelegateView::CreateBubble(bubble_delegate)); | 56 BubbleDelegateView::CreateBubble(bubble_delegate)); |
86 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 57 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
87 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 58 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
88 TestWidgetObserver bubble_observer(bubble_widget); | 59 test::TestWidgetObserver bubble_observer(bubble_widget); |
89 EXPECT_FALSE(bubble_observer.widget_closed()); | 60 EXPECT_FALSE(bubble_observer.widget_closed()); |
90 | 61 |
91 BubbleBorder* border = | 62 BubbleBorder* border = |
92 bubble_delegate->GetBubbleFrameView()->bubble_border(); | 63 bubble_delegate->GetBubbleFrameView()->bubble_border(); |
93 EXPECT_EQ(bubble_delegate->arrow_location(), border->arrow_location()); | 64 EXPECT_EQ(bubble_delegate->arrow_location(), border->arrow_location()); |
94 EXPECT_EQ(bubble_delegate->color(), border->background_color()); | 65 EXPECT_EQ(bubble_delegate->color(), border->background_color()); |
95 | 66 |
96 bubble_widget->CloseNow(); | 67 bubble_widget->CloseNow(); |
97 RunPendingMessages(); | 68 RunPendingMessages(); |
98 EXPECT_TRUE(bubble_observer.widget_closed()); | 69 EXPECT_TRUE(bubble_observer.widget_closed()); |
99 } | 70 } |
100 | 71 |
101 TEST_F(BubbleDelegateTest, CloseAnchorWidget) { | 72 TEST_F(BubbleDelegateTest, CloseAnchorWidget) { |
102 // Create the anchor widget. | 73 // Create the anchor widget. |
103 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); | 74 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
104 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 75 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
105 scoped_ptr<Widget> anchor_widget(new Widget); | 76 scoped_ptr<Widget> anchor_widget(new Widget); |
106 anchor_widget->Init(params); | 77 anchor_widget->Init(params); |
107 anchor_widget->Show(); | 78 anchor_widget->Show(); |
108 | 79 |
109 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 80 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( |
110 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 81 anchor_widget->GetContentsView(), BubbleBorder::NONE); |
111 // Preventing close on deactivate should not prevent closing with the anchor. | 82 // Preventing close on deactivate should not prevent closing with the anchor. |
112 bubble_delegate->set_close_on_deactivate(false); | 83 bubble_delegate->set_close_on_deactivate(false); |
113 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 84 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
114 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 85 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
115 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 86 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
116 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 87 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
117 TestWidgetObserver bubble_observer(bubble_widget); | 88 test::TestWidgetObserver bubble_observer(bubble_widget); |
118 EXPECT_FALSE(bubble_observer.widget_closed()); | 89 EXPECT_FALSE(bubble_observer.widget_closed()); |
119 | 90 |
120 bubble_widget->Show(); | 91 bubble_widget->Show(); |
121 RunPendingMessages(); | 92 RunPendingMessages(); |
122 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 93 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
123 EXPECT_FALSE(bubble_observer.widget_closed()); | 94 EXPECT_FALSE(bubble_observer.widget_closed()); |
124 | 95 |
125 #if defined(USE_AURA) | 96 #if defined(USE_AURA) |
126 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 97 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
127 // aura::test::TestActivationClient::OnWindowDestroyed(). | 98 // aura::test::TestActivationClient::OnWindowDestroyed(). |
(...skipping 24 matching lines...) Expand all Loading... |
152 // widget so that closing the anchor widget does not close the bubble widget. | 123 // widget so that closing the anchor widget does not close the bubble widget. |
153 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 124 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( |
154 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 125 anchor_widget->GetContentsView(), BubbleBorder::NONE); |
155 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); | 126 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); |
156 // Preventing close on deactivate should not prevent closing with the parent. | 127 // Preventing close on deactivate should not prevent closing with the parent. |
157 bubble_delegate->set_close_on_deactivate(false); | 128 bubble_delegate->set_close_on_deactivate(false); |
158 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 129 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); |
159 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 130 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
160 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 131 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
161 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 132 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
162 TestWidgetObserver bubble_observer(bubble_widget); | 133 test::TestWidgetObserver bubble_observer(bubble_widget); |
163 EXPECT_FALSE(bubble_observer.widget_closed()); | 134 EXPECT_FALSE(bubble_observer.widget_closed()); |
164 | 135 |
165 // Showing and hiding the bubble widget should have no effect on its anchor. | 136 // Showing and hiding the bubble widget should have no effect on its anchor. |
166 bubble_widget->Show(); | 137 bubble_widget->Show(); |
167 RunPendingMessages(); | 138 RunPendingMessages(); |
168 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 139 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
169 bubble_widget->Hide(); | 140 bubble_widget->Hide(); |
170 RunPendingMessages(); | 141 RunPendingMessages(); |
171 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 142 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
172 | 143 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 // http://crbug.com/125976 breaks this simple test by clearing proper focus. | 181 // http://crbug.com/125976 breaks this simple test by clearing proper focus. |
211 #if defined(OS_WIN) && !defined(USE_AURA) | 182 #if defined(OS_WIN) && !defined(USE_AURA) |
212 expected_view = NULL; | 183 expected_view = NULL; |
213 #endif | 184 #endif |
214 | 185 |
215 EXPECT_EQ(expected_view, bubble_widget->GetFocusManager()->GetFocusedView()); | 186 EXPECT_EQ(expected_view, bubble_widget->GetFocusManager()->GetFocusedView()); |
216 bubble_widget->CloseNow(); | 187 bubble_widget->CloseNow(); |
217 } | 188 } |
218 | 189 |
219 } // namespace views | 190 } // namespace views |
OLD | NEW |