| 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 "base/run_loop.h" | 5 #include "base/run_loop.h" |
| 6 #include "ui/aura/env.h" |
| 6 #include "ui/base/hit_test.h" | 7 #include "ui/base/hit_test.h" |
| 7 #include "ui/views/bubble/bubble_delegate.h" | 8 #include "ui/views/bubble/bubble_delegate.h" |
| 8 #include "ui/views/bubble/bubble_frame_view.h" | 9 #include "ui/views/bubble/bubble_frame_view.h" |
| 9 #include "ui/views/test/test_widget_observer.h" | 10 #include "ui/views/test/test_widget_observer.h" |
| 10 #include "ui/views/test/views_test_base.h" | 11 #include "ui/views/test/views_test_base.h" |
| 11 #include "ui/views/widget/widget.h" | 12 #include "ui/views/widget/widget.h" |
| 12 #include "ui/views/widget/widget_observer.h" | 13 #include "ui/views/widget/widget_observer.h" |
| 13 | 14 |
| 14 #if defined(USE_AURA) | |
| 15 #include "ui/aura/env.h" | |
| 16 #endif | |
| 17 | |
| 18 namespace views { | 15 namespace views { |
| 19 | 16 |
| 20 namespace { | 17 namespace { |
| 21 | 18 |
| 22 class TestBubbleDelegateView : public BubbleDelegateView { | 19 class TestBubbleDelegateView : public BubbleDelegateView { |
| 23 public: | 20 public: |
| 24 TestBubbleDelegateView(View* anchor_view) | 21 TestBubbleDelegateView(View* anchor_view) |
| 25 : BubbleDelegateView(anchor_view, BubbleBorder::TOP_LEFT), | 22 : BubbleDelegateView(anchor_view, BubbleBorder::TOP_LEFT), |
| 26 view_(new View()) { | 23 view_(new View()) { |
| 27 view_->SetFocusable(true); | 24 view_->SetFocusable(true); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 95 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 99 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 96 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 100 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 97 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); |
| 101 test::TestWidgetObserver bubble_observer(bubble_widget); | 98 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 102 EXPECT_FALSE(bubble_observer.widget_closed()); | 99 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 103 | 100 |
| 104 bubble_widget->Show(); | 101 bubble_widget->Show(); |
| 105 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 102 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); |
| 106 EXPECT_FALSE(bubble_observer.widget_closed()); | 103 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 107 | 104 |
| 108 #if defined(USE_AURA) | |
| 109 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 105 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 110 // aura::test::TestActivationClient::OnWindowDestroyed(). | 106 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 111 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 107 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 112 EXPECT_FALSE(bubble_observer.widget_closed()); | 108 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 113 #endif | |
| 114 | 109 |
| 115 // Ensure that closing the anchor widget also closes the bubble itself. | 110 // Ensure that closing the anchor widget also closes the bubble itself. |
| 116 anchor_widget->CloseNow(); | 111 anchor_widget->CloseNow(); |
| 117 EXPECT_TRUE(bubble_observer.widget_closed()); | 112 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 118 } | 113 } |
| 119 | 114 |
| 120 // This test checks that the bubble delegate is capable to handle an early | 115 // This test checks that the bubble delegate is capable to handle an early |
| 121 // destruction of the used anchor view. (Animations and delayed closure of the | 116 // destruction of the used anchor view. (Animations and delayed closure of the |
| 122 // bubble will call upon the anchor view to get its location). | 117 // bubble will call upon the anchor view to get its location). |
| 123 TEST_F(BubbleDelegateTest, CloseAnchorViewTest) { | 118 TEST_F(BubbleDelegateTest, CloseAnchorViewTest) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 186 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); |
| 192 bubble_widget->Hide(); | 187 bubble_widget->Hide(); |
| 193 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); | 188 EXPECT_EQ(anchor_widget, bubble_delegate->anchor_widget()); |
| 194 | 189 |
| 195 // Ensure that closing the anchor widget clears the bubble's reference to that | 190 // Ensure that closing the anchor widget clears the bubble's reference to that |
| 196 // anchor widget, but the bubble itself does not close. | 191 // anchor widget, but the bubble itself does not close. |
| 197 anchor_widget->CloseNow(); | 192 anchor_widget->CloseNow(); |
| 198 EXPECT_NE(anchor_widget, bubble_delegate->anchor_widget()); | 193 EXPECT_NE(anchor_widget, bubble_delegate->anchor_widget()); |
| 199 EXPECT_FALSE(bubble_observer.widget_closed()); | 194 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 200 | 195 |
| 201 #if defined(USE_AURA) | |
| 202 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 196 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 203 // aura::test::TestActivationClient::OnWindowDestroyed(). | 197 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 204 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 198 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 205 EXPECT_FALSE(bubble_observer.widget_closed()); | 199 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 206 #endif | |
| 207 | 200 |
| 208 // Ensure that closing the parent widget also closes the bubble itself. | 201 // Ensure that closing the parent widget also closes the bubble itself. |
| 209 parent_widget->CloseNow(); | 202 parent_widget->CloseNow(); |
| 210 EXPECT_TRUE(bubble_observer.widget_closed()); | 203 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 211 } | 204 } |
| 212 | 205 |
| 213 TEST_F(BubbleDelegateTest, InitiallyFocusedView) { | 206 TEST_F(BubbleDelegateTest, InitiallyFocusedView) { |
| 214 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 207 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 215 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 208 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( |
| 216 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 209 anchor_widget->GetContentsView(), BubbleBorder::NONE); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 EXPECT_FALSE(bubble_widget->IsVisible()); | 251 EXPECT_FALSE(bubble_widget->IsVisible()); |
| 259 } | 252 } |
| 260 | 253 |
| 261 // This class provides functionality to verify that the BubbleView shows up | 254 // This class provides functionality to verify that the BubbleView shows up |
| 262 // when we call BubbleDelegateView::StartFade(true) and is destroyed when we | 255 // when we call BubbleDelegateView::StartFade(true) and is destroyed when we |
| 263 // call BubbleDelegateView::StartFade(false). | 256 // call BubbleDelegateView::StartFade(false). |
| 264 class BubbleWidgetClosingTest : public BubbleDelegateTest, | 257 class BubbleWidgetClosingTest : public BubbleDelegateTest, |
| 265 public views::WidgetObserver { | 258 public views::WidgetObserver { |
| 266 public: | 259 public: |
| 267 BubbleWidgetClosingTest() : bubble_destroyed_(false) { | 260 BubbleWidgetClosingTest() : bubble_destroyed_(false) { |
| 268 #if defined(USE_AURA) | |
| 269 aura::Env::CreateInstance(); | 261 aura::Env::CreateInstance(); |
| 270 loop_.set_dispatcher(aura::Env::GetInstance()->GetDispatcher()); | |
| 271 #endif | |
| 272 } | 262 } |
| 273 | 263 |
| 274 virtual ~BubbleWidgetClosingTest() {} | 264 virtual ~BubbleWidgetClosingTest() {} |
| 275 | 265 |
| 276 void Observe(views::Widget* widget) { | 266 void Observe(views::Widget* widget) { |
| 277 widget->AddObserver(this); | 267 widget->AddObserver(this); |
| 278 } | 268 } |
| 279 | 269 |
| 280 // views::WidgetObserver overrides. | 270 // views::WidgetObserver overrides. |
| 281 virtual void OnWidgetDestroyed(Widget* widget) OVERRIDE { | 271 virtual void OnWidgetDestroyed(Widget* widget) OVERRIDE { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 311 bubble_widget->GetFocusManager()->GetFocusedView()); | 301 bubble_widget->GetFocusManager()->GetFocusedView()); |
| 312 | 302 |
| 313 Observe(bubble_widget); | 303 Observe(bubble_widget); |
| 314 | 304 |
| 315 bubble_delegate->StartFade(false); | 305 bubble_delegate->StartFade(false); |
| 316 RunNestedLoop(); | 306 RunNestedLoop(); |
| 317 EXPECT_TRUE(bubble_destroyed()); | 307 EXPECT_TRUE(bubble_destroyed()); |
| 318 } | 308 } |
| 319 | 309 |
| 320 } // namespace views | 310 } // namespace views |
| OLD | NEW |