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