Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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_dialog_delegate.h" | |
| 6 | |
| 5 #include <stddef.h> | 7 #include <stddef.h> |
| 6 | 8 |
| 7 #include "base/macros.h" | 9 #include "base/macros.h" |
| 8 #include "ui/base/hit_test.h" | 10 #include "ui/base/hit_test.h" |
| 9 #include "ui/events/event_utils.h" | 11 #include "ui/events/event_utils.h" |
| 10 #include "ui/views/bubble/bubble_delegate.h" | |
| 11 #include "ui/views/bubble/bubble_frame_view.h" | 12 #include "ui/views/bubble/bubble_frame_view.h" |
| 12 #include "ui/views/controls/button/label_button.h" | 13 #include "ui/views/controls/button/label_button.h" |
| 13 #include "ui/views/test/test_widget_observer.h" | 14 #include "ui/views/test/test_widget_observer.h" |
| 14 #include "ui/views/test/views_test_base.h" | 15 #include "ui/views/test/views_test_base.h" |
| 15 #include "ui/views/widget/widget.h" | 16 #include "ui/views/widget/widget.h" |
| 16 #include "ui/views/widget/widget_observer.h" | 17 #include "ui/views/widget/widget_observer.h" |
| 17 | 18 |
| 18 namespace views { | 19 namespace views { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| 22 class TestBubbleDelegateView : public BubbleDelegateView { | 23 class TestBubbleDialogDelegateView : public BubbleDialogDelegateView { |
| 23 public: | 24 public: |
| 24 TestBubbleDelegateView(View* anchor_view) | 25 TestBubbleDialogDelegateView(View* anchor_view) |
| 25 : BubbleDelegateView(anchor_view, BubbleBorder::TOP_LEFT), | 26 : BubbleDialogDelegateView(anchor_view, BubbleBorder::TOP_LEFT), |
| 26 view_(new View()) { | 27 view_(new View()) { |
| 27 view_->SetFocusable(true); | 28 view_->SetFocusable(true); |
| 28 AddChildView(view_); | 29 AddChildView(view_); |
| 29 } | 30 } |
| 30 ~TestBubbleDelegateView() override {} | 31 ~TestBubbleDialogDelegateView() override {} |
| 31 | 32 |
| 32 void SetAnchorRectForTest(gfx::Rect rect) { | 33 void SetAnchorRectForTest(gfx::Rect rect) { SetAnchorRect(rect); } |
| 33 SetAnchorRect(rect); | |
| 34 } | |
| 35 | 34 |
| 36 void SetAnchorViewForTest(View* view) { | 35 void SetAnchorViewForTest(View* view) { SetAnchorView(view); } |
| 37 SetAnchorView(view); | |
| 38 } | |
| 39 | 36 |
| 40 // BubbleDelegateView overrides: | 37 // BubbleDialogDelegateView overrides: |
| 41 View* GetInitiallyFocusedView() override { return view_; } | 38 View* GetInitiallyFocusedView() override { return view_; } |
| 42 gfx::Size GetPreferredSize() const override { return gfx::Size(200, 200); } | 39 gfx::Size GetPreferredSize() const override { return gfx::Size(200, 200); } |
| 43 | 40 |
| 44 BubbleFrameView* GetBubbleFrameViewForTest() const { | 41 BubbleFrameView* GetBubbleFrameViewForTest() const { |
| 45 return GetBubbleFrameView(); | 42 return GetBubbleFrameView(); |
| 46 } | 43 } |
| 47 | 44 |
| 45 using BubbleDialogDelegateView::GetBubbleFrameView; | |
|
msw
2016/03/17 17:28:26
This is redundant with GetBubbleFrameViewForTest;
Evan Stade
2016/03/17 22:41:34
Done.
| |
| 46 | |
| 48 private: | 47 private: |
| 49 View* view_; | 48 View* view_; |
| 50 | 49 |
| 51 DISALLOW_COPY_AND_ASSIGN(TestBubbleDelegateView); | 50 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); |
| 52 }; | 51 }; |
| 53 | 52 |
| 54 class BubbleDelegateTest : public ViewsTestBase { | 53 class BubbleDialogDelegateTest : public ViewsTestBase { |
| 55 public: | 54 public: |
| 56 BubbleDelegateTest() {} | 55 BubbleDialogDelegateTest() {} |
| 57 ~BubbleDelegateTest() override {} | 56 ~BubbleDialogDelegateTest() override {} |
| 58 | 57 |
| 59 // Creates a test widget that owns its native widget. | 58 // Creates a test widget that owns its native widget. |
| 60 Widget* CreateTestWidget() { | 59 Widget* CreateTestWidget() { |
|
msw
2016/03/17 17:28:26
nit: this could be a static local function, then w
Evan Stade
2016/03/17 22:41:34
CreateParams is a (non-static) ViewsTestBase metho
| |
| 61 Widget* widget = new Widget(); | 60 Widget* widget = new Widget(); |
| 62 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); | 61 Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
| 63 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 62 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 64 widget->Init(params); | 63 widget->Init(params); |
| 65 return widget; | 64 return widget; |
| 66 } | 65 } |
| 67 | 66 |
| 68 private: | 67 private: |
| 69 DISALLOW_COPY_AND_ASSIGN(BubbleDelegateTest); | 68 DISALLOW_COPY_AND_ASSIGN(BubbleDialogDelegateTest); |
| 70 }; | 69 }; |
| 71 | 70 |
| 71 /* | |
|
msw
2016/03/17 17:28:26
You probably meant to remove this.
Evan Stade
2016/03/17 22:41:34
right you are
| |
| 72 class TestBubbleDialogDelegateView : public BubbleDialogDelegateView { | |
| 73 public | |
| 74 TestBubbleDialogDelegateView(View* anchor_view, BubbleBorder border) | |
| 75 : BubbleDialogDelegateView(anchor_view, border) {} | |
| 76 ~TestBubbleDialogDelegateView() override {} | |
| 77 | |
| 78 private: | |
| 79 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); | |
| 80 }; | |
| 81 */ | |
| 82 | |
| 72 } // namespace | 83 } // namespace |
| 73 | 84 |
| 74 TEST_F(BubbleDelegateTest, CreateDelegate) { | 85 TEST_F(BubbleDialogDelegateTest, CreateDelegate) { |
| 75 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 86 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
|
msw
2016/03/17 17:28:26
Every test does this same pattern (anchor widget,
Evan Stade
2016/03/17 22:41:34
that seems tricky because most tests do something
| |
| 76 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 87 TestBubbleDialogDelegateView* bubble_delegate = |
| 77 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 88 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 78 bubble_delegate->set_color(SK_ColorGREEN); | 89 bubble_delegate->set_color(SK_ColorGREEN); |
| 79 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 90 Widget* bubble_widget = |
| 91 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 80 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 92 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 81 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 93 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 82 test::TestWidgetObserver bubble_observer(bubble_widget); | 94 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 83 bubble_widget->Show(); | 95 bubble_widget->Show(); |
| 84 | 96 |
| 85 BubbleBorder* border = bubble_delegate->GetBubbleFrameView()->bubble_border(); | 97 BubbleBorder* border = bubble_delegate->GetBubbleFrameView()->bubble_border(); |
| 86 EXPECT_EQ(bubble_delegate->arrow(), border->arrow()); | 98 EXPECT_EQ(bubble_delegate->arrow(), border->arrow()); |
| 87 EXPECT_EQ(bubble_delegate->color(), border->background_color()); | 99 EXPECT_EQ(bubble_delegate->color(), border->background_color()); |
| 88 | 100 |
| 89 EXPECT_FALSE(bubble_observer.widget_closed()); | 101 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 90 bubble_widget->CloseNow(); | 102 bubble_widget->CloseNow(); |
| 91 EXPECT_TRUE(bubble_observer.widget_closed()); | 103 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 92 } | 104 } |
| 93 | 105 |
| 94 TEST_F(BubbleDelegateTest, CloseAnchorWidget) { | 106 TEST_F(BubbleDialogDelegateTest, CloseAnchorWidget) { |
| 95 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 107 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 96 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 108 BubbleDialogDelegateView* bubble_delegate = |
| 97 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 109 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 98 // Preventing close on deactivate should not prevent closing with the anchor. | 110 // Preventing close on deactivate should not prevent closing with the anchor. |
| 99 bubble_delegate->set_close_on_deactivate(false); | 111 bubble_delegate->set_close_on_deactivate(false); |
| 100 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 112 Widget* bubble_widget = |
| 113 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 101 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 114 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 102 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 115 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 103 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 116 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 104 test::TestWidgetObserver bubble_observer(bubble_widget); | 117 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 105 EXPECT_FALSE(bubble_observer.widget_closed()); | 118 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 106 | 119 |
| 107 bubble_widget->Show(); | 120 bubble_widget->Show(); |
| 108 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 121 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 109 EXPECT_FALSE(bubble_observer.widget_closed()); | 122 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 110 | 123 |
| 111 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 124 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 112 // aura::test::TestActivationClient::OnWindowDestroyed(). | 125 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 113 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 126 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 114 EXPECT_FALSE(bubble_observer.widget_closed()); | 127 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 115 | 128 |
| 116 // Ensure that closing the anchor widget also closes the bubble itself. | 129 // Ensure that closing the anchor widget also closes the bubble itself. |
| 117 anchor_widget->CloseNow(); | 130 anchor_widget->CloseNow(); |
| 118 EXPECT_TRUE(bubble_observer.widget_closed()); | 131 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 119 } | 132 } |
| 120 | 133 |
| 121 // This test checks that the bubble delegate is capable to handle an early | 134 // This test checks that the bubble delegate is capable to handle an early |
| 122 // destruction of the used anchor view. (Animations and delayed closure of the | 135 // destruction of the used anchor view. (Animations and delayed closure of the |
| 123 // bubble will call upon the anchor view to get its location). | 136 // bubble will call upon the anchor view to get its location). |
| 124 TEST_F(BubbleDelegateTest, CloseAnchorViewTest) { | 137 TEST_F(BubbleDialogDelegateTest, CloseAnchorViewTest) { |
| 125 // Create an anchor widget and add a view to be used as an anchor view. | 138 // Create an anchor widget and add a view to be used as an anchor view. |
| 126 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 139 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 127 scoped_ptr<View> anchor_view(new View()); | 140 scoped_ptr<View> anchor_view(new View()); |
| 128 anchor_widget->GetContentsView()->AddChildView(anchor_view.get()); | 141 anchor_widget->GetContentsView()->AddChildView(anchor_view.get()); |
| 129 TestBubbleDelegateView* bubble_delegate = new TestBubbleDelegateView( | 142 TestBubbleDialogDelegateView* bubble_delegate = |
| 130 anchor_view.get()); | 143 new TestBubbleDialogDelegateView(anchor_view.get()); |
| 131 // Prevent flakes by avoiding closing on activation changes. | 144 // Prevent flakes by avoiding closing on activation changes. |
| 132 bubble_delegate->set_close_on_deactivate(false); | 145 bubble_delegate->set_close_on_deactivate(false); |
| 133 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 146 Widget* bubble_widget = |
| 147 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 134 | 148 |
| 135 // Check that the anchor view is correct and set up an anchor view rect. | 149 // Check that the anchor view is correct and set up an anchor view rect. |
| 136 // Make sure that this rect will get ignored (as long as the anchor view is | 150 // Make sure that this rect will get ignored (as long as the anchor view is |
| 137 // attached). | 151 // attached). |
| 138 EXPECT_EQ(anchor_view.get(), bubble_delegate->GetAnchorView()); | 152 EXPECT_EQ(anchor_view.get(), bubble_delegate->GetAnchorView()); |
| 139 const gfx::Rect set_anchor_rect = gfx::Rect(10, 10, 100, 100); | 153 const gfx::Rect set_anchor_rect = gfx::Rect(10, 10, 100, 100); |
| 140 bubble_delegate->SetAnchorRectForTest(set_anchor_rect); | 154 bubble_delegate->SetAnchorRectForTest(set_anchor_rect); |
| 141 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); | 155 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); |
| 142 EXPECT_NE(view_rect.ToString(), set_anchor_rect.ToString()); | 156 EXPECT_NE(view_rect.ToString(), set_anchor_rect.ToString()); |
| 143 | 157 |
| 144 // Create the bubble. | 158 // Create the bubble. |
| 145 bubble_widget->Show(); | 159 bubble_widget->Show(); |
| 146 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 160 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 147 | 161 |
| 148 // Remove now the anchor view and make sure that the original found rect | 162 // Remove now the anchor view and make sure that the original found rect |
| 149 // is still kept, so that the bubble does not jump when the view gets deleted. | 163 // is still kept, so that the bubble does not jump when the view gets deleted. |
| 150 anchor_widget->GetContentsView()->RemoveChildView(anchor_view.get()); | 164 anchor_widget->GetContentsView()->RemoveChildView(anchor_view.get()); |
| 151 anchor_view.reset(); | 165 anchor_view.reset(); |
| 152 EXPECT_EQ(NULL, bubble_delegate->GetAnchorView()); | 166 EXPECT_EQ(NULL, bubble_delegate->GetAnchorView()); |
| 153 EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString()); | 167 EXPECT_EQ(view_rect.ToString(), bubble_delegate->GetAnchorRect().ToString()); |
| 154 } | 168 } |
| 155 | 169 |
| 156 // Testing that a move of the anchor view will lead to new bubble locations. | 170 // Testing that a move of the anchor view will lead to new bubble locations. |
| 157 TEST_F(BubbleDelegateTest, TestAnchorRectMovesWithViewTest) { | 171 TEST_F(BubbleDialogDelegateTest, TestAnchorRectMovesWithViewTest) { |
| 158 // Create an anchor widget and add a view to be used as anchor view. | 172 // Create an anchor widget and add a view to be used as anchor view. |
| 159 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 173 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 160 TestBubbleDelegateView* bubble_delegate = new TestBubbleDelegateView( | 174 TestBubbleDialogDelegateView* bubble_delegate = |
| 161 anchor_widget->GetContentsView()); | 175 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 162 BubbleDelegateView::CreateBubble(bubble_delegate); | 176 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 163 | 177 |
| 164 anchor_widget->GetContentsView()->SetBounds(10, 10, 100, 100); | 178 anchor_widget->GetContentsView()->SetBounds(10, 10, 100, 100); |
| 165 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); | 179 const gfx::Rect view_rect = bubble_delegate->GetAnchorRect(); |
| 166 | 180 |
| 167 anchor_widget->GetContentsView()->SetBounds(20, 10, 100, 100); | 181 anchor_widget->GetContentsView()->SetBounds(20, 10, 100, 100); |
| 168 const gfx::Rect view_rect_2 = bubble_delegate->GetAnchorRect(); | 182 const gfx::Rect view_rect_2 = bubble_delegate->GetAnchorRect(); |
| 169 EXPECT_NE(view_rect.ToString(), view_rect_2.ToString()); | 183 EXPECT_NE(view_rect.ToString(), view_rect_2.ToString()); |
| 170 } | 184 } |
| 171 | 185 |
| 172 TEST_F(BubbleDelegateTest, ResetAnchorWidget) { | 186 TEST_F(BubbleDialogDelegateTest, ResetAnchorWidget) { |
| 173 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 187 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 174 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 188 BubbleDialogDelegateView* bubble_delegate = |
| 175 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 189 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 176 | 190 |
| 177 // Make sure the bubble widget is parented to a widget other than the anchor | 191 // Make sure the bubble widget is parented to a widget other than the anchor |
| 178 // widget so that closing the anchor widget does not close the bubble widget. | 192 // widget so that closing the anchor widget does not close the bubble widget. |
| 179 scoped_ptr<Widget> parent_widget(CreateTestWidget()); | 193 scoped_ptr<Widget> parent_widget(CreateTestWidget()); |
| 180 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); | 194 bubble_delegate->set_parent_window(parent_widget->GetNativeView()); |
| 181 // Preventing close on deactivate should not prevent closing with the parent. | 195 // Preventing close on deactivate should not prevent closing with the parent. |
| 182 bubble_delegate->set_close_on_deactivate(false); | 196 bubble_delegate->set_close_on_deactivate(false); |
| 183 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 197 Widget* bubble_widget = |
| 198 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 184 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); | 199 EXPECT_EQ(bubble_delegate, bubble_widget->widget_delegate()); |
| 185 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); | 200 EXPECT_EQ(bubble_widget, bubble_delegate->GetWidget()); |
| 186 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 201 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 187 test::TestWidgetObserver bubble_observer(bubble_widget); | 202 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 188 EXPECT_FALSE(bubble_observer.widget_closed()); | 203 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 189 | 204 |
| 190 // Showing and hiding the bubble widget should have no effect on its anchor. | 205 // Showing and hiding the bubble widget should have no effect on its anchor. |
| 191 bubble_widget->Show(); | 206 bubble_widget->Show(); |
| 192 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 207 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 193 bubble_widget->Hide(); | 208 bubble_widget->Hide(); |
| 194 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); | 209 EXPECT_EQ(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 195 | 210 |
| 196 // Ensure that closing the anchor widget clears the bubble's reference to that | 211 // Ensure that closing the anchor widget clears the bubble's reference to that |
| 197 // anchor widget, but the bubble itself does not close. | 212 // anchor widget, but the bubble itself does not close. |
| 198 anchor_widget->CloseNow(); | 213 anchor_widget->CloseNow(); |
| 199 EXPECT_NE(anchor_widget.get(), bubble_delegate->anchor_widget()); | 214 EXPECT_NE(anchor_widget.get(), bubble_delegate->anchor_widget()); |
| 200 EXPECT_FALSE(bubble_observer.widget_closed()); | 215 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 201 | 216 |
| 202 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: | 217 // TODO(msw): Remove activation hack to prevent bookkeeping errors in: |
| 203 // aura::test::TestActivationClient::OnWindowDestroyed(). | 218 // aura::test::TestActivationClient::OnWindowDestroyed(). |
| 204 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); | 219 scoped_ptr<Widget> smoke_and_mirrors_widget(CreateTestWidget()); |
| 205 EXPECT_FALSE(bubble_observer.widget_closed()); | 220 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 206 | 221 |
| 207 // Ensure that closing the parent widget also closes the bubble itself. | 222 // Ensure that closing the parent widget also closes the bubble itself. |
| 208 parent_widget->CloseNow(); | 223 parent_widget->CloseNow(); |
| 209 EXPECT_TRUE(bubble_observer.widget_closed()); | 224 EXPECT_TRUE(bubble_observer.widget_closed()); |
| 210 } | 225 } |
| 211 | 226 |
| 212 TEST_F(BubbleDelegateTest, InitiallyFocusedView) { | 227 TEST_F(BubbleDialogDelegateTest, InitiallyFocusedView) { |
| 213 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 228 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 214 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 229 BubbleDialogDelegateView* bubble_delegate = |
| 215 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 230 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 216 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 231 Widget* bubble_widget = |
| 232 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 233 bubble_widget->Show(); | |
| 217 EXPECT_EQ(bubble_delegate->GetInitiallyFocusedView(), | 234 EXPECT_EQ(bubble_delegate->GetInitiallyFocusedView(), |
| 218 bubble_widget->GetFocusManager()->GetFocusedView()); | 235 bubble_widget->GetFocusManager()->GetFocusedView()); |
| 219 bubble_widget->CloseNow(); | 236 bubble_widget->CloseNow(); |
| 220 } | 237 } |
| 221 | 238 |
| 222 TEST_F(BubbleDelegateTest, NonClientHitTest) { | 239 TEST_F(BubbleDialogDelegateTest, NonClientHitTest) { |
| 223 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 240 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 224 TestBubbleDelegateView* bubble_delegate = | 241 TestBubbleDialogDelegateView* bubble_delegate = |
| 225 new TestBubbleDelegateView(anchor_widget->GetContentsView()); | 242 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 226 BubbleDelegateView::CreateBubble(bubble_delegate); | 243 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 227 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); | 244 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); |
| 228 const int border = frame->bubble_border()->GetBorderThickness(); | 245 const int border = frame->bubble_border()->GetBorderThickness(); |
| 229 | 246 |
| 230 struct { | 247 struct { |
| 231 const int point; | 248 const int point; |
| 232 const int hit; | 249 const int hit; |
| 233 } cases[] = { | 250 } cases[] = { |
| 234 { border, HTNOWHERE }, | 251 {border, HTNOWHERE}, {border + 50, HTCLIENT}, {1000, HTNOWHERE}, |
| 235 { border + 50, HTCLIENT }, | |
| 236 { 1000, HTNOWHERE }, | |
| 237 }; | 252 }; |
| 238 | 253 |
| 239 for (size_t i = 0; i < arraysize(cases); ++i) { | 254 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 240 gfx::Point point(cases[i].point, cases[i].point); | 255 gfx::Point point(cases[i].point, cases[i].point); |
| 241 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) | 256 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) |
| 242 << " with border: " << border << ", at point " << cases[i].point; | 257 << " with border: " << border << ", at point " << cases[i].point; |
| 243 } | 258 } |
| 244 } | 259 } |
| 245 | 260 |
| 246 TEST_F(BubbleDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { | 261 TEST_F(BubbleDialogDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { |
| 247 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 262 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 248 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 263 BubbleDialogDelegateView* bubble_delegate = |
| 249 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 264 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 250 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 265 Widget* bubble_widget = |
| 266 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 251 test::TestWidgetObserver bubble_observer(bubble_widget); | 267 test::TestWidgetObserver bubble_observer(bubble_widget); |
| 252 EXPECT_FALSE(bubble_observer.widget_closed()); | 268 EXPECT_FALSE(bubble_observer.widget_closed()); |
| 253 | 269 |
| 254 anchor_widget->Show(); | 270 anchor_widget->Show(); |
| 255 bubble_widget->Show(); | 271 bubble_widget->Show(); |
| 256 EXPECT_TRUE(bubble_widget->IsVisible()); | 272 EXPECT_TRUE(bubble_widget->IsVisible()); |
| 257 anchor_widget->SetBounds(gfx::Rect(10, 10, 100, 100)); | 273 anchor_widget->SetBounds(gfx::Rect(10, 10, 100, 100)); |
| 258 EXPECT_TRUE(bubble_widget->IsVisible()); | 274 EXPECT_TRUE(bubble_widget->IsVisible()); |
| 259 } | 275 } |
| 260 | 276 |
| 261 // Test that setting WidgetDelegate::set_can_activate() to false makes the | 277 // Test that setting WidgetDelegate::set_can_activate() to false makes the |
| 262 // widget created via BubbleDelegateView::CreateBubble() not activatable. | 278 // widget created via BubbleDialogDelegateView::CreateBubble() not activatable. |
| 263 TEST_F(BubbleDelegateTest, NotActivatable) { | 279 TEST_F(BubbleDialogDelegateTest, NotActivatable) { |
| 264 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 280 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 265 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 281 BubbleDialogDelegateView* bubble_delegate = |
| 266 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 282 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 267 bubble_delegate->set_can_activate(false); | 283 bubble_delegate->set_can_activate(false); |
| 268 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 284 Widget* bubble_widget = |
| 285 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 269 bubble_widget->Show(); | 286 bubble_widget->Show(); |
| 270 EXPECT_FALSE(bubble_widget->CanActivate()); | 287 EXPECT_FALSE(bubble_widget->CanActivate()); |
| 271 } | 288 } |
| 272 | 289 |
| 273 TEST_F(BubbleDelegateTest, CloseReasons) { | 290 TEST_F(BubbleDialogDelegateTest, CloseReasons) { |
| 274 { | 291 { |
| 275 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 292 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 276 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 293 BubbleDialogDelegateView* bubble_delegate = |
| 277 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 294 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 278 bubble_delegate->set_close_on_deactivate(true); | 295 bubble_delegate->set_close_on_deactivate(true); |
| 279 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 296 Widget* bubble_widget = |
| 297 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 280 anchor_widget->Show(); | 298 anchor_widget->Show(); |
| 281 bubble_widget->Show(); | 299 bubble_widget->Show(); |
| 282 anchor_widget->Activate(); | 300 anchor_widget->Activate(); |
| 283 EXPECT_TRUE(bubble_widget->IsClosed()); | 301 EXPECT_TRUE(bubble_widget->IsClosed()); |
| 284 EXPECT_EQ(BubbleDelegateView::CloseReason::DEACTIVATION, | |
|
msw
2016/03/17 17:28:26
Are close reasons no longer important? Rename this
Evan Stade
2016/03/17 22:41:34
Done.
| |
| 285 bubble_delegate->close_reason()); | |
| 286 } | 302 } |
| 287 | 303 |
| 288 { | 304 { |
| 289 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 305 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
|
msw
2016/03/17 17:28:26
These should probably be three separate tests...
Evan Stade
2016/03/17 22:41:34
I've seen both styles used. I'm sort of ambivalent
| |
| 290 BubbleDelegateView* bubble_delegate = new BubbleDelegateView( | 306 BubbleDialogDelegateView* bubble_delegate = |
| 291 anchor_widget->GetContentsView(), BubbleBorder::NONE); | 307 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 292 bubble_delegate->set_close_on_esc(true); | 308 Widget* bubble_widget = |
| 293 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 309 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 294 bubble_widget->Show(); | 310 bubble_widget->Show(); |
| 295 // Cast as a test hack to access AcceleratorPressed() (which is protected | 311 |
| 296 // in BubbleDelegate). | 312 ui::KeyEvent escape_event(ui::ET_KEY_PRESSED, ui::VKEY_ESCAPE, ui::EF_NONE); |
| 297 static_cast<View*>(bubble_delegate) | 313 bubble_widget->OnKeyEvent(&escape_event); |
| 298 ->AcceleratorPressed(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); | |
| 299 EXPECT_TRUE(bubble_widget->IsClosed()); | 314 EXPECT_TRUE(bubble_widget->IsClosed()); |
| 300 EXPECT_EQ(BubbleDelegateView::CloseReason::ESCAPE, | |
| 301 bubble_delegate->close_reason()); | |
| 302 } | 315 } |
| 303 | 316 |
| 304 { | 317 { |
| 305 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); | 318 scoped_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 306 TestBubbleDelegateView* bubble_delegate = | 319 TestBubbleDialogDelegateView* bubble_delegate = |
| 307 new TestBubbleDelegateView(anchor_widget->GetContentsView()); | 320 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 308 Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); | 321 Widget* bubble_widget = |
| 322 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 309 bubble_widget->Show(); | 323 bubble_widget->Show(); |
| 310 BubbleFrameView* frame_view = bubble_delegate->GetBubbleFrameViewForTest(); | 324 BubbleFrameView* frame_view = bubble_delegate->GetBubbleFrameViewForTest(); |
| 311 LabelButton* close_button = frame_view->close_; | 325 LabelButton* close_button = frame_view->close_; |
| 312 ASSERT_TRUE(close_button); | 326 ASSERT_TRUE(close_button); |
| 313 frame_view->ButtonPressed( | 327 frame_view->ButtonPressed( |
| 314 close_button, | 328 close_button, |
| 315 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), gfx::Point(0, 0), | 329 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 316 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); | 330 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); |
| 317 EXPECT_TRUE(bubble_widget->IsClosed()); | 331 EXPECT_TRUE(bubble_widget->IsClosed()); |
| 318 EXPECT_EQ(BubbleDelegateView::CloseReason::CLOSE_BUTTON, | |
| 319 bubble_delegate->close_reason()); | |
| 320 } | 332 } |
| 321 } | 333 } |
| 322 | 334 |
| 323 } // namespace views | 335 } // namespace views |
| OLD | NEW |