summaryrefslogtreecommitdiff
path: root/chromium/ui/views/window/non_client_view_unittest.cc
blob: fd66cb2c607fe47102fc14f5cc4d946863ac274c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/views/window/non_client_view.h"

#include <memory>

#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/window/client_view.h"
#include "ui/views/window/native_frame_view.h"

namespace views {
namespace test {

namespace {

class NonClientFrameTestView : public NativeFrameView {
 public:
  using NativeFrameView::NativeFrameView;
  int layout_count() const { return layout_count_; }

  // NativeFrameView:
  void Layout() override {
    NativeFrameView::Layout();
    ++layout_count_;
  }

 private:
  int layout_count_ = 0;
};

class ClientTestView : public ClientView {
 public:
  using ClientView::ClientView;
  int layout_count() const { return layout_count_; }

  // ClientView:
  void Layout() override {
    ClientView::Layout();
    ++layout_count_;
  }

 private:
  int layout_count_ = 0;
};

class TestWidgetDelegate : public WidgetDelegateView {
 public:
  // WidgetDelegateView:
  std::unique_ptr<NonClientFrameView> CreateNonClientFrameView(
      Widget* widget) override {
    return std::make_unique<NonClientFrameTestView>(widget);
  }

  views::ClientView* CreateClientView(Widget* widget) override {
    return new ClientTestView(widget, this);
  }
};

class NonClientViewTest : public ViewsTestBase {
 public:
  Widget::InitParams CreateParams(Widget::InitParams::Type type) override {
    Widget::InitParams params = ViewsTestBase::CreateParams(type);
    params.delegate = new TestWidgetDelegate;
    return params;
  }
};

}  // namespace

// Ensure Layout() is not called excessively on a ClientView when Widget bounds
// are changing.
TEST_F(NonClientViewTest, OnlyLayoutChildViewsOnce) {
  std::unique_ptr<views::Widget> widget =
      CreateTestWidget(Widget::InitParams::TYPE_WINDOW);

  NonClientView* non_client_view = widget->non_client_view();
  non_client_view->Layout();

  auto* frame_view =
      static_cast<NonClientFrameTestView*>(non_client_view->frame_view());
  auto* client_view =
      static_cast<ClientTestView*>(non_client_view->client_view());

  int initial_frame_view_layouts = frame_view->layout_count();
  int initial_client_view_layouts = client_view->layout_count();

  // Make sure it does no layout when nothing has changed.
  non_client_view->Layout();
  EXPECT_EQ(frame_view->layout_count(), initial_frame_view_layouts);
  EXPECT_EQ(client_view->layout_count(), initial_client_view_layouts);

  // Ensure changing bounds triggers a (single) layout.
  widget->SetBounds(gfx::Rect(0, 0, 161, 100));
  EXPECT_EQ(frame_view->layout_count(), initial_frame_view_layouts + 1);
  EXPECT_EQ(client_view->layout_count(), initial_client_view_layouts + 1);
}

}  // namespace test
}  // namespace views