Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 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" | 5 #include "ui/views/bubble/bubble_dialog_delegate.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/strings/utf_string_conversions.h" | |
| 11 #include "ui/base/hit_test.h" | 12 #include "ui/base/hit_test.h" |
| 12 #include "ui/events/event_utils.h" | 13 #include "ui/events/event_utils.h" |
| 13 #include "ui/views/bubble/bubble_frame_view.h" | 14 #include "ui/views/bubble/bubble_frame_view.h" |
| 14 #include "ui/views/controls/button/label_button.h" | 15 #include "ui/views/controls/button/label_button.h" |
| 16 #include "ui/views/test/test_views.h" | |
| 15 #include "ui/views/test/test_widget_observer.h" | 17 #include "ui/views/test/test_widget_observer.h" |
| 16 #include "ui/views/test/views_test_base.h" | 18 #include "ui/views/test/views_test_base.h" |
| 17 #include "ui/views/widget/widget.h" | 19 #include "ui/views/widget/widget.h" |
| 18 #include "ui/views/widget/widget_observer.h" | 20 #include "ui/views/widget/widget_observer.h" |
| 19 | 21 |
| 20 namespace views { | 22 namespace views { |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 class TestBubbleDialogDelegateView : public BubbleDialogDelegateView { | 26 class TestBubbleDialogDelegateView : public BubbleDialogDelegateView { |
| 25 public: | 27 public: |
| 26 TestBubbleDialogDelegateView(View* anchor_view) | 28 TestBubbleDialogDelegateView(View* anchor_view) |
| 27 : BubbleDialogDelegateView(anchor_view, BubbleBorder::TOP_LEFT), | 29 : BubbleDialogDelegateView(anchor_view, BubbleBorder::TOP_LEFT), |
| 28 view_(new View()) { | 30 view_(new View()), |
| 31 title_view_(nullptr) { | |
| 29 view_->SetFocusBehavior(FocusBehavior::ALWAYS); | 32 view_->SetFocusBehavior(FocusBehavior::ALWAYS); |
| 30 AddChildView(view_); | 33 AddChildView(view_); |
| 31 } | 34 } |
| 32 ~TestBubbleDialogDelegateView() override {} | 35 ~TestBubbleDialogDelegateView() override {} |
| 33 | 36 |
| 34 // BubbleDialogDelegateView overrides: | 37 // BubbleDialogDelegateView overrides: |
| 35 View* GetInitiallyFocusedView() override { return view_; } | 38 View* GetInitiallyFocusedView() override { return view_; } |
| 36 gfx::Size CalculatePreferredSize() const override { | 39 gfx::Size CalculatePreferredSize() const override { |
| 37 return gfx::Size(200, 200); | 40 return gfx::Size(200, 200); |
| 38 } | 41 } |
| 39 | 42 |
| 43 base::string16 GetWindowTitle() const override { | |
| 44 return base::ASCIIToUTF16("TITLE TITLE TITLE"); | |
| 45 } | |
| 46 | |
| 47 View* CreateTitleView(base::string16 title_text) override { | |
| 48 EXPECT_EQ(title_text, GetWindowTitle()); | |
| 49 return title_view_; | |
| 50 } | |
| 51 | |
| 52 void set_title_view(View* title_view) { title_view_ = title_view; } | |
| 53 View* title_view() { return title_view_; } | |
| 54 | |
| 40 using BubbleDialogDelegateView::SetAnchorRect; | 55 using BubbleDialogDelegateView::SetAnchorRect; |
| 41 using BubbleDialogDelegateView::GetBubbleFrameView; | 56 using BubbleDialogDelegateView::GetBubbleFrameView; |
| 42 | 57 |
| 43 private: | 58 private: |
| 44 View* view_; | 59 View* view_; |
| 60 View* title_view_; | |
| 45 | 61 |
| 46 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); | 62 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); |
| 47 }; | 63 }; |
| 48 | 64 |
| 49 class BubbleDialogDelegateTest : public ViewsTestBase { | 65 class BubbleDialogDelegateTest : public ViewsTestBase { |
| 50 public: | 66 public: |
| 51 BubbleDialogDelegateTest() {} | 67 BubbleDialogDelegateTest() {} |
| 52 ~BubbleDialogDelegateTest() override {} | 68 ~BubbleDialogDelegateTest() override {} |
| 53 | 69 |
| 54 // Creates and shows a test widget that owns its native widget. | 70 // Creates and shows a test widget that owns its native widget. |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 244 TestBubbleDialogDelegateView* bubble_delegate = | 260 TestBubbleDialogDelegateView* bubble_delegate = |
| 245 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); | 261 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 246 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | 262 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 247 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); | 263 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); |
| 248 const int border = frame->bubble_border()->GetBorderThickness(); | 264 const int border = frame->bubble_border()->GetBorderThickness(); |
| 249 | 265 |
| 250 struct { | 266 struct { |
| 251 const int point; | 267 const int point; |
| 252 const int hit; | 268 const int hit; |
| 253 } cases[] = { | 269 } cases[] = { |
| 254 {border, HTNOWHERE}, {border + 50, HTCLIENT}, {1000, HTNOWHERE}, | 270 {border, HTNOWHERE}, {border + 60, HTCLIENT}, {1000, HTNOWHERE}, |
| 255 }; | 271 }; |
| 256 | 272 |
| 257 for (size_t i = 0; i < arraysize(cases); ++i) { | 273 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 258 gfx::Point point(cases[i].point, cases[i].point); | 274 gfx::Point point(cases[i].point, cases[i].point); |
| 259 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) | 275 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) |
| 260 << " with border: " << border << ", at point " << cases[i].point; | 276 << " with border: " << border << ", at point " << cases[i].point; |
| 261 } | 277 } |
| 262 } | 278 } |
| 263 | 279 |
| 264 TEST_F(BubbleDialogDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { | 280 TEST_F(BubbleDialogDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 Button* close_button = frame_view->close_; | 342 Button* close_button = frame_view->close_; |
| 327 ASSERT_TRUE(close_button); | 343 ASSERT_TRUE(close_button); |
| 328 frame_view->ButtonPressed( | 344 frame_view->ButtonPressed( |
| 329 close_button, | 345 close_button, |
| 330 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 346 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 331 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); | 347 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); |
| 332 EXPECT_TRUE(bubble_widget->IsClosed()); | 348 EXPECT_TRUE(bubble_widget->IsClosed()); |
| 333 } | 349 } |
| 334 } | 350 } |
| 335 | 351 |
| 352 TEST_F(BubbleDialogDelegateTest, CustomTitle) { | |
| 353 std::unique_ptr<Widget> anchor_widget(CreateTestWidget()); | |
| 354 TestBubbleDialogDelegateView* bubble_delegate = | |
| 355 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); | |
| 356 constexpr int title_preferred_height = 20; | |
|
Peter Kasting
2017/06/17 01:16:20
Nit: Use kNamingStyle
Bret
2017/06/21 22:37:54
Done.
| |
| 357 View* title_view = new StaticSizedView(gfx::Size(10, title_preferred_height)); | |
| 358 bubble_delegate->set_title_view(title_view); | |
| 359 Widget* bubble_widget = | |
| 360 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | |
| 361 bubble_widget->Show(); | |
| 362 // Title takes up the whole bubble width when there's no icon or close button. | |
|
Peter Kasting
2017/06/17 01:16:20
Nit: Maybe this means the below statement should b
Bret
2017/06/21 22:37:54
I split this into two EXPECTs for the width and he
| |
| 363 EXPECT_EQ(gfx::Size(bubble_delegate->width(), title_preferred_height), | |
| 364 title_view->size()); | |
| 365 } | |
| 366 | |
| 336 } // namespace views | 367 } // namespace views |
| OLD | NEW |