| 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 } |
| 42 void AddedToWidget() override { |
| 43 if (title_view_) |
| 44 GetBubbleFrameView()->SetTitleView(title_view_); |
| 45 } |
| 46 |
| 47 base::string16 GetWindowTitle() const override { |
| 48 return base::ASCIIToUTF16("TITLE TITLE TITLE"); |
| 49 } |
| 50 |
| 51 void set_title_view(View* title_view) { title_view_ = title_view; } |
| 39 | 52 |
| 40 using BubbleDialogDelegateView::SetAnchorRect; | 53 using BubbleDialogDelegateView::SetAnchorRect; |
| 41 using BubbleDialogDelegateView::GetBubbleFrameView; | 54 using BubbleDialogDelegateView::GetBubbleFrameView; |
| 42 | 55 |
| 43 private: | 56 private: |
| 44 View* view_; | 57 View* view_; |
| 58 View* title_view_; |
| 45 | 59 |
| 46 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); | 60 DISALLOW_COPY_AND_ASSIGN(TestBubbleDialogDelegateView); |
| 47 }; | 61 }; |
| 48 | 62 |
| 49 class BubbleDialogDelegateTest : public ViewsTestBase { | 63 class BubbleDialogDelegateTest : public ViewsTestBase { |
| 50 public: | 64 public: |
| 51 BubbleDialogDelegateTest() {} | 65 BubbleDialogDelegateTest() {} |
| 52 ~BubbleDialogDelegateTest() override {} | 66 ~BubbleDialogDelegateTest() override {} |
| 53 | 67 |
| 54 // Creates and shows a test widget that owns its native widget. | 68 // 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 = | 258 TestBubbleDialogDelegateView* bubble_delegate = |
| 245 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); | 259 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 246 BubbleDialogDelegateView::CreateBubble(bubble_delegate); | 260 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 247 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); | 261 BubbleFrameView* frame = bubble_delegate->GetBubbleFrameView(); |
| 248 const int border = frame->bubble_border()->GetBorderThickness(); | 262 const int border = frame->bubble_border()->GetBorderThickness(); |
| 249 | 263 |
| 250 struct { | 264 struct { |
| 251 const int point; | 265 const int point; |
| 252 const int hit; | 266 const int hit; |
| 253 } cases[] = { | 267 } cases[] = { |
| 254 {border, HTNOWHERE}, {border + 50, HTCLIENT}, {1000, HTNOWHERE}, | 268 {border, HTNOWHERE}, {border + 60, HTCLIENT}, {1000, HTNOWHERE}, |
| 255 }; | 269 }; |
| 256 | 270 |
| 257 for (size_t i = 0; i < arraysize(cases); ++i) { | 271 for (size_t i = 0; i < arraysize(cases); ++i) { |
| 258 gfx::Point point(cases[i].point, cases[i].point); | 272 gfx::Point point(cases[i].point, cases[i].point); |
| 259 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) | 273 EXPECT_EQ(cases[i].hit, frame->NonClientHitTest(point)) |
| 260 << " with border: " << border << ", at point " << cases[i].point; | 274 << " with border: " << border << ", at point " << cases[i].point; |
| 261 } | 275 } |
| 262 } | 276 } |
| 263 | 277 |
| 264 TEST_F(BubbleDialogDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { | 278 TEST_F(BubbleDialogDelegateTest, VisibleWhenAnchorWidgetBoundsChanged) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 Button* close_button = frame_view->close_; | 340 Button* close_button = frame_view->close_; |
| 327 ASSERT_TRUE(close_button); | 341 ASSERT_TRUE(close_button); |
| 328 frame_view->ButtonPressed( | 342 frame_view->ButtonPressed( |
| 329 close_button, | 343 close_button, |
| 330 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), | 344 ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), |
| 331 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); | 345 ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); |
| 332 EXPECT_TRUE(bubble_widget->IsClosed()); | 346 EXPECT_TRUE(bubble_widget->IsClosed()); |
| 333 } | 347 } |
| 334 } | 348 } |
| 335 | 349 |
| 350 TEST_F(BubbleDialogDelegateTest, CustomTitle) { |
| 351 std::unique_ptr<Widget> anchor_widget(CreateTestWidget()); |
| 352 TestBubbleDialogDelegateView* bubble_delegate = |
| 353 new TestBubbleDialogDelegateView(anchor_widget->GetContentsView()); |
| 354 constexpr int kTitlePreferredHeight = 20; |
| 355 View* title_view = new StaticSizedView(gfx::Size(10, kTitlePreferredHeight)); |
| 356 bubble_delegate->set_title_view(title_view); |
| 357 Widget* bubble_widget = |
| 358 BubbleDialogDelegateView::CreateBubble(bubble_delegate); |
| 359 bubble_widget->Show(); |
| 360 // Title takes up the whole bubble width when there's no icon or close button. |
| 361 EXPECT_EQ(bubble_delegate->width(), title_view->size().width()); |
| 362 EXPECT_EQ(kTitlePreferredHeight, title_view->size().height()); |
| 363 } |
| 364 |
| 336 } // namespace views | 365 } // namespace views |
| OLD | NEW |