Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(195)

Side by Side Diff: ui/views/bubble/bubble_dialog_delegate_unittest.cc

Issue 2907983002: Allow dialogs to use a custom View as their title. (Closed)
Patch Set: comments 2 Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698