12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/scroll_view.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/views/controls/scrollbar/overlay_scroll_bar.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/views/test/test_views.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kWidth = 100;
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kMinHeight = 50;
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst int kMaxHeight = 100;
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// View implementation that allows setting the preferred size.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CustomView : public View {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView() {}
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPreferredSize(const gfx::Size& size) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    preferred_size_ = size;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreferredSizeChanged();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return preferred_size_;
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size pref = GetPreferredSize();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int width = pref.width();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int height = pref.height();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent()) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      width = std::max(parent()->width(), width);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      height = std::max(parent()->height(), height);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetBounds(x(), y(), width, height);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size preferred_size_;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CustomView);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies the viewport is sized to fit the available space.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, ViewportSizedToFit) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* contents = new View;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString());
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies the scrollbars are added as necessary.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, ScrollBars) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* contents = new View;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size the contents such that vertical scrollbar is needed.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 50, 400);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100, contents->parent()->height());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(!scroll_view.horizontal_scroll_bar() ||
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              !scroll_view.horizontal_scroll_bar()->visible());
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible());
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size the contents such that horizontal scrollbar is needed.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 400, 50);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100, contents->parent()->width());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarHeight(),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            contents->parent()->height());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(!scroll_view.vertical_scroll_bar() ||
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              !scroll_view.vertical_scroll_bar()->visible());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Both horizontal and vertical.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 300, 400);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarHeight(),
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            contents->parent()->height());
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible());
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Assertions around adding a header.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, Header) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* contents = new View;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView* header = new CustomView;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetHeader(header);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* header_parent = header->parent();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |header|s preferred size is empty, which should result in all space going
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to contents.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x0", header->parent()->bounds().ToString());
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the header a height of 20.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header->SetPreferredSize(gfx::Size(10, 20));
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x20", header->parent()->bounds().ToString());
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,20 100x80", contents->parent()->bounds().ToString());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the header.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetHeader(NULL);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetHeader(NULL) deletes header.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header = NULL;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x0", header_parent->bounds().ToString());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies the scrollbars are added as necessary when a header is present.
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, ScrollBarsWithHeader) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  View* contents = new View;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView* header = new CustomView;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetHeader(header);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header->SetPreferredSize(gfx::Size(10, 20));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size the contents such that vertical scrollbar is needed.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 50, 400);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, contents->parent()->x());
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, contents->parent()->y());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(80, contents->parent()->height());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->x());
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->y());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), header->parent()->width());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, header->parent()->height());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(!scroll_view.horizontal_scroll_bar() ||
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              !scroll_view.horizontal_scroll_bar()->visible());
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Size the contents such that horizontal scrollbar is needed.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 400, 50);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, contents->parent()->x());
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, contents->parent()->y());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100, contents->parent()->width());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarHeight() - 20,
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            contents->parent()->height());
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->x());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->y());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100, header->parent()->width());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, header->parent()->height());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(!scroll_view.vertical_scroll_bar() ||
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              !scroll_view.vertical_scroll_bar()->visible());
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Both horizontal and vertical.
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetBounds(0, 0, 300, 400);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, contents->parent()->x());
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, contents->parent()->y());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width());
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarHeight() - 20,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            contents->parent()->height());
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->x());
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, header->parent()->y());
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), header->parent()->width());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, header->parent()->height());
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible());
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies the header scrolls horizontally with the content.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, HeaderScrollsWithContent) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView* contents = new CustomView;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetPreferredSize(gfx::Size(500, 500));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView* header = new CustomView;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetHeader(header);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  header->SetPreferredSize(gfx::Size(500, 20));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0", contents->bounds().origin().ToString());
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0", header->bounds().origin().ToString());
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll the horizontal scrollbar.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.horizontal_scroll_bar());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.ScrollToPosition(
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const_cast<ScrollBar*>(scroll_view.horizontal_scroll_bar()), 1);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-1,0", contents->bounds().origin().ToString());
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-1,0", header->bounds().origin().ToString());
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scrolling the vertical scrollbar shouldn't effect the header.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(scroll_view.vertical_scroll_bar());
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.ScrollToPosition(
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const_cast<ScrollBar*>(scroll_view.vertical_scroll_bar()), 1);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-1,-1", contents->bounds().origin().ToString());
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("-1,0", header->bounds().origin().ToString());
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies ScrollRectToVisible() on the child works.
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ScrollViewTest, ScrollRectToVisible) {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollView scroll_view;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CustomView* contents = new CustomView;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetContents(contents);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetPreferredSize(gfx::Size(500, 1000));
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_view.Layout();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("0,0", contents->bounds().origin().ToString());
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll to y=405 height=10, this should make the y position of the content
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // at (405 + 10) - viewport_height (scroll region bottom aligned).
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->ScrollRectToVisible(gfx::Rect(0, 405, 10, 10));
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int viewport_height = contents->parent()->height();
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-(415 - viewport_height), contents->y());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scroll to the current y-location and 10x10; should do nothing.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->ScrollRectToVisible(gfx::Rect(0, -contents->y(), 10, 10));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(-(415 - viewport_height), contents->y());
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Verifies ClipHeightTo() uses the height of the content when it is between the
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// minimum and maximum height values.
246effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST(ScrollViewTest, ClipHeightToNormalContentHeight) {
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScrollView scroll_view;
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.ClipHeightTo(kMinHeight, kMaxHeight);
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int kNormalContentHeight = 75;
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetContents(
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new views::StaticSizedView(gfx::Size(kWidth, kNormalContentHeight)));
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight),
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            scroll_view.GetPreferredSize());
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SizeToPreferredSize();
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.Layout();
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight),
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            scroll_view.contents()->size());
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), scroll_view.size());
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Verifies ClipHeightTo() uses the minimum height when the content is shorter
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// thamn the minimum height value.
268effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST(ScrollViewTest, ClipHeightToShortContentHeight) {
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScrollView scroll_view;
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.ClipHeightTo(kMinHeight, kMaxHeight);
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int kShortContentHeight = 10;
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetContents(
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new views::StaticSizedView(gfx::Size(kWidth, kShortContentHeight)));
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view.GetPreferredSize());
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SizeToPreferredSize();
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.Layout();
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kShortContentHeight),
283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            scroll_view.contents()->size());
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view.size());
285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Verifies ClipHeightTo() uses the maximum height when the content is longer
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// thamn the maximum height value.
289effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST(ScrollViewTest, ClipHeightToTallContentHeight) {
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScrollView scroll_view;
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Use a scrollbar that is disabled by default, so the width of the content is
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // not affected.
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetVerticalScrollBar(new views::OverlayScrollBar(false));
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.ClipHeightTo(kMinHeight, kMaxHeight);
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const int kTallContentHeight = 1000;
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetContents(
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      new views::StaticSizedView(gfx::Size(kWidth, kTallContentHeight)));
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.GetPreferredSize());
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SizeToPreferredSize();
305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.Layout();
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kTallContentHeight),
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            scroll_view.contents()->size());
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.size());
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Verifies that when ClipHeightTo() produces a scrollbar, it reduces the width
313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// of the inner content of the ScrollView.
314effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST(ScrollViewTest, ClipHeightToScrollbarUsesWidth) {
315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ScrollView scroll_view;
316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.ClipHeightTo(kMinHeight, kMaxHeight);
318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Create a view that will be much taller than it is wide.
320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetContents(new views::ProportionallySizedView(1000));
321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Without any width, it will default to 0,0 but be overridden by min height.
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SizeToPreferredSize();
324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(0, kMinHeight), scroll_view.GetPreferredSize());
325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Size new_size(kWidth, scroll_view.GetHeightForWidth(kWidth));
327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.SetSize(new_size);
328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scroll_view.Layout();
329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int scroll_bar_width = scroll_view.GetScrollBarWidth();
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int expected_width = kWidth - scroll_bar_width;
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(scroll_view.contents()->size().width(), expected_width);
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(scroll_view.contents()->size().height(), 1000 * expected_width);
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.size());
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(ScrollViewTest, CornerViewVisibility) {
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ScrollView scroll_view;
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  View* contents = new View;
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.SetContents(contents);
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100));
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  View* corner_view = scroll_view.corner_view_;
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Corner view should be visible when both scrollbars are visible.
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  contents->SetBounds(0, 0, 200, 200);
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.Layout();
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(&scroll_view, corner_view->parent());
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(corner_view->visible());
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Corner view should be aligned to the scrollbars.
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(scroll_view.vertical_scroll_bar()->x(), corner_view->x());
3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(scroll_view.horizontal_scroll_bar()->y(), corner_view->y());
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(scroll_view.GetScrollBarWidth(), corner_view->width());
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(scroll_view.GetScrollBarHeight(), corner_view->height());
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Corner view should be removed when only the vertical scrollbar is visible.
3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  contents->SetBounds(0, 0, 50, 200);
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.Layout();
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(corner_view->parent());
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ... or when only the horizontal scrollbar is visible.
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  contents->SetBounds(0, 0, 200, 50);
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.Layout();
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(corner_view->parent());
3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ... or when no scrollbar is visible.
3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  contents->SetBounds(0, 0, 50, 50);
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.Layout();
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(corner_view->parent());
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Corner view should reappear when both scrollbars reappear.
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  contents->SetBounds(0, 0, 200, 200);
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scroll_view.Layout();
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(&scroll_view, corner_view->parent());
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(corner_view->visible());
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
379