OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/controls/scroll_view.h" | 5 #include "ui/views/controls/scroll_view.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/test/test_timeouts.h" | 9 #include "base/test/test_timeouts.h" |
10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
125 | 125 |
126 ui::MouseEvent TestLeftMouseAt(const gfx::Point& location, ui::EventType type) { | 126 ui::MouseEvent TestLeftMouseAt(const gfx::Point& location, ui::EventType type) { |
127 return ui::MouseEvent(type, location, location, base::TimeTicks(), | 127 return ui::MouseEvent(type, location, location, base::TimeTicks(), |
128 ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); | 128 ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); |
129 } | 129 } |
130 | 130 |
131 } // namespace | 131 } // namespace |
132 | 132 |
133 using test::ScrollViewTestApi; | 133 using test::ScrollViewTestApi; |
134 | 134 |
135 // Simple test harness for testing a ScrollView directly. | |
136 class ScrollViewTest : public testing::Test { | |
137 public: | |
138 ScrollViewTest() {} | |
139 | |
140 View* InstallContents() { | |
141 const gfx::Rect default_outer_bounds(0, 0, 100, 100); | |
142 View* contents = new View; | |
143 scroll_view_.SetContents(contents); | |
144 scroll_view_.SetBoundsRect(default_outer_bounds); | |
145 return contents; | |
146 } | |
147 | |
148 protected: | |
149 #if defined(OS_MACOSX) | |
150 void SetOverlayScrollersEnabled(bool enabled) { | |
151 scroller_style_.reset(); | |
sky
2016/10/24 16:09:49
It's worth a comment as to why you need two resets
tapted
2016/10/25 02:44:12
Done.
| |
152 scroller_style_.reset(new ui::test::ScopedPreferredScrollerStyle(enabled)); | |
sky
2016/10/24 16:09:49
MakeUnique?
tapted
2016/10/25 02:44:12
Done. There's actually a way to omit the template
| |
153 } | |
154 | |
155 private: | |
156 // Disable overlay scrollers by default. This needs to be set before | |
157 // |scroll_view_| is initialized, otherwise scrollers will try to animate to | |
158 // change modes, which requires a MessageLoop to exist. Tests should only | |
tapted
2016/10/24 06:50:51
It's possible that later on I'll need a MessageLoo
| |
159 // modify this via SetOverlayScrollersEnabled(). | |
160 std::unique_ptr<ui::test::ScopedPreferredScrollerStyle> scroller_style_ = | |
161 base::MakeUnique<ui::test::ScopedPreferredScrollerStyle>(false); | |
162 | |
163 protected: | |
164 #endif | |
165 ScrollView scroll_view_; | |
166 | |
167 private: | |
168 DISALLOW_COPY_AND_ASSIGN(ScrollViewTest); | |
169 }; | |
170 | |
135 // Test harness that includes a Widget to help test ui::Event handling. | 171 // Test harness that includes a Widget to help test ui::Event handling. |
136 class WidgetScrollViewTest : public test::WidgetTest, | 172 class WidgetScrollViewTest : public test::WidgetTest, |
137 public ui::CompositorObserver { | 173 public ui::CompositorObserver { |
138 public: | 174 public: |
139 static const int kDefaultHeight = 100; | 175 static const int kDefaultHeight = 100; |
140 static const int kDefaultWidth = 100; | 176 static const int kDefaultWidth = 100; |
141 | 177 |
142 WidgetScrollViewTest() { | 178 WidgetScrollViewTest() { |
143 #if defined(OS_MACOSX) | 179 #if defined(OS_MACOSX) |
144 // Disable scrollbar hiding (i.e. disable overlay scrollbars) by default. | 180 // Disable scrollbar hiding (i.e. disable overlay scrollbars) by default. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
226 std::unique_ptr<ui::test::ScopedPreferredScrollerStyle> scroller_style_; | 262 std::unique_ptr<ui::test::ScopedPreferredScrollerStyle> scroller_style_; |
227 #endif | 263 #endif |
228 | 264 |
229 DISALLOW_COPY_AND_ASSIGN(WidgetScrollViewTest); | 265 DISALLOW_COPY_AND_ASSIGN(WidgetScrollViewTest); |
230 }; | 266 }; |
231 | 267 |
232 const int WidgetScrollViewTest::kDefaultHeight; | 268 const int WidgetScrollViewTest::kDefaultHeight; |
233 const int WidgetScrollViewTest::kDefaultWidth; | 269 const int WidgetScrollViewTest::kDefaultWidth; |
234 | 270 |
235 // Verifies the viewport is sized to fit the available space. | 271 // Verifies the viewport is sized to fit the available space. |
236 TEST(ScrollViewTest, ViewportSizedToFit) { | 272 TEST_F(ScrollViewTest, ViewportSizedToFit) { |
237 ScrollView scroll_view; | 273 View* contents = InstallContents(); |
238 View* contents = new View; | 274 scroll_view_.Layout(); |
239 scroll_view.SetContents(contents); | |
240 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
241 scroll_view.Layout(); | |
242 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); | 275 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); |
243 } | 276 } |
244 | 277 |
245 // Verifies the viewport and content is sized to fit the available space for | 278 // Verifies the viewport and content is sized to fit the available space for |
246 // bounded scroll view. | 279 // bounded scroll view. |
247 TEST(ScrollViewTest, BoundedViewportSizedToFit) { | 280 TEST_F(ScrollViewTest, BoundedViewportSizedToFit) { |
248 ScrollView scroll_view; | 281 View* contents = InstallContents(); |
249 View* contents = new View; | 282 scroll_view_.ClipHeightTo(100, 200); |
250 scroll_view.SetContents(contents); | 283 scroll_view_.SetBorder(Border::CreateSolidBorder(2, 0)); |
251 scroll_view.ClipHeightTo(100, 200); | 284 scroll_view_.Layout(); |
252 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
253 scroll_view.SetBorder(Border::CreateSolidBorder(2, 0)); | |
254 scroll_view.Layout(); | |
255 EXPECT_EQ("2,2 96x96", contents->parent()->bounds().ToString()); | 285 EXPECT_EQ("2,2 96x96", contents->parent()->bounds().ToString()); |
256 | 286 |
257 // Make sure the width of |contents| is set properly not to overflow the | 287 // Make sure the width of |contents| is set properly not to overflow the |
258 // viewport. | 288 // viewport. |
259 EXPECT_EQ(96, contents->width()); | 289 EXPECT_EQ(96, contents->width()); |
260 } | 290 } |
261 | 291 |
262 // Verifies the scrollbars are added as necessary. | 292 // Verifies the scrollbars are added as necessary. |
263 // If on Mac, test the non-overlay scrollbars. | 293 // If on Mac, test the non-overlay scrollbars. |
264 TEST(ScrollViewTest, ScrollBars) { | 294 TEST_F(ScrollViewTest, ScrollBars) { |
265 #if defined(OS_MACOSX) | 295 View* contents = InstallContents(); |
266 ui::test::ScopedPreferredScrollerStyle scroller_style_override(false); | |
267 #endif | |
268 | |
269 ScrollView scroll_view; | |
270 View* contents = new View; | |
271 scroll_view.SetContents(contents); | |
272 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
273 | 296 |
274 // Size the contents such that vertical scrollbar is needed. | 297 // Size the contents such that vertical scrollbar is needed. |
275 contents->SetBounds(0, 0, 50, 400); | 298 contents->SetBounds(0, 0, 50, 400); |
276 scroll_view.Layout(); | 299 scroll_view_.Layout(); |
277 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width()); | 300 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), |
301 contents->parent()->width()); | |
278 EXPECT_EQ(100, contents->parent()->height()); | 302 EXPECT_EQ(100, contents->parent()->height()); |
279 CheckScrollbarVisibility(scroll_view, VERTICAL, true); | 303 CheckScrollbarVisibility(scroll_view_, VERTICAL, true); |
280 CheckScrollbarVisibility(scroll_view, HORIZONTAL, false); | 304 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, false); |
281 EXPECT_TRUE(!scroll_view.horizontal_scroll_bar() || | 305 EXPECT_TRUE(!scroll_view_.horizontal_scroll_bar() || |
282 !scroll_view.horizontal_scroll_bar()->visible()); | 306 !scroll_view_.horizontal_scroll_bar()->visible()); |
283 ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL); | 307 ASSERT_TRUE(scroll_view_.vertical_scroll_bar() != NULL); |
284 EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible()); | 308 EXPECT_TRUE(scroll_view_.vertical_scroll_bar()->visible()); |
285 | 309 |
286 // Size the contents such that horizontal scrollbar is needed. | 310 // Size the contents such that horizontal scrollbar is needed. |
287 contents->SetBounds(0, 0, 400, 50); | 311 contents->SetBounds(0, 0, 400, 50); |
288 scroll_view.Layout(); | 312 scroll_view_.Layout(); |
289 EXPECT_EQ(100, contents->parent()->width()); | 313 EXPECT_EQ(100, contents->parent()->width()); |
290 EXPECT_EQ(100 - scroll_view.GetScrollBarHeight(), | 314 EXPECT_EQ(100 - scroll_view_.GetScrollBarHeight(), |
291 contents->parent()->height()); | 315 contents->parent()->height()); |
292 CheckScrollbarVisibility(scroll_view, VERTICAL, false); | 316 CheckScrollbarVisibility(scroll_view_, VERTICAL, false); |
293 CheckScrollbarVisibility(scroll_view, HORIZONTAL, true); | 317 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, true); |
294 | 318 |
295 // Both horizontal and vertical. | 319 // Both horizontal and vertical. |
296 contents->SetBounds(0, 0, 300, 400); | 320 contents->SetBounds(0, 0, 300, 400); |
297 scroll_view.Layout(); | 321 scroll_view_.Layout(); |
298 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width()); | 322 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), |
299 EXPECT_EQ(100 - scroll_view.GetScrollBarHeight(), | 323 contents->parent()->width()); |
324 EXPECT_EQ(100 - scroll_view_.GetScrollBarHeight(), | |
300 contents->parent()->height()); | 325 contents->parent()->height()); |
301 CheckScrollbarVisibility(scroll_view, VERTICAL, true); | 326 CheckScrollbarVisibility(scroll_view_, VERTICAL, true); |
302 CheckScrollbarVisibility(scroll_view, HORIZONTAL, true); | 327 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, true); |
303 | 328 |
304 // Add a border, test vertical scrollbar. | 329 // Add a border, test vertical scrollbar. |
305 const int kTopPadding = 1; | 330 const int kTopPadding = 1; |
306 const int kLeftPadding = 2; | 331 const int kLeftPadding = 2; |
307 const int kBottomPadding = 3; | 332 const int kBottomPadding = 3; |
308 const int kRightPadding = 4; | 333 const int kRightPadding = 4; |
309 scroll_view.SetBorder(Border::CreateEmptyBorder( | 334 scroll_view_.SetBorder(Border::CreateEmptyBorder( |
310 kTopPadding, kLeftPadding, kBottomPadding, kRightPadding)); | 335 kTopPadding, kLeftPadding, kBottomPadding, kRightPadding)); |
311 contents->SetBounds(0, 0, 50, 400); | 336 contents->SetBounds(0, 0, 50, 400); |
312 scroll_view.Layout(); | 337 scroll_view_.Layout(); |
313 EXPECT_EQ( | 338 EXPECT_EQ( |
314 100 - scroll_view.GetScrollBarWidth() - kLeftPadding - kRightPadding, | 339 100 - scroll_view_.GetScrollBarWidth() - kLeftPadding - kRightPadding, |
315 contents->parent()->width()); | 340 contents->parent()->width()); |
316 EXPECT_EQ(100 - kTopPadding - kBottomPadding, contents->parent()->height()); | 341 EXPECT_EQ(100 - kTopPadding - kBottomPadding, contents->parent()->height()); |
317 EXPECT_TRUE(!scroll_view.horizontal_scroll_bar() || | 342 EXPECT_TRUE(!scroll_view_.horizontal_scroll_bar() || |
318 !scroll_view.horizontal_scroll_bar()->visible()); | 343 !scroll_view_.horizontal_scroll_bar()->visible()); |
319 ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL); | 344 ASSERT_TRUE(scroll_view_.vertical_scroll_bar() != NULL); |
320 EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible()); | 345 EXPECT_TRUE(scroll_view_.vertical_scroll_bar()->visible()); |
321 gfx::Rect bounds = scroll_view.vertical_scroll_bar()->bounds(); | 346 gfx::Rect bounds = scroll_view_.vertical_scroll_bar()->bounds(); |
322 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth() - kRightPadding, bounds.x()); | 347 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth() - kRightPadding, bounds.x()); |
323 EXPECT_EQ(100 - kRightPadding, bounds.right()); | 348 EXPECT_EQ(100 - kRightPadding, bounds.right()); |
324 EXPECT_EQ(kTopPadding, bounds.y()); | 349 EXPECT_EQ(kTopPadding, bounds.y()); |
325 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); | 350 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); |
326 | 351 |
327 // Horizontal with border. | 352 // Horizontal with border. |
328 contents->SetBounds(0, 0, 400, 50); | 353 contents->SetBounds(0, 0, 400, 50); |
329 scroll_view.Layout(); | 354 scroll_view_.Layout(); |
330 EXPECT_EQ(100 - kLeftPadding - kRightPadding, contents->parent()->width()); | 355 EXPECT_EQ(100 - kLeftPadding - kRightPadding, contents->parent()->width()); |
331 EXPECT_EQ( | 356 EXPECT_EQ( |
332 100 - scroll_view.GetScrollBarHeight() - kTopPadding - kBottomPadding, | 357 100 - scroll_view_.GetScrollBarHeight() - kTopPadding - kBottomPadding, |
333 contents->parent()->height()); | 358 contents->parent()->height()); |
334 ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL); | 359 ASSERT_TRUE(scroll_view_.horizontal_scroll_bar() != NULL); |
335 EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible()); | 360 EXPECT_TRUE(scroll_view_.horizontal_scroll_bar()->visible()); |
336 EXPECT_TRUE(!scroll_view.vertical_scroll_bar() || | 361 EXPECT_TRUE(!scroll_view_.vertical_scroll_bar() || |
337 !scroll_view.vertical_scroll_bar()->visible()); | 362 !scroll_view_.vertical_scroll_bar()->visible()); |
338 bounds = scroll_view.horizontal_scroll_bar()->bounds(); | 363 bounds = scroll_view_.horizontal_scroll_bar()->bounds(); |
339 EXPECT_EQ(kLeftPadding, bounds.x()); | 364 EXPECT_EQ(kLeftPadding, bounds.x()); |
340 EXPECT_EQ(100 - kRightPadding, bounds.right()); | 365 EXPECT_EQ(100 - kRightPadding, bounds.right()); |
341 EXPECT_EQ(100 - kBottomPadding - scroll_view.GetScrollBarHeight(), | 366 EXPECT_EQ(100 - kBottomPadding - scroll_view_.GetScrollBarHeight(), |
342 bounds.y()); | 367 bounds.y()); |
343 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); | 368 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); |
344 | 369 |
345 // Both horizontal and vertical with border. | 370 // Both horizontal and vertical with border. |
346 contents->SetBounds(0, 0, 300, 400); | 371 contents->SetBounds(0, 0, 300, 400); |
347 scroll_view.Layout(); | 372 scroll_view_.Layout(); |
348 EXPECT_EQ( | 373 EXPECT_EQ( |
349 100 - scroll_view.GetScrollBarWidth() - kLeftPadding - kRightPadding, | 374 100 - scroll_view_.GetScrollBarWidth() - kLeftPadding - kRightPadding, |
350 contents->parent()->width()); | 375 contents->parent()->width()); |
351 EXPECT_EQ( | 376 EXPECT_EQ( |
352 100 - scroll_view.GetScrollBarHeight() - kTopPadding - kBottomPadding, | 377 100 - scroll_view_.GetScrollBarHeight() - kTopPadding - kBottomPadding, |
353 contents->parent()->height()); | 378 contents->parent()->height()); |
354 bounds = scroll_view.horizontal_scroll_bar()->bounds(); | 379 bounds = scroll_view_.horizontal_scroll_bar()->bounds(); |
355 // Check horiz. | 380 // Check horiz. |
356 ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL); | 381 ASSERT_TRUE(scroll_view_.horizontal_scroll_bar() != NULL); |
357 EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible()); | 382 EXPECT_TRUE(scroll_view_.horizontal_scroll_bar()->visible()); |
358 bounds = scroll_view.horizontal_scroll_bar()->bounds(); | 383 bounds = scroll_view_.horizontal_scroll_bar()->bounds(); |
359 EXPECT_EQ(kLeftPadding, bounds.x()); | 384 EXPECT_EQ(kLeftPadding, bounds.x()); |
360 EXPECT_EQ(100 - kRightPadding - scroll_view.GetScrollBarWidth(), | 385 EXPECT_EQ(100 - kRightPadding - scroll_view_.GetScrollBarWidth(), |
361 bounds.right()); | 386 bounds.right()); |
362 EXPECT_EQ(100 - kBottomPadding - scroll_view.GetScrollBarHeight(), | 387 EXPECT_EQ(100 - kBottomPadding - scroll_view_.GetScrollBarHeight(), |
363 bounds.y()); | 388 bounds.y()); |
364 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); | 389 EXPECT_EQ(100 - kBottomPadding, bounds.bottom()); |
365 // Check vert. | 390 // Check vert. |
366 ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL); | 391 ASSERT_TRUE(scroll_view_.vertical_scroll_bar() != NULL); |
367 EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible()); | 392 EXPECT_TRUE(scroll_view_.vertical_scroll_bar()->visible()); |
368 bounds = scroll_view.vertical_scroll_bar()->bounds(); | 393 bounds = scroll_view_.vertical_scroll_bar()->bounds(); |
369 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth() - kRightPadding, bounds.x()); | 394 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth() - kRightPadding, bounds.x()); |
370 EXPECT_EQ(100 - kRightPadding, bounds.right()); | 395 EXPECT_EQ(100 - kRightPadding, bounds.right()); |
371 EXPECT_EQ(kTopPadding, bounds.y()); | 396 EXPECT_EQ(kTopPadding, bounds.y()); |
372 EXPECT_EQ(100 - kBottomPadding - scroll_view.GetScrollBarHeight(), | 397 EXPECT_EQ(100 - kBottomPadding - scroll_view_.GetScrollBarHeight(), |
373 bounds.bottom()); | 398 bounds.bottom()); |
374 } | 399 } |
375 | 400 |
376 // Assertions around adding a header. | 401 // Assertions around adding a header. |
377 TEST(ScrollViewTest, Header) { | 402 TEST_F(ScrollViewTest, Header) { |
378 ScrollView scroll_view; | |
379 View* contents = new View; | |
380 CustomView* header = new CustomView; | 403 CustomView* header = new CustomView; |
381 scroll_view.SetHeader(header); | 404 scroll_view_.SetHeader(header); |
382 View* header_parent = header->parent(); | 405 View* header_parent = header->parent(); |
383 scroll_view.SetContents(contents); | 406 View* contents = InstallContents(); |
384 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | 407 |
385 scroll_view.Layout(); | 408 scroll_view_.Layout(); |
386 // |header|s preferred size is empty, which should result in all space going | 409 // |header|s preferred size is empty, which should result in all space going |
387 // to contents. | 410 // to contents. |
388 EXPECT_EQ("0,0 100x0", header->parent()->bounds().ToString()); | 411 EXPECT_EQ("0,0 100x0", header->parent()->bounds().ToString()); |
389 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); | 412 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); |
390 | 413 |
391 // With layered scrolling, ScrollView::Layout() will impose a size on the | 414 // With layered scrolling, ScrollView::Layout() will impose a size on the |
392 // contents that fills the viewport. Since the test view doesn't have its own | 415 // contents that fills the viewport. Since the test view doesn't have its own |
393 // Layout, reset it in this case so that adding a header doesn't shift the | 416 // Layout, reset it in this case so that adding a header doesn't shift the |
394 // contents down and require scrollbars. | 417 // contents down and require scrollbars. |
395 if (contents->layer()) { | 418 if (contents->layer()) { |
396 EXPECT_EQ("0,0 100x100", contents->bounds().ToString()); | 419 EXPECT_EQ("0,0 100x100", contents->bounds().ToString()); |
397 contents->SetBoundsRect(gfx::Rect()); | 420 contents->SetBoundsRect(gfx::Rect()); |
398 } | 421 } |
399 EXPECT_EQ("0,0 0x0", contents->bounds().ToString()); | 422 EXPECT_EQ("0,0 0x0", contents->bounds().ToString()); |
400 | 423 |
401 // Get the header a height of 20. | 424 // Get the header a height of 20. |
402 header->SetPreferredSize(gfx::Size(10, 20)); | 425 header->SetPreferredSize(gfx::Size(10, 20)); |
403 EXPECT_EQ("0,0 100x20", header->parent()->bounds().ToString()); | 426 EXPECT_EQ("0,0 100x20", header->parent()->bounds().ToString()); |
404 EXPECT_EQ("0,20 100x80", contents->parent()->bounds().ToString()); | 427 EXPECT_EQ("0,20 100x80", contents->parent()->bounds().ToString()); |
405 if (contents->layer()) { | 428 if (contents->layer()) { |
406 EXPECT_EQ("0,0 100x80", contents->bounds().ToString()); | 429 EXPECT_EQ("0,0 100x80", contents->bounds().ToString()); |
407 contents->SetBoundsRect(gfx::Rect()); | 430 contents->SetBoundsRect(gfx::Rect()); |
408 } | 431 } |
409 EXPECT_EQ("0,0 0x0", contents->bounds().ToString()); | 432 EXPECT_EQ("0,0 0x0", contents->bounds().ToString()); |
410 | 433 |
411 // Remove the header. | 434 // Remove the header. |
412 scroll_view.SetHeader(NULL); | 435 scroll_view_.SetHeader(NULL); |
413 // SetHeader(NULL) deletes header. | 436 // SetHeader(NULL) deletes header. |
414 header = NULL; | 437 header = NULL; |
415 EXPECT_EQ("0,0 100x0", header_parent->bounds().ToString()); | 438 EXPECT_EQ("0,0 100x0", header_parent->bounds().ToString()); |
416 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); | 439 EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); |
417 } | 440 } |
418 | 441 |
419 // Verifies the scrollbars are added as necessary when a header is present. | 442 // Verifies the scrollbars are added as necessary when a header is present. |
420 TEST(ScrollViewTest, ScrollBarsWithHeader) { | 443 TEST_F(ScrollViewTest, ScrollBarsWithHeader) { |
421 ScrollView scroll_view; | |
422 View* contents = new View; | |
423 scroll_view.SetContents(contents); | |
424 CustomView* header = new CustomView; | 444 CustomView* header = new CustomView; |
425 scroll_view.SetHeader(header); | 445 scroll_view_.SetHeader(header); |
426 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | 446 View* contents = InstallContents(); |
427 | 447 |
428 header->SetPreferredSize(gfx::Size(10, 20)); | 448 header->SetPreferredSize(gfx::Size(10, 20)); |
429 | 449 |
430 // Size the contents such that vertical scrollbar is needed. | 450 // Size the contents such that vertical scrollbar is needed. |
431 contents->SetBounds(0, 0, 50, 400); | 451 contents->SetBounds(0, 0, 50, 400); |
432 scroll_view.Layout(); | 452 scroll_view_.Layout(); |
433 EXPECT_EQ(0, contents->parent()->x()); | 453 EXPECT_EQ(0, contents->parent()->x()); |
434 EXPECT_EQ(20, contents->parent()->y()); | 454 EXPECT_EQ(20, contents->parent()->y()); |
435 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width()); | 455 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), |
456 contents->parent()->width()); | |
436 EXPECT_EQ(80, contents->parent()->height()); | 457 EXPECT_EQ(80, contents->parent()->height()); |
437 EXPECT_EQ(0, header->parent()->x()); | 458 EXPECT_EQ(0, header->parent()->x()); |
438 EXPECT_EQ(0, header->parent()->y()); | 459 EXPECT_EQ(0, header->parent()->y()); |
439 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), header->parent()->width()); | 460 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), header->parent()->width()); |
440 EXPECT_EQ(20, header->parent()->height()); | 461 EXPECT_EQ(20, header->parent()->height()); |
441 EXPECT_TRUE(!scroll_view.horizontal_scroll_bar() || | 462 EXPECT_TRUE(!scroll_view_.horizontal_scroll_bar() || |
442 !scroll_view.horizontal_scroll_bar()->visible()); | 463 !scroll_view_.horizontal_scroll_bar()->visible()); |
443 ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL); | 464 ASSERT_TRUE(scroll_view_.vertical_scroll_bar() != NULL); |
444 EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible()); | 465 EXPECT_TRUE(scroll_view_.vertical_scroll_bar()->visible()); |
445 // Make sure the vertical scrollbar overlaps the header. | 466 // Make sure the vertical scrollbar overlaps the header. |
446 EXPECT_EQ(header->y(), scroll_view.vertical_scroll_bar()->y()); | 467 EXPECT_EQ(header->y(), scroll_view_.vertical_scroll_bar()->y()); |
447 EXPECT_EQ(header->y(), contents->y()); | 468 EXPECT_EQ(header->y(), contents->y()); |
448 | 469 |
449 // Size the contents such that horizontal scrollbar is needed. | 470 // Size the contents such that horizontal scrollbar is needed. |
450 contents->SetBounds(0, 0, 400, 50); | 471 contents->SetBounds(0, 0, 400, 50); |
451 scroll_view.Layout(); | 472 scroll_view_.Layout(); |
452 EXPECT_EQ(0, contents->parent()->x()); | 473 EXPECT_EQ(0, contents->parent()->x()); |
453 EXPECT_EQ(20, contents->parent()->y()); | 474 EXPECT_EQ(20, contents->parent()->y()); |
454 EXPECT_EQ(100, contents->parent()->width()); | 475 EXPECT_EQ(100, contents->parent()->width()); |
455 EXPECT_EQ(100 - scroll_view.GetScrollBarHeight() - 20, | 476 EXPECT_EQ(100 - scroll_view_.GetScrollBarHeight() - 20, |
456 contents->parent()->height()); | 477 contents->parent()->height()); |
457 EXPECT_EQ(0, header->parent()->x()); | 478 EXPECT_EQ(0, header->parent()->x()); |
458 EXPECT_EQ(0, header->parent()->y()); | 479 EXPECT_EQ(0, header->parent()->y()); |
459 EXPECT_EQ(100, header->parent()->width()); | 480 EXPECT_EQ(100, header->parent()->width()); |
460 EXPECT_EQ(20, header->parent()->height()); | 481 EXPECT_EQ(20, header->parent()->height()); |
461 ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL); | 482 ASSERT_TRUE(scroll_view_.horizontal_scroll_bar() != NULL); |
462 EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible()); | 483 EXPECT_TRUE(scroll_view_.horizontal_scroll_bar()->visible()); |
463 EXPECT_TRUE(!scroll_view.vertical_scroll_bar() || | 484 EXPECT_TRUE(!scroll_view_.vertical_scroll_bar() || |
464 !scroll_view.vertical_scroll_bar()->visible()); | 485 !scroll_view_.vertical_scroll_bar()->visible()); |
465 | 486 |
466 // Both horizontal and vertical. | 487 // Both horizontal and vertical. |
467 contents->SetBounds(0, 0, 300, 400); | 488 contents->SetBounds(0, 0, 300, 400); |
468 scroll_view.Layout(); | 489 scroll_view_.Layout(); |
469 EXPECT_EQ(0, contents->parent()->x()); | 490 EXPECT_EQ(0, contents->parent()->x()); |
470 EXPECT_EQ(20, contents->parent()->y()); | 491 EXPECT_EQ(20, contents->parent()->y()); |
471 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width()); | 492 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), |
472 EXPECT_EQ(100 - scroll_view.GetScrollBarHeight() - 20, | 493 contents->parent()->width()); |
494 EXPECT_EQ(100 - scroll_view_.GetScrollBarHeight() - 20, | |
473 contents->parent()->height()); | 495 contents->parent()->height()); |
474 EXPECT_EQ(0, header->parent()->x()); | 496 EXPECT_EQ(0, header->parent()->x()); |
475 EXPECT_EQ(0, header->parent()->y()); | 497 EXPECT_EQ(0, header->parent()->y()); |
476 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), header->parent()->width()); | 498 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), header->parent()->width()); |
477 EXPECT_EQ(20, header->parent()->height()); | 499 EXPECT_EQ(20, header->parent()->height()); |
478 ASSERT_TRUE(scroll_view.horizontal_scroll_bar() != NULL); | 500 ASSERT_TRUE(scroll_view_.horizontal_scroll_bar() != NULL); |
479 EXPECT_TRUE(scroll_view.horizontal_scroll_bar()->visible()); | 501 EXPECT_TRUE(scroll_view_.horizontal_scroll_bar()->visible()); |
480 ASSERT_TRUE(scroll_view.vertical_scroll_bar() != NULL); | 502 ASSERT_TRUE(scroll_view_.vertical_scroll_bar() != NULL); |
481 EXPECT_TRUE(scroll_view.vertical_scroll_bar()->visible()); | 503 EXPECT_TRUE(scroll_view_.vertical_scroll_bar()->visible()); |
482 } | 504 } |
483 | 505 |
484 // Verifies the header scrolls horizontally with the content. | 506 // Verifies the header scrolls horizontally with the content. |
485 TEST(ScrollViewTest, HeaderScrollsWithContent) { | 507 TEST_F(ScrollViewTest, HeaderScrollsWithContent) { |
486 ScrollView scroll_view; | 508 ScrollViewTestApi test_api(&scroll_view_); |
487 ScrollViewTestApi test_api(&scroll_view); | |
488 CustomView* contents = new CustomView; | 509 CustomView* contents = new CustomView; |
489 scroll_view.SetContents(contents); | 510 scroll_view_.SetContents(contents); |
490 contents->SetPreferredSize(gfx::Size(500, 500)); | 511 contents->SetPreferredSize(gfx::Size(500, 500)); |
491 | 512 |
492 CustomView* header = new CustomView; | 513 CustomView* header = new CustomView; |
493 scroll_view.SetHeader(header); | 514 scroll_view_.SetHeader(header); |
494 header->SetPreferredSize(gfx::Size(500, 20)); | 515 header->SetPreferredSize(gfx::Size(500, 20)); |
495 | 516 |
496 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | 517 scroll_view_.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); |
497 EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString()); | 518 EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString()); |
498 EXPECT_EQ("0,0", header->bounds().origin().ToString()); | 519 EXPECT_EQ("0,0", header->bounds().origin().ToString()); |
499 | 520 |
500 // Scroll the horizontal scrollbar. | 521 // Scroll the horizontal scrollbar. |
501 ASSERT_TRUE(scroll_view.horizontal_scroll_bar()); | 522 ASSERT_TRUE(scroll_view_.horizontal_scroll_bar()); |
502 scroll_view.ScrollToPosition( | 523 scroll_view_.ScrollToPosition( |
503 const_cast<ScrollBar*>(scroll_view.horizontal_scroll_bar()), 1); | 524 const_cast<ScrollBar*>(scroll_view_.horizontal_scroll_bar()), 1); |
504 EXPECT_EQ("-1,0", test_api.IntegralViewOffset().ToString()); | 525 EXPECT_EQ("-1,0", test_api.IntegralViewOffset().ToString()); |
505 EXPECT_EQ("-1,0", header->bounds().origin().ToString()); | 526 EXPECT_EQ("-1,0", header->bounds().origin().ToString()); |
506 | 527 |
507 // Scrolling the vertical scrollbar shouldn't effect the header. | 528 // Scrolling the vertical scrollbar shouldn't effect the header. |
508 ASSERT_TRUE(scroll_view.vertical_scroll_bar()); | 529 ASSERT_TRUE(scroll_view_.vertical_scroll_bar()); |
509 scroll_view.ScrollToPosition( | 530 scroll_view_.ScrollToPosition( |
510 const_cast<ScrollBar*>(scroll_view.vertical_scroll_bar()), 1); | 531 const_cast<ScrollBar*>(scroll_view_.vertical_scroll_bar()), 1); |
511 EXPECT_EQ("-1,-1", test_api.IntegralViewOffset().ToString()); | 532 EXPECT_EQ("-1,-1", test_api.IntegralViewOffset().ToString()); |
512 EXPECT_EQ("-1,0", header->bounds().origin().ToString()); | 533 EXPECT_EQ("-1,0", header->bounds().origin().ToString()); |
513 } | 534 } |
514 | 535 |
515 // Verifies ScrollRectToVisible() on the child works. | 536 // Verifies ScrollRectToVisible() on the child works. |
516 TEST(ScrollViewTest, ScrollRectToVisible) { | 537 TEST_F(ScrollViewTest, ScrollRectToVisible) { |
517 #if defined(OS_MACOSX) | 538 ScrollViewTestApi test_api(&scroll_view_); |
518 ui::test::ScopedPreferredScrollerStyle scroller_style_override(false); | |
519 #endif | |
520 ScrollView scroll_view; | |
521 ScrollViewTestApi test_api(&scroll_view); | |
522 CustomView* contents = new CustomView; | 539 CustomView* contents = new CustomView; |
523 scroll_view.SetContents(contents); | 540 scroll_view_.SetContents(contents); |
524 contents->SetPreferredSize(gfx::Size(500, 1000)); | 541 contents->SetPreferredSize(gfx::Size(500, 1000)); |
525 | 542 |
526 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | 543 scroll_view_.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); |
527 scroll_view.Layout(); | 544 scroll_view_.Layout(); |
528 EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString()); | 545 EXPECT_EQ("0,0", test_api.IntegralViewOffset().ToString()); |
529 | 546 |
530 // Scroll to y=405 height=10, this should make the y position of the content | 547 // Scroll to y=405 height=10, this should make the y position of the content |
531 // at (405 + 10) - viewport_height (scroll region bottom aligned). | 548 // at (405 + 10) - viewport_height (scroll region bottom aligned). |
532 contents->ScrollRectToVisible(gfx::Rect(0, 405, 10, 10)); | 549 contents->ScrollRectToVisible(gfx::Rect(0, 405, 10, 10)); |
533 const int viewport_height = test_api.contents_viewport()->height(); | 550 const int viewport_height = test_api.contents_viewport()->height(); |
534 | 551 |
535 // Expect there to be a horizontal scrollbar, making the viewport shorter. | 552 // Expect there to be a horizontal scrollbar, making the viewport shorter. |
536 EXPECT_LT(viewport_height, 100); | 553 EXPECT_LT(viewport_height, 100); |
537 | 554 |
538 gfx::ScrollOffset offset = test_api.CurrentOffset(); | 555 gfx::ScrollOffset offset = test_api.CurrentOffset(); |
539 EXPECT_EQ(415 - viewport_height, offset.y()); | 556 EXPECT_EQ(415 - viewport_height, offset.y()); |
540 | 557 |
541 // Scroll to the current y-location and 10x10; should do nothing. | 558 // Scroll to the current y-location and 10x10; should do nothing. |
542 contents->ScrollRectToVisible(gfx::Rect(0, offset.y(), 10, 10)); | 559 contents->ScrollRectToVisible(gfx::Rect(0, offset.y(), 10, 10)); |
543 EXPECT_EQ(415 - viewport_height, test_api.CurrentOffset().y()); | 560 EXPECT_EQ(415 - viewport_height, test_api.CurrentOffset().y()); |
544 } | 561 } |
545 | 562 |
546 // Verifies ClipHeightTo() uses the height of the content when it is between the | 563 // Verifies ClipHeightTo() uses the height of the content when it is between the |
547 // minimum and maximum height values. | 564 // minimum and maximum height values. |
548 TEST(ScrollViewTest, ClipHeightToNormalContentHeight) { | 565 TEST_F(ScrollViewTest, ClipHeightToNormalContentHeight) { |
549 ScrollView scroll_view; | 566 scroll_view_.ClipHeightTo(kMinHeight, kMaxHeight); |
550 | |
551 scroll_view.ClipHeightTo(kMinHeight, kMaxHeight); | |
552 | 567 |
553 const int kNormalContentHeight = 75; | 568 const int kNormalContentHeight = 75; |
554 scroll_view.SetContents( | 569 scroll_view_.SetContents( |
555 new views::StaticSizedView(gfx::Size(kWidth, kNormalContentHeight))); | 570 new views::StaticSizedView(gfx::Size(kWidth, kNormalContentHeight))); |
556 | 571 |
557 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), | 572 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), |
558 scroll_view.GetPreferredSize()); | 573 scroll_view_.GetPreferredSize()); |
559 | 574 |
560 scroll_view.SizeToPreferredSize(); | 575 scroll_view_.SizeToPreferredSize(); |
561 scroll_view.Layout(); | 576 scroll_view_.Layout(); |
562 | 577 |
563 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), | 578 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), |
564 scroll_view.contents()->size()); | 579 scroll_view_.contents()->size()); |
565 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), scroll_view.size()); | 580 EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), scroll_view_.size()); |
566 } | 581 } |
567 | 582 |
568 // Verifies ClipHeightTo() uses the minimum height when the content is shorter | 583 // Verifies ClipHeightTo() uses the minimum height when the content is shorter |
569 // than the minimum height value. | 584 // than the minimum height value. |
570 TEST(ScrollViewTest, ClipHeightToShortContentHeight) { | 585 TEST_F(ScrollViewTest, ClipHeightToShortContentHeight) { |
571 ScrollView scroll_view; | 586 scroll_view_.ClipHeightTo(kMinHeight, kMaxHeight); |
572 | |
573 scroll_view.ClipHeightTo(kMinHeight, kMaxHeight); | |
574 | 587 |
575 const int kShortContentHeight = 10; | 588 const int kShortContentHeight = 10; |
576 View* contents = | 589 View* contents = |
577 new views::StaticSizedView(gfx::Size(kWidth, kShortContentHeight)); | 590 new views::StaticSizedView(gfx::Size(kWidth, kShortContentHeight)); |
578 scroll_view.SetContents(contents); | 591 scroll_view_.SetContents(contents); |
579 | 592 |
580 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view.GetPreferredSize()); | 593 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view_.GetPreferredSize()); |
581 | 594 |
582 scroll_view.SizeToPreferredSize(); | 595 scroll_view_.SizeToPreferredSize(); |
583 scroll_view.Layout(); | 596 scroll_view_.Layout(); |
584 | 597 |
585 // Layered scrolling requires the contents to fill the viewport. | 598 // Layered scrolling requires the contents to fill the viewport. |
586 if (contents->layer()) { | 599 if (contents->layer()) { |
587 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view.contents()->size()); | 600 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view_.contents()->size()); |
588 } else { | 601 } else { |
589 EXPECT_EQ(gfx::Size(kWidth, kShortContentHeight), | 602 EXPECT_EQ(gfx::Size(kWidth, kShortContentHeight), |
590 scroll_view.contents()->size()); | 603 scroll_view_.contents()->size()); |
591 } | 604 } |
592 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view.size()); | 605 EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view_.size()); |
593 } | 606 } |
594 | 607 |
595 // Verifies ClipHeightTo() uses the maximum height when the content is longer | 608 // Verifies ClipHeightTo() uses the maximum height when the content is longer |
596 // thamn the maximum height value. | 609 // thamn the maximum height value. |
597 TEST(ScrollViewTest, ClipHeightToTallContentHeight) { | 610 TEST_F(ScrollViewTest, ClipHeightToTallContentHeight) { |
598 ScrollView scroll_view; | |
599 | |
600 // Use a scrollbar that is disabled by default, so the width of the content is | 611 // Use a scrollbar that is disabled by default, so the width of the content is |
601 // not affected. | 612 // not affected. |
602 scroll_view.SetVerticalScrollBar(new views::OverlayScrollBar(false)); | 613 scroll_view_.SetVerticalScrollBar(new views::OverlayScrollBar(false)); |
603 | 614 |
604 scroll_view.ClipHeightTo(kMinHeight, kMaxHeight); | 615 scroll_view_.ClipHeightTo(kMinHeight, kMaxHeight); |
605 | 616 |
606 const int kTallContentHeight = 1000; | 617 const int kTallContentHeight = 1000; |
607 scroll_view.SetContents( | 618 scroll_view_.SetContents( |
608 new views::StaticSizedView(gfx::Size(kWidth, kTallContentHeight))); | 619 new views::StaticSizedView(gfx::Size(kWidth, kTallContentHeight))); |
609 | 620 |
610 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.GetPreferredSize()); | 621 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view_.GetPreferredSize()); |
611 | 622 |
612 scroll_view.SizeToPreferredSize(); | 623 scroll_view_.SizeToPreferredSize(); |
613 scroll_view.Layout(); | 624 scroll_view_.Layout(); |
614 | 625 |
615 EXPECT_EQ(gfx::Size(kWidth, kTallContentHeight), | 626 EXPECT_EQ(gfx::Size(kWidth, kTallContentHeight), |
616 scroll_view.contents()->size()); | 627 scroll_view_.contents()->size()); |
617 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.size()); | 628 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view_.size()); |
618 } | 629 } |
619 | 630 |
620 // Verifies that when ClipHeightTo() produces a scrollbar, it reduces the width | 631 // Verifies that when ClipHeightTo() produces a scrollbar, it reduces the width |
621 // of the inner content of the ScrollView. | 632 // of the inner content of the ScrollView. |
622 TEST(ScrollViewTest, ClipHeightToScrollbarUsesWidth) { | 633 TEST_F(ScrollViewTest, ClipHeightToScrollbarUsesWidth) { |
623 ScrollView scroll_view; | 634 scroll_view_.ClipHeightTo(kMinHeight, kMaxHeight); |
624 | |
625 scroll_view.ClipHeightTo(kMinHeight, kMaxHeight); | |
626 | 635 |
627 // Create a view that will be much taller than it is wide. | 636 // Create a view that will be much taller than it is wide. |
628 scroll_view.SetContents(new views::ProportionallySizedView(1000)); | 637 scroll_view_.SetContents(new views::ProportionallySizedView(1000)); |
629 | 638 |
630 // Without any width, it will default to 0,0 but be overridden by min height. | 639 // Without any width, it will default to 0,0 but be overridden by min height. |
631 scroll_view.SizeToPreferredSize(); | 640 scroll_view_.SizeToPreferredSize(); |
632 EXPECT_EQ(gfx::Size(0, kMinHeight), scroll_view.GetPreferredSize()); | 641 EXPECT_EQ(gfx::Size(0, kMinHeight), scroll_view_.GetPreferredSize()); |
633 | 642 |
634 gfx::Size new_size(kWidth, scroll_view.GetHeightForWidth(kWidth)); | 643 gfx::Size new_size(kWidth, scroll_view_.GetHeightForWidth(kWidth)); |
635 scroll_view.SetSize(new_size); | 644 scroll_view_.SetSize(new_size); |
636 scroll_view.Layout(); | 645 scroll_view_.Layout(); |
637 | 646 |
638 int scroll_bar_width = scroll_view.GetScrollBarWidth(); | 647 int scroll_bar_width = scroll_view_.GetScrollBarWidth(); |
639 int expected_width = kWidth - scroll_bar_width; | 648 int expected_width = kWidth - scroll_bar_width; |
640 EXPECT_EQ(scroll_view.contents()->size().width(), expected_width); | 649 EXPECT_EQ(scroll_view_.contents()->size().width(), expected_width); |
641 EXPECT_EQ(scroll_view.contents()->size().height(), 1000 * expected_width); | 650 EXPECT_EQ(scroll_view_.contents()->size().height(), 1000 * expected_width); |
642 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view.size()); | 651 EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view_.size()); |
643 } | 652 } |
644 | 653 |
645 TEST(ScrollViewTest, CornerViewVisibility) { | 654 TEST_F(ScrollViewTest, CornerViewVisibility) { |
646 ScrollView scroll_view; | 655 View* contents = InstallContents(); |
647 View* contents = new View; | 656 View* corner_view = ScrollViewTestApi(&scroll_view_).corner_view(); |
648 scroll_view.SetContents(contents); | |
649 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
650 View* corner_view = ScrollViewTestApi(&scroll_view).corner_view(); | |
651 | 657 |
652 // Corner view should be visible when both scrollbars are visible. | 658 // Corner view should be visible when both scrollbars are visible. |
653 contents->SetBounds(0, 0, 200, 200); | 659 contents->SetBounds(0, 0, 200, 200); |
654 scroll_view.Layout(); | 660 scroll_view_.Layout(); |
655 EXPECT_EQ(&scroll_view, corner_view->parent()); | 661 EXPECT_EQ(&scroll_view_, corner_view->parent()); |
656 EXPECT_TRUE(corner_view->visible()); | 662 EXPECT_TRUE(corner_view->visible()); |
657 | 663 |
658 // Corner view should be aligned to the scrollbars. | 664 // Corner view should be aligned to the scrollbars. |
659 EXPECT_EQ(scroll_view.vertical_scroll_bar()->x(), corner_view->x()); | 665 EXPECT_EQ(scroll_view_.vertical_scroll_bar()->x(), corner_view->x()); |
660 EXPECT_EQ(scroll_view.horizontal_scroll_bar()->y(), corner_view->y()); | 666 EXPECT_EQ(scroll_view_.horizontal_scroll_bar()->y(), corner_view->y()); |
661 EXPECT_EQ(scroll_view.GetScrollBarWidth(), corner_view->width()); | 667 EXPECT_EQ(scroll_view_.GetScrollBarWidth(), corner_view->width()); |
662 EXPECT_EQ(scroll_view.GetScrollBarHeight(), corner_view->height()); | 668 EXPECT_EQ(scroll_view_.GetScrollBarHeight(), corner_view->height()); |
663 | 669 |
664 // Corner view should be removed when only the vertical scrollbar is visible. | 670 // Corner view should be removed when only the vertical scrollbar is visible. |
665 contents->SetBounds(0, 0, 50, 200); | 671 contents->SetBounds(0, 0, 50, 200); |
666 scroll_view.Layout(); | 672 scroll_view_.Layout(); |
667 EXPECT_FALSE(corner_view->parent()); | 673 EXPECT_FALSE(corner_view->parent()); |
668 | 674 |
669 // ... or when only the horizontal scrollbar is visible. | 675 // ... or when only the horizontal scrollbar is visible. |
670 contents->SetBounds(0, 0, 200, 50); | 676 contents->SetBounds(0, 0, 200, 50); |
671 scroll_view.Layout(); | 677 scroll_view_.Layout(); |
672 EXPECT_FALSE(corner_view->parent()); | 678 EXPECT_FALSE(corner_view->parent()); |
673 | 679 |
674 // ... or when no scrollbar is visible. | 680 // ... or when no scrollbar is visible. |
675 contents->SetBounds(0, 0, 50, 50); | 681 contents->SetBounds(0, 0, 50, 50); |
676 scroll_view.Layout(); | 682 scroll_view_.Layout(); |
677 EXPECT_FALSE(corner_view->parent()); | 683 EXPECT_FALSE(corner_view->parent()); |
678 | 684 |
679 // Corner view should reappear when both scrollbars reappear. | 685 // Corner view should reappear when both scrollbars reappear. |
680 contents->SetBounds(0, 0, 200, 200); | 686 contents->SetBounds(0, 0, 200, 200); |
681 scroll_view.Layout(); | 687 scroll_view_.Layout(); |
682 EXPECT_EQ(&scroll_view, corner_view->parent()); | 688 EXPECT_EQ(&scroll_view_, corner_view->parent()); |
683 EXPECT_TRUE(corner_view->visible()); | 689 EXPECT_TRUE(corner_view->visible()); |
684 } | 690 } |
685 | 691 |
686 #if defined(OS_MACOSX) | 692 #if defined(OS_MACOSX) |
687 // Tests the overlay scrollbars on Mac. Ensure that they show up properly and | 693 // Tests the overlay scrollbars on Mac. Ensure that they show up properly and |
688 // do not overlap each other. | 694 // do not overlap each other. |
689 TEST(ScrollViewTest, CocoaOverlayScrollBars) { | 695 TEST_F(ScrollViewTest, CocoaOverlayScrollBars) { |
690 std::unique_ptr<ui::test::ScopedPreferredScrollerStyle> | 696 SetOverlayScrollersEnabled(true); |
691 scroller_style_override; | 697 View* contents = InstallContents(); |
692 scroller_style_override.reset( | |
693 new ui::test::ScopedPreferredScrollerStyle(true)); | |
694 ScrollView scroll_view; | |
695 View* contents = new View; | |
696 scroll_view.SetContents(contents); | |
697 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
698 | 698 |
699 // Size the contents such that vertical scrollbar is needed. | 699 // Size the contents such that vertical scrollbar is needed. |
700 // Since it is overlaid, the ViewPort size should match the ScrollView. | 700 // Since it is overlaid, the ViewPort size should match the ScrollView. |
701 contents->SetBounds(0, 0, 50, 400); | 701 contents->SetBounds(0, 0, 50, 400); |
702 scroll_view.Layout(); | 702 scroll_view_.Layout(); |
703 EXPECT_EQ(100, contents->parent()->width()); | 703 EXPECT_EQ(100, contents->parent()->width()); |
704 EXPECT_EQ(100, contents->parent()->height()); | 704 EXPECT_EQ(100, contents->parent()->height()); |
705 EXPECT_EQ(0, scroll_view.GetScrollBarWidth()); | 705 EXPECT_EQ(0, scroll_view_.GetScrollBarWidth()); |
706 CheckScrollbarVisibility(scroll_view, VERTICAL, true); | 706 CheckScrollbarVisibility(scroll_view_, VERTICAL, true); |
707 CheckScrollbarVisibility(scroll_view, HORIZONTAL, false); | 707 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, false); |
708 | 708 |
709 // Size the contents such that horizontal scrollbar is needed. | 709 // Size the contents such that horizontal scrollbar is needed. |
710 contents->SetBounds(0, 0, 400, 50); | 710 contents->SetBounds(0, 0, 400, 50); |
711 scroll_view.Layout(); | 711 scroll_view_.Layout(); |
712 EXPECT_EQ(100, contents->parent()->width()); | 712 EXPECT_EQ(100, contents->parent()->width()); |
713 EXPECT_EQ(100, contents->parent()->height()); | 713 EXPECT_EQ(100, contents->parent()->height()); |
714 EXPECT_EQ(0, scroll_view.GetScrollBarHeight()); | 714 EXPECT_EQ(0, scroll_view_.GetScrollBarHeight()); |
715 CheckScrollbarVisibility(scroll_view, VERTICAL, false); | 715 CheckScrollbarVisibility(scroll_view_, VERTICAL, false); |
716 CheckScrollbarVisibility(scroll_view, HORIZONTAL, true); | 716 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, true); |
717 | 717 |
718 // Both horizontal and vertical scrollbars. | 718 // Both horizontal and vertical scrollbars. |
719 contents->SetBounds(0, 0, 300, 400); | 719 contents->SetBounds(0, 0, 300, 400); |
720 scroll_view.Layout(); | 720 scroll_view_.Layout(); |
721 EXPECT_EQ(100, contents->parent()->width()); | 721 EXPECT_EQ(100, contents->parent()->width()); |
722 EXPECT_EQ(100, contents->parent()->height()); | 722 EXPECT_EQ(100, contents->parent()->height()); |
723 EXPECT_EQ(0, scroll_view.GetScrollBarWidth()); | 723 EXPECT_EQ(0, scroll_view_.GetScrollBarWidth()); |
724 EXPECT_EQ(0, scroll_view.GetScrollBarHeight()); | 724 EXPECT_EQ(0, scroll_view_.GetScrollBarHeight()); |
725 CheckScrollbarVisibility(scroll_view, VERTICAL, true); | 725 CheckScrollbarVisibility(scroll_view_, VERTICAL, true); |
726 CheckScrollbarVisibility(scroll_view, HORIZONTAL, true); | 726 CheckScrollbarVisibility(scroll_view_, HORIZONTAL, true); |
727 | 727 |
728 // Make sure the horizontal and vertical scrollbars don't overlap each other. | 728 // Make sure the horizontal and vertical scrollbars don't overlap each other. |
729 gfx::Rect vert_bounds = scroll_view.vertical_scroll_bar()->bounds(); | 729 gfx::Rect vert_bounds = scroll_view_.vertical_scroll_bar()->bounds(); |
730 gfx::Rect horiz_bounds = scroll_view.horizontal_scroll_bar()->bounds(); | 730 gfx::Rect horiz_bounds = scroll_view_.horizontal_scroll_bar()->bounds(); |
731 EXPECT_EQ(vert_bounds.x(), horiz_bounds.right()); | 731 EXPECT_EQ(vert_bounds.x(), horiz_bounds.right()); |
732 EXPECT_EQ(horiz_bounds.y(), vert_bounds.bottom()); | 732 EXPECT_EQ(horiz_bounds.y(), vert_bounds.bottom()); |
733 | 733 |
734 // Switch to the non-overlay style and check that the ViewPort is now sized | 734 // Switch to the non-overlay style and check that the ViewPort is now sized |
735 // to be smaller, and ScrollbarWidth and ScrollbarHeight are non-zero. | 735 // to be smaller, and ScrollbarWidth and ScrollbarHeight are non-zero. |
736 scroller_style_override.reset( | 736 SetOverlayScrollersEnabled(false); |
737 new ui::test::ScopedPreferredScrollerStyle(false)); | 737 EXPECT_EQ(100 - scroll_view_.GetScrollBarWidth(), |
738 EXPECT_EQ(100 - scroll_view.GetScrollBarWidth(), contents->parent()->width()); | 738 contents->parent()->width()); |
739 EXPECT_EQ(100 - scroll_view.GetScrollBarHeight(), | 739 EXPECT_EQ(100 - scroll_view_.GetScrollBarHeight(), |
740 contents->parent()->height()); | 740 contents->parent()->height()); |
741 EXPECT_NE(0, scroll_view.GetScrollBarWidth()); | 741 EXPECT_NE(0, scroll_view_.GetScrollBarWidth()); |
742 EXPECT_NE(0, scroll_view.GetScrollBarHeight()); | 742 EXPECT_NE(0, scroll_view_.GetScrollBarHeight()); |
743 } | 743 } |
744 #endif | 744 #endif |
745 | 745 |
746 // Test that increasing the size of the viewport "below" scrolled content causes | 746 // Test that increasing the size of the viewport "below" scrolled content causes |
747 // the content to scroll up so that it still fills the viewport. | 747 // the content to scroll up so that it still fills the viewport. |
748 TEST(ScrollViewTest, ConstrainScrollToBounds) { | 748 TEST_F(ScrollViewTest, ConstrainScrollToBounds) { |
749 ScrollView scroll_view; | 749 ScrollViewTestApi test_api(&scroll_view_); |
750 ScrollViewTestApi test_api(&scroll_view); | |
751 | 750 |
752 View* contents = new View; | 751 View* contents = InstallContents(); |
753 contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); | 752 contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); |
754 scroll_view.SetContents(contents); | 753 scroll_view_.Layout(); |
755 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 100)); | |
756 scroll_view.Layout(); | |
757 | 754 |
758 EXPECT_EQ(gfx::ScrollOffset(), test_api.CurrentOffset()); | 755 EXPECT_EQ(gfx::ScrollOffset(), test_api.CurrentOffset()); |
759 | 756 |
760 // Scroll as far as it goes and query location to discount scroll bars. | 757 // Scroll as far as it goes and query location to discount scroll bars. |
761 contents->ScrollRectToVisible(gfx::Rect(300, 300, 1, 1)); | 758 contents->ScrollRectToVisible(gfx::Rect(300, 300, 1, 1)); |
762 const gfx::ScrollOffset fully_scrolled = test_api.CurrentOffset(); | 759 const gfx::ScrollOffset fully_scrolled = test_api.CurrentOffset(); |
763 EXPECT_NE(gfx::ScrollOffset(), fully_scrolled); | 760 EXPECT_NE(gfx::ScrollOffset(), fully_scrolled); |
764 | 761 |
765 // Making the viewport 55 pixels taller should scroll up the same amount. | 762 // Making the viewport 55 pixels taller should scroll up the same amount. |
766 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 100, 155)); | 763 scroll_view_.SetBoundsRect(gfx::Rect(0, 0, 100, 155)); |
767 scroll_view.Layout(); | 764 scroll_view_.Layout(); |
768 EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); | 765 EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); |
769 EXPECT_EQ(fully_scrolled.x(), test_api.CurrentOffset().x()); | 766 EXPECT_EQ(fully_scrolled.x(), test_api.CurrentOffset().x()); |
770 | 767 |
771 // And 77 pixels wider should scroll left. Also make it short again: the y- | 768 // And 77 pixels wider should scroll left. Also make it short again: the y- |
772 // offset from the last change should remain. | 769 // offset from the last change should remain. |
773 scroll_view.SetBoundsRect(gfx::Rect(0, 0, 177, 100)); | 770 scroll_view_.SetBoundsRect(gfx::Rect(0, 0, 177, 100)); |
774 scroll_view.Layout(); | 771 scroll_view_.Layout(); |
775 EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); | 772 EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); |
776 EXPECT_EQ(fully_scrolled.x() - 77, test_api.CurrentOffset().x()); | 773 EXPECT_EQ(fully_scrolled.x() - 77, test_api.CurrentOffset().x()); |
777 } | 774 } |
778 | 775 |
779 // Test scrolling behavior when clicking on the scroll track. | 776 // Test scrolling behavior when clicking on the scroll track. |
780 TEST_F(WidgetScrollViewTest, ScrollTrackScrolling) { | 777 TEST_F(WidgetScrollViewTest, ScrollTrackScrolling) { |
781 // Set up with a vertical scroller. | 778 // Set up with a vertical scroller. |
782 ScrollView* scroll_view = | 779 ScrollView* scroll_view_ = |
783 AddScrollViewWithContentSize(gfx::Size(10, kDefaultHeight * 5)); | 780 AddScrollViewWithContentSize(gfx::Size(10, kDefaultHeight * 5)); |
784 ScrollViewTestApi test_api(scroll_view); | 781 ScrollViewTestApi test_api(scroll_view_); |
785 BaseScrollBar* scroll_bar = test_api.GetBaseScrollBar(VERTICAL); | 782 BaseScrollBar* scroll_bar = test_api.GetBaseScrollBar(VERTICAL); |
786 View* thumb = test_api.GetScrollBarThumb(VERTICAL); | 783 View* thumb = test_api.GetScrollBarThumb(VERTICAL); |
787 | 784 |
788 // Click in the middle of the track, ensuring it's below the thumb. | 785 // Click in the middle of the track, ensuring it's below the thumb. |
789 const gfx::Point location = scroll_bar->bounds().CenterPoint(); | 786 const gfx::Point location = scroll_bar->bounds().CenterPoint(); |
790 EXPECT_GT(location.y(), thumb->bounds().bottom()); | 787 EXPECT_GT(location.y(), thumb->bounds().bottom()); |
791 ui::MouseEvent press(TestLeftMouseAt(location, ui::ET_MOUSE_PRESSED)); | 788 ui::MouseEvent press(TestLeftMouseAt(location, ui::ET_MOUSE_PRESSED)); |
792 ui::MouseEvent release(TestLeftMouseAt(location, ui::ET_MOUSE_RELEASED)); | 789 ui::MouseEvent release(TestLeftMouseAt(location, ui::ET_MOUSE_RELEASED)); |
793 | 790 |
794 const base::Timer& timer = test_api.GetScrollBarTimer(VERTICAL); | 791 const base::Timer& timer = test_api.GetScrollBarTimer(VERTICAL); |
795 EXPECT_FALSE(timer.IsRunning()); | 792 EXPECT_FALSE(timer.IsRunning()); |
796 | 793 |
797 EXPECT_EQ(0, scroll_view->GetVisibleRect().y()); | 794 EXPECT_EQ(0, scroll_view_->GetVisibleRect().y()); |
798 scroll_bar->OnMouseEvent(&press); | 795 scroll_bar->OnMouseEvent(&press); |
799 | 796 |
800 // Clicking the scroll track should scroll one "page". | 797 // Clicking the scroll track should scroll one "page". |
801 EXPECT_EQ(kDefaultHeight, scroll_view->GetVisibleRect().y()); | 798 EXPECT_EQ(kDefaultHeight, scroll_view_->GetVisibleRect().y()); |
802 | 799 |
803 // While the mouse is pressed, timer should trigger more scroll events. | 800 // While the mouse is pressed, timer should trigger more scroll events. |
804 EXPECT_TRUE(timer.IsRunning()); | 801 EXPECT_TRUE(timer.IsRunning()); |
805 | 802 |
806 // Upon release timer should stop (and scroll position should remain). | 803 // Upon release timer should stop (and scroll position should remain). |
807 scroll_bar->OnMouseEvent(&release); | 804 scroll_bar->OnMouseEvent(&release); |
808 EXPECT_FALSE(timer.IsRunning()); | 805 EXPECT_FALSE(timer.IsRunning()); |
809 EXPECT_EQ(kDefaultHeight, scroll_view->GetVisibleRect().y()); | 806 EXPECT_EQ(kDefaultHeight, scroll_view_->GetVisibleRect().y()); |
810 } | 807 } |
811 | 808 |
812 // Test that LocatedEvents are transformed correctly when scrolling. | 809 // Test that LocatedEvents are transformed correctly when scrolling. |
813 TEST_F(WidgetScrollViewTest, EventLocation) { | 810 TEST_F(WidgetScrollViewTest, EventLocation) { |
814 // Set up with both scrollers. | 811 // Set up with both scrollers. |
815 CustomView* contents = new CustomView; | 812 CustomView* contents = new CustomView; |
816 contents->SetPreferredSize(gfx::Size(kDefaultHeight * 5, kDefaultHeight * 5)); | 813 contents->SetPreferredSize(gfx::Size(kDefaultHeight * 5, kDefaultHeight * 5)); |
817 AddScrollViewWithContents(contents); | 814 AddScrollViewWithContents(contents); |
818 | 815 |
819 const gfx::Point location_in_widget(10, 10); | 816 const gfx::Point location_in_widget(10, 10); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
894 // Scroll via ScrollView API. Should be reflected on the impl side. | 891 // Scroll via ScrollView API. Should be reflected on the impl side. |
895 offset.set_y(kDefaultHeight * 4); | 892 offset.set_y(kDefaultHeight * 4); |
896 scroll_view->contents()->ScrollRectToVisible(offset); | 893 scroll_view->contents()->ScrollRectToVisible(offset); |
897 EXPECT_EQ(gfx::ScrollOffset(0, offset.y()), test_api.CurrentOffset()); | 894 EXPECT_EQ(gfx::ScrollOffset(0, offset.y()), test_api.CurrentOffset()); |
898 | 895 |
899 EXPECT_TRUE(compositor->GetScrollOffsetForLayer(layer_id, &impl_offset)); | 896 EXPECT_TRUE(compositor->GetScrollOffsetForLayer(layer_id, &impl_offset)); |
900 EXPECT_EQ(gfx::ScrollOffset(0, offset.y()), impl_offset); | 897 EXPECT_EQ(gfx::ScrollOffset(0, offset.y()), impl_offset); |
901 } | 898 } |
902 | 899 |
903 } // namespace views | 900 } // namespace views |
OLD | NEW |