layer_tree_host_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {};
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interleaving of redraws and commits
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommitingWithContinuousRedraw : public LayerTreeHostTest {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCommitingWithContinuousRedraw()
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCompleteCommits(0)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDraws(0)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCompleteCommits++;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCompleteCommits == 2)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl*) OVERRIDE
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDraws == 1)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          PostSetNeedsCommitToMainThread();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDraws++;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsRedrawToMainThread();
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCompleteCommits;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommitingWithContinuousRedraw)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestSetNeedsCommit1()
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDraws(0)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDraws++;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!impl->active_tree()->source_frame_number())
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_GE(1, m_numCommits);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_GE(1, m_numDraws);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A setNeedsCommit should lead to 1 commit. Issuing a second commit after that
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestSetNeedsCommit2()
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDraws(0)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (impl->active_tree()->source_frame_number() == 0)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else if (impl->active_tree()->source_frame_number() == 1)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, m_numCommits);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_GE(2, m_numDraws);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestSetNeedsRedraw()
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDraws(0)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, impl->active_tree()->source_frame_number());
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!m_numDraws)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsRedrawToMainThread(); // Redraw again to verify that the second redraw doesn't commit.
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDraws++;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, m_numDraws);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_GE(2, m_numDraws);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numCommits);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestNoExtraCommitFromInvalidate()
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(ContentLayer::Create(&client_))
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetAutomaticallyComputeRasterScale(false);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetIsDrawable(true);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(1, 1));
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (layer_tree_host()->commit_number()) {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Changing the content bounds will cause a single commit!
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_rootLayer->SetRasterScale(4.0f);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // No extra commits.
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, layer_tree_host()->commit_number());
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> m_rootLayer;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCompositeAndReadback()
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 1) {
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            char pixels[4];
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 2) {
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // This is inside the readback. We should get another commit after it.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 3) {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NOTREACHED();
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws : public LayerTreeHostTest {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws()
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 1) {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetNeedsCommit();
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 2) {
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            char pixels[4];
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 3) {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // This is inside the readback. We should get another commit after it.
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 4) {
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NOTREACHED();
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If the layerTreeHost says it can't draw, then we should not try to draw.
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest {
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCanDrawBlocksDrawing()
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_done(false)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_done)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Only the initial draw should bring us here.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(impl->CanDraw());
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, impl->active_tree()->source_frame_number());
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_done)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits >= 1) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // After the first commit, we should not be able to draw.
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(impl->CanDraw());
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 1) {
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Make the viewport empty so the host says it can't draw.
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetViewportSize(gfx::Size(0, 0), gfx::Size(0, 0));
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 2) {
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            char pixels[4];
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (m_numCommits == 3) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Let it draw so we go idle and end the test.
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetViewportSize(gfx::Size(1, 1), gfx::Size(1, 1));
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_done = true;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool m_done;
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// beginLayerWrite should prevent draws from executing until a commit occurs
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersRedraw : public LayerTreeHostTest {
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestWriteLayersRedraw()
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDraws(0)
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostAcquireLayerTextures();
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsRedrawToMainThread(); // should be inhibited without blocking
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDraws++;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(m_numDraws, m_numCommits);
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numCommits);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersRedraw)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that when resuming visibility, requesting layer write permission
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will not deadlock the main thread even though there are not yet any
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled redraws. This behavior is critical for reliably surviving tab
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// switching. There are no failure conditions to this test, it just passes
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by not timing out.
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersAfterVisible : public LayerTreeHostTest {
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestWriteLayersAfterVisible()
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 2)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else if (m_numCommits < 2) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetVisibleToMainThread(false);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetVisibleToMainThread(true);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostAcquireLayerTextures();
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersAfterVisible)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without assertion.
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible : public LayerTreeHostTest {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCompositeAndReadbackWhileInvisible()
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommitAndDrawFrame() OVERRIDE
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 1) {
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetVisible(false);
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetNeedsCommit();
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetNeedsCommit();
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            char pixels[4];
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible)
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestAbortFrameWhenInvisible()
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Request a commit (from the main thread), which will trigger the commit flow from the impl side.
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsCommit();
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Then mark ourselves as not visible before processing any more messages on the main thread.
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetVisible(false);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // If we make it without kicking a frame, we pass!
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTestAfterDelay(1);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_FALSE(true);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited to the impl side.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest {
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCommit() { }
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(20, 20), gfx::Size(20, 20));
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->set_background_color(SK_ColorGRAY);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetPageScaleFactorAndLimits(5, 5, 5);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Size(20, 20), impl->layout_viewport_size());
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color());
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5, impl->active_tree()->page_scale_factor());
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE { }
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit)
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that startPageScaleAnimation events propagate correctly from LayerTreeHost to
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LayerTreeHostImpl in the MT compositor.
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestStartPageScaleAnimation()
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_animationRequested(false)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->SetScrollable(true);
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->SetScrollOffset(gfx::Vector2d());
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsRedrawToMainThread();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void requestStartPageScaleAnimation()
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->StartPageScaleAnimation(gfx::Vector2d(), false, 1.25, base::TimeDelta());
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->active_tree()->root_layer()->SetScrollable(true);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->active_tree()->root_layer()->SetScrollOffset(gfx::Vector2d());
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->active_tree()->SetPageScaleFactorAndLimits(impl->active_tree()->page_scale_factor(), 0.5, 2);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We request animation only once.
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!m_animationRequested) {
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            impl->proxy()->MainThread()->PostTask(base::Bind(&LayerTreeHostTestStartPageScaleAnimation::requestStartPageScaleAnimation, base::Unretained(this)));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_animationRequested = true;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void ApplyScrollAndScale(gfx::Vector2d scrollDelta, float scale) OVERRIDE
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset();
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->SetScrollOffset(offset + scrollDelta);
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5, 2);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->ProcessScrollDeltas();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We get one commit before the first draw, and the animation doesn't happen until the second draw.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (impl->active_tree()->source_frame_number() == 1) {
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1.25, impl->active_tree()->page_scale_factor());
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsRedrawToMainThread();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool m_animationRequested;
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(aelias): This test is currently broken: http://crbug.com/178295
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest {
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestSetVisible()
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numDraws(0)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetVisibleToMainThread(false);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsRedrawToMainThread(); // This is suppressed while we're invisible.
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetVisibleToMainThread(true); // Triggers the redraw.
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(impl->visible());
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ++m_numDraws;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numDraws);
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDraws;
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient {
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestOpacityChangeLayerDelegate()
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_testLayer(0)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void setTestLayer(Layer* testLayer)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_testLayer = testLayer;
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void PaintContents(SkCanvas*, gfx::Rect, gfx::RectF*) OVERRIDE
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Set layer opacity to 0.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_testLayer)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_testLayer->SetOpacity(0);
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* m_testLayer;
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer {
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_refptr<ContentLayerWithUpdateTracking> Create(ContentLayerClient* client) { return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); }
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int paintContentsCount() { return m_paintContentsCount; }
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void resetPaintContentsCount() { m_paintContentsCount = 0; }
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Update(ResourceUpdateQueue* queue, const OcclusionTracker* occlusion, RenderingStats* stats) OVERRIDE
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentLayer::Update(queue, occlusion, stats);
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_paintContentsCount++;
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit ContentLayerWithUpdateTracking(ContentLayerClient* client)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : ContentLayer(client)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_paintContentsCount(0)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetAnchorPoint(gfx::PointF(0, 0));
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetBounds(gfx::Size(10, 10));
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SetIsDrawable(true);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~ContentLayerWithUpdateTracking()
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_paintContentsCount;
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources from being updated during commit.
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestOpacityChange()
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_testOpacityChangeDelegate()
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_updateCheckLayer(ContentLayerWithUpdateTracking::Create(&m_testOpacityChangeDelegate))
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_testOpacityChangeDelegate.setTestLayer(m_updateCheckLayer.get());
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(m_updateCheckLayer);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Update() should have been called once.
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_updateCheckLayer->paintContentsCount());
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // clear m_updateCheckLayer so LayerTreeHost dies.
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_updateCheckLayer = NULL;
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestOpacityChangeLayerDelegate m_testOpacityChangeDelegate;
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_updateCheckLayer;
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer {
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { return make_scoped_refptr(new NoScaleContentLayer(client)); }
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CalculateContentsScale(
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        float ideal_contents_scale,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool animating_transform_to_screen,
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        float* contents_scale_x,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        float* contents_scale_y,
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size* contentBounds) OVERRIDE
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Skip over the ContentLayer's method to the base Layer class.
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Layer::CalculateContentsScale(
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             ideal_contents_scale,
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             animating_transform_to_screen,
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             contents_scale_x,
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             contents_scale_y,
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             contentBounds);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    explicit NoScaleContentLayer(ContentLayerClient* client)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : ContentLayer(client) { }
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~NoScaleContentLayer() { }
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers : public LayerTreeHostTest {
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers()
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(NoScaleContentLayer::Create(&client_))
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_childLayer(ContentLayer::Create(&client_))
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(40, 40), gfx::Size(60, 60));
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetDeviceScaleFactor(1.5);
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Size(40, 40), layer_tree_host()->layout_viewport_size());
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size());
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->AddChild(m_childLayer);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetIsDrawable(true);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(30, 30));
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetAnchorPoint(gfx::PointF(0, 0));
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer->SetIsDrawable(true);
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer->SetPosition(gfx::Point(2, 2));
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer->SetBounds(gfx::Size(10, 10));
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer->SetAnchorPoint(gfx::PointF(0, 0));
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer_tree_host()->InitializeRendererIfNeeded());
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ResourceUpdateQueue queue;
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->UpdateLayers(&queue, std::numeric_limits<size_t>::max());
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Should only do one commit.
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, impl->active_tree()->source_frame_number());
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Device scale factor should come over to impl.
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_NEAR(impl->device_scale_factor(), 1.5, 0.00001);
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Both layers are on impl.
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size());
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Device viewport is scaled.
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Size(40, 40), impl->layout_viewport_size());
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Size(60, 60), impl->device_viewport_size());
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerImpl* root = impl->active_tree()->root_layer();
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerImpl* child = impl->active_tree()->root_layer()->children()[0];
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Positions remain in layout pixels.
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Point(0, 0), root->position());
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(gfx::Point(2, 2), child->position());
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Compute all the layer transforms for the frame.
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostImpl::FrameData frameData;
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->PrepareToDraw(&frameData);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        impl->DidDrawAllLayers(frameData);
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const LayerTreeHostImpl::LayerList& renderSurfaceLayerList =
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          *frameData.render_surface_layer_list;
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Both layers should be drawing into the root render surface.
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(1u, renderSurfaceLayerList.size());
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(root->render_surface(), renderSurfaceLayerList[0]->render_surface());
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(2u, root->render_surface()->layer_list().size());
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The root render surface is the size of the viewport.
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), root->render_surface()->content_rect());
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The content bounds of the child should be scaled.
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size childBoundsScaled = gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5));
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(childBoundsScaled, child->content_bounds());
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform scaleTransform;
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scaleTransform.Scale(impl->device_scale_factor(), impl->device_scale_factor());
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The root layer is scaled by 2x.
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform rootScreenSpaceTransform = scaleTransform;
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform rootDrawTransform = scaleTransform;
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(rootDrawTransform, root->draw_transform());
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(rootScreenSpaceTransform, root->screen_space_transform());
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The child is at position 2,2, which is transformed to 3,3 after the scale
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform childScreenSpaceTransform;
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        childScreenSpaceTransform.Translate(3, 3);
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform childDrawTransform = childScreenSpaceTransform;
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRANSFORMATION_MATRIX_EQ(childDrawTransform, child->draw_transform());
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRANSFORMATION_MATRIX_EQ(childScreenSpaceTransform, child->screen_space_transform());
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer = NULL;
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer = NULL;
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<NoScaleContentLayer> m_rootLayer;
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> m_childLayer;
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers)
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify atomicity of commits and reuse of textures.
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest {
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Make sure partial texture updates are turned off.
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->max_partial_texture_updates = 0;
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Linear fade animator prevents scrollbars from drawing immediately.
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->use_linear_fade_scrollbar_animator = false;
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetupTree() OVERRIDE
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer = FakeContentLayer::Create(&client_);
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer->SetBounds(gfx::Size(10, 20));
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool paint_scrollbar = true;
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool has_thumb = false;
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbar = FakeScrollbarLayer::Create(
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            paint_scrollbar, has_thumb, m_layer->id());
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbar->SetPosition(gfx::Point(0, 10));
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbar->SetBounds(gfx::Size(10, 10));
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer->AddChild(m_scrollbar);
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_layer);
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostTest::SetupTree();
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(0u,
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  layer_tree_host()->settings().max_partial_texture_updates);
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d());
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (impl->active_tree()->source_frame_number()) {
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 0:
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures should be one for each layer
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ASSERT_EQ(2, context->NumTextures());
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should be one for each layer.
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, context->NumUsedTextures());
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Verify that used texture is correct.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures should be doubled as the first textures
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // are used by impl thread and cannot by used for update.
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ASSERT_EQ(4, context->NumTextures());
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should still be one for each layer.
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, context->NumUsedTextures());
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // First textures should not have been used.
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // New textures should have been used.
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d());
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Number of textures used for draw should always be one for each layer.
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, context->NumUsedTextures());
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context->ResetUsedTextures();
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer->SetNeedsDisplay();
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbar->SetNeedsDisplay();
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> m_layer;
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeScrollbarLayer> m_scrollbar;
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit)
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void setLayerPropertiesForTesting(Layer* layer, Layer* parent, const gfx::Transform& transform, const gfx::PointF& anchor, const gfx::PointF& position, const gfx::Size& bounds, bool opaque)
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->RemoveAllChildren();
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent)
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent->AddChild(layer);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetTransform(transform);
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetAnchorPoint(anchor);
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetPosition(position);
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetBounds(bounds);
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetContentsOpaque(opaque);
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate : public LayerTreeHostTest {
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestAtomicCommitWithPartialUpdate()
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommits(0)
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Allow one partial texture update.
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->max_partial_texture_updates = 1;
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Linear fade animator prevents scrollbars from drawing immediately.
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->use_linear_fade_scrollbar_animator = false;
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetupTree() OVERRIDE
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_ = FakeContentLayer::Create(&client_);
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_->SetBounds(gfx::Size(10, 20));
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_child = FakeContentLayer::Create(&client_);
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_child->SetPosition(gfx::Point(0, 10));
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_child->SetBounds(gfx::Size(3, 10));
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool paint_scrollbar = true;
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bool has_thumb = false;
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithPaints = FakeScrollbarLayer::Create(
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            paint_scrollbar, has_thumb, parent_->id());
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithPaints->SetPosition(gfx::Point(3, 10));
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithPaints->SetBounds(gfx::Size(3, 10));
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        paint_scrollbar = false;
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithoutPaints = FakeScrollbarLayer::Create(
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            paint_scrollbar, has_thumb, parent_->id());
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithoutPaints->SetPosition(gfx::Point(6, 10));
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_scrollbarWithoutPaints->SetBounds(gfx::Size(3, 10));
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_->AddChild(m_child);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_->AddChild(m_scrollbarWithPaints);
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_->AddChild(m_scrollbarWithoutPaints);
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(parent_);
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostTest::SetupTree();
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_EQ(1u,
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  layer_tree_host()->settings().max_partial_texture_updates);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (impl->active_tree()->source_frame_number()) {
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 0:
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures should be one for each layer.
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ASSERT_EQ(4, context->NumTextures());
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should be one for each layer.
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(4, context->NumUsedTextures());
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Verify that used textures are correct.
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures should be two for each content layer and one
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // for each scrollbar, since they always do a partial update.
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ASSERT_EQ(6, context->NumTextures());
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should be one for each content
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // layer, and one for the scrollbar layer that paints.
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(3, context->NumUsedTextures());
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // First content textures should not have been used.
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(0)));
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(1)));
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The non-painting scrollbar's texture wasn't updated.
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(2)));
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The painting scrollbar's partial update texture was used.
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // New textures should have been used.
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(4)));
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(5)));
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures should be two for each content layer and one
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // for each scrollbar, since they always do a partial update.
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ASSERT_EQ(6, context->NumTextures());
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should be one for each content
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // layer, and one for the scrollbar layer that paints.
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(3, context->NumUsedTextures());
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The non-painting scrollbar's texture wasn't updated.
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(2)));
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The painting scrollbar does a partial update.
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // One content layer does a partial update also.
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(context->UsedTexture(context->TextureAt(4)));
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(context->UsedTexture(context->TextureAt(5)));
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 3:
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // No textures should be used for commit.
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(0, context->NumUsedTextures());
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 4:
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Number of textures used for commit should be two. One for the
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // content layer, and one for the painting scrollbar. The
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // non-painting scrollbar doesn't update its texture.
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, context->NumUsedTextures());
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            context->ResetUsedTextures();
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 5:
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d());
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Number of textures used for drawing should one per layer except for
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // frame 3 where the viewport only contains one layer.
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (impl->active_tree()->source_frame_number() == 3)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, context->NumUsedTextures());
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(4, context->NumUsedTextures());
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        context->ResetUsedTextures();
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (m_numCommits++) {
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 0:
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            parent_->SetNeedsDisplay();
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_child->SetNeedsDisplay();
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithPaints->SetNeedsDisplay();
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithoutPaints->SetNeedsDisplay();
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Damage part of layers.
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            parent_->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_child->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithPaints->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithoutPaints->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 3:
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_child->SetNeedsDisplay();
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithPaints->SetNeedsDisplay();
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_scrollbarWithoutPaints->SetNeedsDisplay();
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 4:
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetViewportSize(gfx::Size(10, 20), gfx::Size(10, 20));
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 5:
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> parent_;
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> m_child;
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeScrollbarLayer> m_scrollbarWithPaints;
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeScrollbarLayer> m_scrollbarWithoutPaints;
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommitWithPartialUpdate)
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest {
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestFinishAllRendering()
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_once(false)
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_drawCount(0)
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommitAndDrawFrame() OVERRIDE
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_once)
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_once = true;
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetNeedsRedraw();
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->AcquireLayerTextures();
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::AutoLock lock(m_lock);
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_drawCount = 0;
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->FinishAllRendering();
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base::AutoLock lock(m_lock);
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(0, m_drawCount);
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::AutoLock lock(m_lock);
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ++m_drawCount;
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool m_once;
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Lock m_lock;
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_drawCount;
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering)
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest {
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCompositeAndReadbackCleanup() { }
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Layer* rootLayer = layer_tree_host()->root_layer();
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        char pixels[4];
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels), gfx::Rect(0, 0, 1, 1));
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_FALSE(rootLayer->render_surface());
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup)
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit : public LayerTreeHostTest {
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit()
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate))
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_surfaceLayer1(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate))
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_replicaLayer1(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate))
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_surfaceLayer2(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate))
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_replicaLayer2(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate))
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->cache_render_pass_contents = true;
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(100, 100));
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1->SetBounds(gfx::Size(100, 100));
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1->SetForceRenderSurface(true);
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1->SetOpacity(0.5);
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer2->SetBounds(gfx::Size(100, 100));
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer2->SetForceRenderSurface(true);
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer2->SetOpacity(0.5);
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1->SetReplicaLayer(m_replicaLayer1.get());
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer2->SetReplicaLayer(m_replicaLayer2.get());
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->AddChild(m_surfaceLayer1);
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1->AddChild(m_surfaceLayer2);
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Renderer* renderer = hostImpl->renderer();
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderPass::Id surface1RenderPassId = hostImpl->active_tree()->root_layer()->children()[0]->render_surface()->RenderPassId();
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderPass::Id surface2RenderPassId = hostImpl->active_tree()->root_layer()->children()[0]->children()[0]->render_surface()->RenderPassId();
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (hostImpl->active_tree()->source_frame_number()) {
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 0:
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(surface1RenderPassId));
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(surface2RenderPassId));
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Reduce the memory limit to only fit the root layer and one render surface. This
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // prevents any contents drawing into surfaces from being allocated.
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            hostImpl->SetManagedMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2));
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(surface1RenderPassId));
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(surface2RenderPassId));
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, m_rootLayer->paintContentsCount());
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, m_surfaceLayer1->paintContentsCount());
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, m_surfaceLayer2->paintContentsCount());
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Clear layer references so LayerTreeHost dies.
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer = NULL;
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer1 = NULL;
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_replicaLayer1 = NULL;
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_surfaceLayer2 = NULL;
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_replicaLayer2 = NULL;
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient m_fakeDelegate;
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_rootLayer;
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_surfaceLayer1;
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_replicaLayer1;
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_surfaceLayer2;
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayerWithUpdateTracking> m_replicaLayer2;
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit)
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EvictionTestLayer : public Layer {
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_refptr<EvictionTestLayer> Create() { return make_scoped_refptr(new EvictionTestLayer()); }
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Update(ResourceUpdateQueue*, const OcclusionTracker*, RenderingStats*) OVERRIDE;
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool DrawsContent() const OVERRIDE { return true; }
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* treeImpl) OVERRIDE;
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void PushPropertiesTo(LayerImpl*) OVERRIDE;
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE;
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool haveBackingTexture() const { return m_texture.get() ? m_texture->have_backing_texture() : false; }
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EvictionTestLayer() : Layer() { }
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~EvictionTestLayer() { }
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void createTextureIfNeeded()
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_texture.get())
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_texture = PrioritizedResource::Create(layer_tree_host()->contents_texture_manager());
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_texture->SetDimensions(gfx::Size(10, 10), GL_RGBA);
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<PrioritizedResource> m_texture;
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkBitmap m_bitmap;
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl {
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* treeImpl, int id)
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return make_scoped_ptr(new EvictionTestLayerImpl(treeImpl, id));
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~EvictionTestLayerImpl() { }
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AppendQuads(QuadSink* quad_sink,
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             AppendQuadsData* append_quads_data) OVERRIDE
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(m_hasTexture);
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources());
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void setHasTexture(bool hasTexture) { m_hasTexture = hasTexture; }
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EvictionTestLayerImpl(LayerTreeImpl* treeImpl, int id)
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : LayerImpl(treeImpl, id)
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_hasTexture(false) { }
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool m_hasTexture;
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&)
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    createTextureIfNeeded();
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!m_texture.get())
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m_texture->set_request_priority(PriorityCalculator::UIPriority(true));
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::Update(ResourceUpdateQueue* queue, const OcclusionTracker*, RenderingStats*)
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    createTextureIfNeeded();
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!m_texture.get())
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect fullRect(0, 0, 10, 10);
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceUpdate upload = ResourceUpdate::Create(
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_texture.get(), &m_bitmap, fullRect, fullRect, gfx::Vector2d());
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    queue->AppendFullUpload(upload);
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl(LayerTreeImpl* treeImpl)
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return EvictionTestLayerImpl::Create(treeImpl, layer_id_).PassAs<LayerImpl>();
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layerImpl)
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer::PushPropertiesTo(layerImpl);
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EvictionTestLayerImpl* testLayerImpl = static_cast<EvictionTestLayerImpl*>(layerImpl);
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    testLayerImpl->setHasTexture(m_texture->have_backing_texture());
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest {
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestEvictTextures()
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_layer(EvictionTestLayer::Create())
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_implForEvictTextures(0)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numCommits(0)
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_layer);
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 20), gfx::Size(10, 20));
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform identityMatrix;
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 20), true);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void postEvictTextures()
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK(ImplThread());
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ImplThread()->PostTask(base::Bind(&LayerTreeHostTestEvictTextures::evictTexturesOnImplThread,
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               base::Unretained(this)));
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void evictTexturesOnImplThread()
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK(m_implForEvictTextures);
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_implForEvictTextures->EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0));
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 1: Just commit and draw normally, then post an eviction at the end
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // that will trigger a commit.
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 2: Triggered by the eviction, let it go through and then set
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // needsCommit.
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // task, which will be handled before the commit. Don't set needsCommit, it
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should have been posted. A frame should not be drawn (note,
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // didCommitAndDrawFrame may be called anyway).
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 4: Triggered by the eviction, let it go through and then set
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // needsCommit.
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 5: Triggered by the setNeedsCommit, post an eviction task in
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Layout(), a frame should not be drawn but a commit will be posted.
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commit 6: Triggered by the eviction, post an eviction task in
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Layout(), which will be a noop, letting the commit (which recreates the
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // textures) go through and draw a frame, then end the test.
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commits 1+2 test the eviction recovery path where eviction happens outside
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of the beginFrame/commit pair.
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commits 3+4 test the eviction recovery path where eviction happens inside
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the beginFrame/commit pair.
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Commits 5+6 test the path where an eviction happens during the eviction
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // recovery path.
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommitAndDrawFrame() OVERRIDE
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (m_numCommits) {
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(m_layer->haveBackingTexture());
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            postEvictTextures();
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(m_layer->haveBackingTexture());
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetNeedsCommit();
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 3:
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 4:
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(m_layer->haveBackingTexture());
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetNeedsCommit();
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 5:
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 6:
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(m_layer->haveBackingTexture());
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_implForEvictTextures = impl;
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void Layout() OVERRIDE
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ++m_numCommits;
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (m_numCommits) {
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 3:
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            postEvictTextures();
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 4:
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // We couldn't check in didCommitAndDrawFrame on commit 3, so check here.
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(m_layer->haveBackingTexture());
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 5:
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            postEvictTextures();
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 6:
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // We couldn't check in didCommitAndDrawFrame on commit 5, so check here.
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(m_layer->haveBackingTexture());
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            postEvictTextures();
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<EvictionTestLayer> m_layer;
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostImpl* m_implForEvictTextures;
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestEvictTextures)
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest {
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestContinuousCommit()
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommitComplete(0)
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDrawLayers(0)
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 2)
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 1)
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_numCommitComplete++;
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDrawLayers++;
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 2)
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Check that we didn't commit twice between first and second draw.
16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numCommitComplete);
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommitComplete;
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDrawLayers;
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit)
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest {
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestContinuousInvalidate()
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommitComplete(0)
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numDrawLayers(0)
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10));
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer = ContentLayer::Create(&m_fakeDelegate);
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer->SetBounds(gfx::Size(10, 10));
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer->SetPosition(gfx::PointF(0, 0));
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer->SetAnchorPoint(gfx::PointF(0, 0));
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer->SetIsDrawable(true);
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->root_layer()->AddChild(m_contentLayer);
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 2)
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer->SetNeedsDisplay();
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 1)
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_numCommitComplete++;
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numDrawLayers++;
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numDrawLayers == 2)
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Check that we didn't commit twice between first and second draw.
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numCommitComplete);
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Clear layer references so LayerTreeHost dies.
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_contentLayer = NULL;
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient m_fakeDelegate;
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Layer> m_contentLayer;
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommitComplete;
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numDrawLayers;
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest {
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestDeferCommits()
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_numCommitsDeferred(0)
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numCompleteCommits(0)
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidDeferCommit() OVERRIDE
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommitsDeferred++;
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetDeferCommits(false);
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCompleteCommits++;
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (m_numCompleteCommits) {
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(0, m_numCommitsDeferred);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetDeferCommits(true);
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(1, m_numCommitsDeferred);
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(2, m_numCompleteCommits);
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommitsDeferred;
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCompleteCommits;
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits)
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost {
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, const LayerTreeSettings& settings, scoped_ptr<Proxy> proxy)
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            : LayerTreeHost(client, settings)
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(InitializeForTesting(proxy.Pass()));
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates)
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When partial updates are not allowed, max updates should be 0.
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>()));
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->GetRendererCapabilities().allow_partial_texture_updates = false;
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->SetMaxPartialTextureUpdates(5);
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeSettings settings;
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.max_partial_texture_updates = 10;
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>());
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(host.InitializeRendererIfNeeded());
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0u, host.settings().max_partial_texture_updates);
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When partial updates are allowed, max updates should be limited by the proxy.
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>()));
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->SetMaxPartialTextureUpdates(5);
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeSettings settings;
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.max_partial_texture_updates = 10;
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>());
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(host.InitializeRendererIfNeeded());
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(5u, host.settings().max_partial_texture_updates);
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // When partial updates are allowed, max updates should also be limited by the settings.
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>()));
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->GetRendererCapabilities().allow_partial_texture_updates = true;
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        proxy->SetMaxPartialTextureUpdates(20);
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeSettings settings;
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings.max_partial_texture_updates = 10;
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>());
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(host.InitializeRendererIfNeeded());
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(10u, host.settings().max_partial_texture_updates);
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer)
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeSettings settings;
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.max_partial_texture_updates = 4;
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>());
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(host->InitializeRendererIfNeeded());
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer)
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE);
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeSettings settings;
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.max_partial_texture_updates = 4;
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>());
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(host->InitializeRendererIfNeeded());
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(4u, host->settings().max_partial_texture_updates);
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent)
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeSettings settings;
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.max_partial_texture_updates = 4;
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>());
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(host->InitializeRendererIfNeeded());
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0u, host->settings().max_partial_texture_updates);
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndSoftwareContent)
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE);
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeSettings settings;
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.max_partial_texture_updates = 4;
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>());
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(host->InitializeRendererIfNeeded());
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(0u, host->settings().max_partial_texture_updates);
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCapturePicture : public LayerTreeHostTest {
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestCapturePicture()
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : bounds_(gfx::Size(100, 100))
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_layer(PictureLayer::Create(&m_contentClient))
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->impl_side_painting = true;
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class FillRectContentLayerClient : public ContentLayerClient {
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual void PaintContents(SkCanvas* canvas, gfx::Rect clip, gfx::RectF* opaque) OVERRIDE
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            SkPaint paint;
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            paint.setColor(SK_ColorGREEN);
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            SkRect rect = SkRect::MakeWH(canvas->getDeviceSize().width(), canvas->getDeviceSize().height());
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            *opaque = gfx::RectF(rect.width(), rect.height());
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            canvas->drawRect(rect, paint);
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer->SetIsDrawable(true);
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_layer->SetBounds(bounds_);
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(bounds_, bounds_);
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_layer);
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->InitializeRendererIfNeeded());
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommitAndDrawFrame() OVERRIDE
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_picture = layer_tree_host()->CapturePicture();
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(bounds_, gfx::Size(m_picture->width(), m_picture->height()));
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkBitmap bitmap;
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bitmap.setConfig(SkBitmap::kARGB_8888_Config, bounds_.width(), bounds_.height());
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bitmap.allocPixels();
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bitmap.eraseARGB(0, 0, 0, 0);
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkCanvas canvas(bitmap);
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_picture->draw(&canvas);
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bitmap.lockPixels();
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels());
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(SK_ColorGREEN, pixels[0]);
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bitmap.unlockPixels();
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size bounds_;
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FillRectContentLayerClient m_contentClient;
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<PictureLayer> m_layer;
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    skia::RefPtr<SkPicture> m_picture;
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCapturePicture);
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestMaxPendingFrames : public LayerTreeHostTest {
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestMaxPendingFrames()
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : LayerTreeHostTest()
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_delegatingRenderer)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>();
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return FakeOutputSurface::Create3d().PassAs<OutputSurface>();
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DrawLayersOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DCHECK(hostImpl->proxy()->HasImplThread());
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const ThreadProxy* proxy = static_cast<ThreadProxy*>(hostImpl->proxy());
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_delegatingRenderer)
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, proxy->MaxFramesPendingForTesting());
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(FrameRateController::DEFAULT_MAX_FRAMES_PENDING, proxy->MaxFramesPendingForTesting());
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected:
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool m_delegatingRenderer;
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, DelegatingRenderer)
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m_delegatingRenderer = true;
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunTest(true);
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, GLRenderer)
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m_delegatingRenderer = false;
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RunTest(true);
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted : public LayerTreeHostTest {
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted()
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(FakeContentLayer::Create(&client_))
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_childLayer1(FakeContentLayer::Create(&client_))
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_childLayer2(FakeContentLayer::Create(&client_))
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numCommits(0)
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(100, 100));
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer1->SetBounds(gfx::Size(100, 100));
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_childLayer2->SetBounds(gfx::Size(100, 100));
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->AddChild(m_childLayer1);
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->AddChild(m_childLayer2);
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* hostImpl, bool visible) OVERRIDE
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // One backing should remain unevicted.
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            100 * 100 * 4 * 1,
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Make sure that contents textures are marked as having been
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // purged.
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(hostImpl->active_tree()->ContentsTexturesPurged());
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // End the test in this state.
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void CommitCompleteOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE
20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ++m_numCommits;
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch(m_numCommits) {
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // All three backings should have memory.
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                100 * 100 * 4 * 3,
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Set a new policy that will kick out 1 of the 3 resources.
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Because a resource was evicted, a commit will be kicked off.
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            hostImpl->SetManagedMemoryPolicy(ManagedMemoryPolicy(
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                100 * 100 * 4 * 2,
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING,
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                100 * 100 * 4 * 1,
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING));
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Only two backings should have memory.
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                100 * 100 * 4 * 2,
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                layer_tree_host()->contents_texture_manager()->MemoryUseBytes());
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Become backgrounded, which will cause 1 more resource to be
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // evicted.
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetVisibleToMainThread(false);
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // No further commits should happen because this is not visible
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // anymore.
20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            NOTREACHED();
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> m_rootLayer;
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> m_childLayer1;
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<FakeContentLayer> m_childLayer2;
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted)
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarCreation : public LayerTreeHostTest {
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestPinchZoomScrollbarCreation()
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(ContentLayer::Create(&client_))
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->use_pinch_zoom_scrollbars = true;
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetIsDrawable(true);
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(100, 100));
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We always expect two pinch-zoom scrollbar layers.
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(2 == m_rootLayer->children().size());
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Pinch-zoom scrollbar layers always have invalid scrollLayerIds.
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer();
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer1);
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer1->scroll_layer_id());
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, layer1->opacity());
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer1->OpacityCanAnimateOnImplThread());
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer1->DrawsContent());
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer();
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer2);
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer2->scroll_layer_id());
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, layer2->opacity());
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer2->OpacityCanAnimateOnImplThread());
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer2->DrawsContent());
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EndTest();
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> m_rootLayer;
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarCreation)
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarResize : public LayerTreeHostTest {
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestPinchZoomScrollbarResize()
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(ContentLayer::Create(&client_))
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numCommits(0)
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->use_pinch_zoom_scrollbars = true;
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetIsDrawable(true);
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(100, 100));
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetViewportSize(gfx::Size(100, 100),
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            gfx::Size(100, 100));
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer();
21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer1);
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer();
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer2);
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Get scrollbar thickness from horizontal scrollbar's height.
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int thickness = layer1->bounds().height();
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!layer1->Orientation() == WebKit::WebScrollbar::Horizontal)
21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          std::swap(layer1, layer2);
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size viewportSize = layer_tree_host()->layout_viewport_size();
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(viewportSize.width() - thickness, layer1->bounds().width());
21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(viewportSize.height() - thickness, layer2->bounds().height());
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (m_numCommits) {
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          case 1:
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // Resizing the viewport should also resize the pinch-zoom scrollbars.
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer_tree_host()->SetViewportSize(gfx::Size(120, 150),
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              gfx::Size(120, 150));
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          break;
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          EndTest();
21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> m_rootLayer;
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarResize)
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarNewRootLayer : public LayerTreeHostTest {
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerTreeHostTestPinchZoomScrollbarNewRootLayer()
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        : m_rootLayer(ContentLayer::Create(&client_))
21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        , m_numCommits(0)
21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE
21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        settings->use_pinch_zoom_scrollbars = true;
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetIsDrawable(true);
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_rootLayer->SetBounds(gfx::Size(100, 100));
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(m_rootLayer);
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        m_numCommits++;
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // We always expect two pinch-zoom scrollbar layers.
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(2 == m_rootLayer->children().size());
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Pinch-zoom scrollbar layers always have invalid scrollLayerIds.
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer();
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer1);
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer1->scroll_layer_id());
22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, layer1->opacity());
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer1->DrawsContent());
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer();
22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ASSERT_TRUE(layer2);
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer2->scroll_layer_id());
22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_EQ(0, layer2->opacity());
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer2->DrawsContent());
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (m_numCommits == 1) {
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Create a new root layer and attach to tree to verify the pinch
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // zoom scrollbars get correctly re-attached.
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_rootLayer = ContentLayer::Create(&client_);
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_rootLayer->SetIsDrawable(true);
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            m_rootLayer->SetBounds(gfx::Size(100, 100));
22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->SetRootLayer(m_rootLayer);
22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else
22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE
22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FakeContentLayerClient client_;
22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ContentLayer> m_rootLayer;
22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int m_numCommits;
22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarNewRootLayer)
22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest {
22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class NotificationClient : public ContentLayerClient {
22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NotificationClient()
22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            : layer_(0)
22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            , paint_count_(0)
22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            , lcd_notification_count_(0)
22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void set_layer(Layer* layer) { layer_ = layer; }
22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int paint_count() const { return paint_count_; }
22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int lcd_notification_count() const { return lcd_notification_count_; }
22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual void PaintContents(SkCanvas* canvas,
22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   gfx::Rect clip,
22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   gfx::RectF* opaque) OVERRIDE
22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ++paint_count_;
22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual void DidChangeLayerCanUseLCDText() OVERRIDE
22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        {
22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ++lcd_notification_count_;
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_->SetNeedsDisplay();
22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private:
22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Layer* layer_;
22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int paint_count_;
22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int lcd_notification_count_;
22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void SetupTree() OVERRIDE
22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_);
22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_layer->SetIsDrawable(true);
22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        root_layer->SetBounds(gfx::Size(1, 1));
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_tree_host()->SetRootLayer(root_layer);
22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        client_.set_layer(root_layer.get());
22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // The expecations are based on the assumption that the default
22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // LCD settings are:
22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text);
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        EXPECT_FALSE(root_layer->can_use_lcd_text());
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostTest::SetupTree();
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void BeginTest() OVERRIDE
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PostSetNeedsCommitToMainThread();
23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void AfterTest() OVERRIDE { }
23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void DidCommit() OVERRIDE
23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        switch (layer_tree_host()->commit_number()) {
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 1:
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // The first update consists one LCD notification and one paint.
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, client_.lcd_notification_count());
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, client_.paint_count());
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // LCD text must have been enabled on the layer.
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            PostSetNeedsCommitToMainThread();
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        case 2:
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Since nothing changed on layer, there should be no notification
23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // or paint on the second update.
23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, client_.lcd_notification_count());
23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(1, client_.paint_count());
23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // LCD text must not have changed.
23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text());
23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Change layer opacity that should trigger lcd notification.
23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            layer_tree_host()->root_layer()->SetOpacity(0.5);
23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // No need to request a commit - setting opacity will do it.
23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default:
23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Verify that there is not extra commit due to layer invalidation.
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(3, layer_tree_host()->commit_number());
23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // LCD notification count should have incremented due to
23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // change in layer opacity.
23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, client_.lcd_notification_count());
23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // Paint count should be incremented due to invalidation.
23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_EQ(2, client_.paint_count());
23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            // LCD text must have been disabled on the layer due to opacity.
23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text());
23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EndTest();
23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            break;
23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationClient client_;
23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification)
23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
2354