15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/paint_aggregator.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, InitialState) {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(greg.HasPendingUpdate());
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, SingleInvalidation) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(2, 4, 10, 16);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(rect);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, update.paint_rects.size());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rect, update.paint_rects[0]);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DoubleDisjointInvalidation) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect r1(2, 4, 2, 40);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect r2(4, 2, 40, 2);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(r1);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(r2);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_bounds = gfx::UnionRects(r1, r2);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, update.paint_rects.size());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_bounds, update.GetPaintBounds());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DisjointInvalidationsCombined) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the rectangles such that they don't overlap but cover a very large
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // percentage of the area of covered by their union. This is so we're not
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // very sensitive to the combining heuristic in the paint aggregator.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect r1(2, 4, 2, 1000);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect r2(5, 2, 2, 1000);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(r1);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(r2);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_bounds = gfx::UnionRects(r1, r2);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, update.paint_rects.size());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_bounds, update.paint_rects[0]);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, SingleScroll) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(1, 2, 3, 4);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta(1, 0);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta, rect);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.paint_rects.empty());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rect, update.scroll_rect);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(delta.x(), update.scroll_delta.x());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(delta.y(), update.scroll_delta.y());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect resulting_damage = update.GetScrollDamage();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_damage(1, 2, 1, 4);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_damage, resulting_damage);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DoubleOverlappingScroll) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(1, 2, 3, 4);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta1(1, 0);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta2(1, 0);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta1, rect);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta2, rect);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.paint_rects.empty());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rect, update.scroll_rect);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d expected_delta = delta1 + delta2;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_delta.ToString(), update.scroll_delta.ToString());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect resulting_damage = update.GetScrollDamage();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_damage(1, 2, 2, 4);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_damage, resulting_damage);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, NegatingScroll) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scroll twice in opposite directions by equal amounts.  The result
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be no scrolling.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(1, 2, 3, 4);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta1(1, 0);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta2(-1, 0);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta1, rect);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta2, rect);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(greg.HasPendingUpdate());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DiagonalScroll) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't support optimized diagonal scrolling, so this should result in
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repainting.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect rect(1, 2, 3, 4);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d delta(1, 1);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(delta, rect);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, update.paint_rects.size());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rect, update.paint_rects[0]);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintAfterScroll) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 2, 2);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expecting a paint rect inside the scroll rect
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(paint_rect, update.paint_rects[0]);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintBeforeScroll) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 2, 2);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting a paint rect inside the scroll rect
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  paint_rect.Offset(2, 0);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(paint_rect, update.paint_rects[0]);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintsBeforeAndAfterScroll) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect1(4, 4, 2, 2);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect1);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect2(6, 4, 2, 2);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect2);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_paint_rect = paint_rect2;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expecting a paint rect inside the scroll rect
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_paint_rect, update.paint_rects[0]);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, LargeContainedPaintAfterScroll) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(0, 1), scroll_rect);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(0, 0, 10, 9);  // Repaint 90%
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.paint_rects[0]);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, LargeContainedPaintBeforeScroll) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(0, 0, 10, 9);  // Repaint 90%
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(0, 1), scroll_rect);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.paint_rects[0]);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, OverlappingPaintBeforeScroll) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 10, 2);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_paint_rect = gfx::UnionRects(scroll_rect, paint_rect);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_paint_rect, update.paint_rects[0]);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, OverlappingPaintAfterScroll) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 10, 2);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_paint_rect = gfx::UnionRects(scroll_rect, paint_rect);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.scroll_rect.IsEmpty());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_paint_rect, update.paint_rects[0]);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DisjointPaintBeforeScroll) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 10, 2);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 2, 10);
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(paint_rect, update.paint_rects[0]);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, DisjointPaintAfterScroll) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 2, 10);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 10, 2);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(paint_rect, update.paint_rects[0]);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintTrimmedByScroll) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 6, 6);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(2, 0), scroll_rect);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The paint rect should have become narrower.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_paint_rect(6, 4, 4, 6);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_paint_rect, update.paint_rects[0]);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintEliminatedByScroll) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(4, 4, 6, 6);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(6, 0), scroll_rect);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.paint_rects.empty());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintAfterScrollTrimmedByScrollDamage) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(4, 0), scroll_rect);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(2, 0, 4, 10);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_scroll_damage(0, 0, 4, 10);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_paint_rect(4, 0, 2, 10);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, update.paint_rects.size());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scroll_damage, update.GetScrollDamage());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_paint_rect, update.paint_rects[0]);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(PaintAggregator, ContainedPaintAfterScrollEliminatedByScrollDamage) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator greg;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect scroll_rect(0, 0, 10, 10);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  greg.ScrollRect(gfx::Vector2d(4, 0), scroll_rect);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect paint_rect(2, 0, 2, 10);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.InvalidateRect(paint_rect);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect expected_scroll_damage(0, 0, 4, 10);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(greg.HasPendingUpdate());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PaintAggregator::PendingUpdate update;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  greg.PopPendingUpdate(&update);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(update.scroll_rect.IsEmpty());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(update.paint_rects.empty());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(scroll_rect, update.scroll_rect);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_scroll_damage, update.GetScrollDamage());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
440