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 |