| 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 |