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/layers/layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_painter.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/animation_test_common.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/layer_test_common.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AnyNumber;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Mock;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrictMock;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define EXPECT_SET_NEEDS_FULL_TREE_SYNC(expect, code_to_test)               \
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  do {                                                                      \
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times((expect)); \
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    code_to_test;                                                           \
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Mock::VerifyAndClearExpectations(layer_tree_host_.get());               \
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } while (false)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockLayerTreeHost : public LayerTreeHost {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit MockLayerTreeHost(FakeLayerTreeHostClient* client)
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : LayerTreeHost(client, NULL, LayerTreeSettings()) {
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    InitializeSingleThreaded(client, base::MessageLoopProxy::current());
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(SetNeedsCommit, void());
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  MOCK_METHOD0(SetNeedsUpdateLayers, void());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(SetNeedsFullTreeSync, void());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockLayerPainter : public LayerPainter {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Paint(SkCanvas* canvas, const gfx::Rect& content_rect) OVERRIDE {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTest : public testing::Test {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTest()
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      : host_impl_(&proxy_, &shared_bitmap_manager_),
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_.reset(new StrictMock<MockLayerTreeHost>(&fake_client_));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(layer_tree_host_.get());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_ = NULL;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child1_ = NULL;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child2_ = NULL;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child3_ = NULL;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child1_ = NULL;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child2_ = NULL;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child3_ = NULL;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetRootLayer(NULL);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_.reset();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyTestTreeInitialState() const {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(3U, parent_->children().size());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child1_, parent_->children()[0]);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child2_, parent_->children()[1]);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child3_, parent_->children()[2]);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_.get(), child1_->parent());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_.get(), child2_->parent());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(parent_.get(), child3_->parent());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(2U, child1_->children().size());
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(grand_child1_, child1_->children()[0]);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(grand_child2_, child1_->children()[1]);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child1_.get(), grand_child1_->parent());
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child1_.get(), grand_child2_->parent());
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(1U, child2_->children().size());
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(grand_child3_, child2_->children()[0]);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(child2_.get(), grand_child3_->parent());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(0U, child3_->children().size());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CreateSimpleTestTree() {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_ = Layer::Create();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child1_ = Layer::Create();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child2_ = Layer::Create();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child3_ = Layer::Create();
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child1_ = Layer::Create();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child2_ = Layer::Create();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    grand_child3_ = Layer::Create();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetRootLayer(parent_);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->AddChild(child1_);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->AddChild(child2_);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->AddChild(child3_);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child1_->AddChild(grand_child1_);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child1_->AddChild(grand_child2_);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child2_->AddChild(grand_child3_);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(layer_tree_host_.get());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VerifyTestTreeInitialState();
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeImplProxy proxy_;
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager_;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl_;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostClient fake_client_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<StrictMock<MockLayerTreeHost> > layer_tree_host_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child1_;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child2_;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child3_;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> grand_child1_;
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> grand_child2_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> grand_child3_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, BasicCreateAndDestroy) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_layer.get());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetLayerTreeHost(layer_tree_host_.get());
1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  test_layer->SetLayerTreeHost(NULL);
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, AddAndRemoveChild) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Upon creation, layers should not have children or parent.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, parent->children().size());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child->parent());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->AddChild(child));
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, parent->children().size());
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child.get(), parent->children()[0].get());
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child->parent());
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child->RootLayer());
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(1), child->RemoveFromParent());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, AddSameChildTwice) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AtLeast(1));
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_->SetRootLayer(parent);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0u, parent->children().size());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, parent->children().size());
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child->parent());
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, parent->children().size());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child->parent());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, InsertChild) {
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child1 = Layer::Create();
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child2 = Layer::Create();
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child3 = Layer::Create();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child4 = Layer::Create();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, parent->children().size());
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: inserting to empty list.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child3, 0));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, parent->children().size());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3, parent->children()[0]);
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child3->parent());
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: inserting to beginning of list
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, parent->children().size());
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3, parent->children()[1]);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child1->parent());
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 3: inserting to middle of list
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3U, parent->children().size());
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child2, parent->children()[1]);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3, parent->children()[2]);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child2->parent());
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 4: inserting to end of list
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child4, 3));
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(4U, parent->children().size());
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child2, parent->children()[1]);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3, parent->children()[2]);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4, parent->children()[3]);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent.get(), child4->parent());
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(NULL));
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, InsertChildPastEndOfList) {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child1 = Layer::Create();
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child2 = Layer::Create();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, parent->children().size());
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // insert to an out-of-bounds index
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->InsertChild(child1, 53);
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, parent->children().size());
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // insert another child to out-of-bounds, when list is not already empty.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->InsertChild(child2, 2459);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, parent->children().size());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child2, parent->children()[1]);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, InsertSameChildTwice) {
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child1 = Layer::Create();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child2 = Layer::Create();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, parent->children().size());
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, parent->children().size());
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[0]);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child2, parent->children()[1]);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Inserting the same child again should cause the child to be removed and
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // re-inserted at the new location.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(1), parent->InsertChild(child1, 1));
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // child1 should now be at the end of the list.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, parent->children().size());
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child2, parent->children()[0]);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1, parent->children()[1]);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(NULL));
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, ReplaceChildWithNewChild) {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSimpleTestTree();
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child4 = Layer::Create();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child4->parent());
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AtLeast(1), parent_->ReplaceChild(child2_.get(), child4));
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(parent_->NeedsDisplayForTesting());
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child1_->NeedsDisplayForTesting());
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child2_->NeedsDisplayForTesting());
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child3_->NeedsDisplayForTesting());
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child4->NeedsDisplayForTesting());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(static_cast<size_t>(3), parent_->children().size());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_, parent_->children()[0]);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4, parent_->children()[1]);
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3_, parent_->children()[2]);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child4->parent());
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child2_->parent());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, ReplaceChildWithNewChildThatHasOtherParent) {
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSimpleTestTree();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // create another simple tree with test_layer and child4.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child4 = Layer::Create();
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->AddChild(child4);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1U, test_layer->children().size());
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4, test_layer->children()[0]);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(test_layer.get(), child4->parent());
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AtLeast(1), parent_->ReplaceChild(child2_.get(), child4));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3U, parent_->children().size());
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_, parent_->children()[0]);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4, parent_->children()[1]);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child3_, parent_->children()[2]);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child4->parent());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // test_layer should no longer have child4,
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and child2 should no longer have a parent.
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, test_layer->children().size());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child2_->parent());
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(LayerTest, DeleteRemovedScrollParent) {
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> parent = Layer::Create();
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> child1 = Layer::Create();
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> child2 = Layer::Create();
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(0U, parent->children().size());
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, parent->children().size());
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child1, parent->children()[0]);
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child2, parent->children()[1]);
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_COMMIT(2, child1->SetScrollParent(child2.get()));
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, child2->RemoveFromParent());
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  child1->reset_needs_push_properties_for_testing();
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_COMMIT(1, child2 = NULL);
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(child1->needs_push_properties());
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(NULL));
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(LayerTest, DeleteRemovedScrollChild) {
3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> parent = Layer::Create();
3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> child1 = Layer::Create();
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<Layer> child2 = Layer::Create();
3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(0U, parent->children().size());
3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2U, parent->children().size());
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child1, parent->children()[0]);
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child2, parent->children()[1]);
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_COMMIT(2, child1->SetScrollParent(child2.get()));
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, child1->RemoveFromParent());
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  child2->reset_needs_push_properties_for_testing();
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_COMMIT(1, child1 = NULL);
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(child2->needs_push_properties());
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(NULL));
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, ReplaceChildWithSameChild) {
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSimpleTestTree();
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetNeedsFullTreeSync / SetNeedsCommit should not be called because its the
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // same child.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(0);
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent_->ReplaceChild(child2_.get(), child2_);
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyTestTreeInitialState();
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, RemoveAllChildren) {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSimpleTestTree();
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(3), parent_->RemoveAllChildren());
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, parent_->children().size());
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child1_->parent());
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child2_->parent());
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child3_->parent());
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, SetChildren) {
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> old_parent = Layer::Create();
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> new_parent = Layer::Create();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child1 = Layer::Create();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child2 = Layer::Create();
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerList new_children;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_children.push_back(child1);
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  new_children.push_back(child2);
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up and verify initial test conditions: child1 has a parent, child2 has
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // no parent.
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  old_parent->AddChild(child1);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(0U, new_parent->children().size());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_parent.get(), child1->parent());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(child2->parent());
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      1, layer_tree_host_->SetRootLayer(new_parent));
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      AtLeast(1), new_parent->SetChildren(new_children));
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, new_parent->children().size());
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(new_parent.get(), child1->parent());
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(new_parent.get(), child2->parent());
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(NULL));
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochTEST_F(LayerTest, HasAncestor) {
45158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  scoped_refptr<Layer> parent = Layer::Create();
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(parent->HasAncestor(parent.get()));
45358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
45458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  scoped_refptr<Layer> child = Layer::Create();
45558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  parent->AddChild(child);
45658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(child->HasAncestor(child.get()));
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(child->HasAncestor(parent.get()));
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(parent->HasAncestor(child.get()));
46058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
46158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  scoped_refptr<Layer> child_child = Layer::Create();
46258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  child->AddChild(child_child);
46358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(child_child->HasAncestor(child_child.get()));
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(child_child->HasAncestor(parent.get()));
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(child_child->HasAncestor(child.get()));
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(parent->HasAncestor(child.get()));
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(parent->HasAncestor(child_child.get()));
46958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}
47058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, GetRootLayerAfterTreeManipulations) {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateSimpleTestTree();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For this test we don't care about SetNeedsFullTreeSync calls.
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child4 = Layer::Create();
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), parent_->RootLayer());
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child1_->RootLayer());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child2_->RootLayer());
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child3_->RootLayer());
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4.get(),   child4->RootLayer());
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child1_->RootLayer());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child2_->RootLayer());
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child1_->RemoveFromParent();
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |child1| and its children, grand_child1 and grand_child2 are now on a
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // separate subtree.
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), parent_->RootLayer());
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), child1_->RootLayer());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child2_->RootLayer());
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child3_->RootLayer());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child4.get(), child4->RootLayer());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), grand_child1_->RootLayer());
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), grand_child2_->RootLayer());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  grand_child3_->AddChild(child4);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), parent_->RootLayer());
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), child1_->RootLayer());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child2_->RootLayer());
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child3_->RootLayer());
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child4->RootLayer());
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), grand_child1_->RootLayer());
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(child1_.get(), grand_child2_->RootLayer());
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child2_->ReplaceChild(grand_child3_.get(), child1_);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |grand_child3| gets orphaned and the child1 subtree gets planted back into
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the tree under child2.
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), parent_->RootLayer());
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child1_->RootLayer());
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child2_->RootLayer());
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), child3_->RootLayer());
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(grand_child3_.get(), child4->RootLayer());
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child1_->RootLayer());
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent_.get(), grand_child2_->RootLayer());
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(grand_child3_.get(), grand_child3_->RootLayer());
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, CheckSetNeedsDisplayCausesCorrectBehavior) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The semantics for SetNeedsDisplay which are tested here:
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   1. sets NeedsDisplay flag appropriately.
529558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  //   2. indirectly calls SetNeedsUpdate, exactly once for each call to
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //      SetNeedsDisplay.
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      1, layer_tree_host_->SetRootLayer(test_layer));
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(true));
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size test_bounds = gfx::Size(501, 508);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF dirty1 = gfx::RectF(10.f, 15.f, 1.f, 2.f);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF dirty2 = gfx::RectF(20.f, 25.f, 3.f, 4.f);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF empty_dirty_rect = gfx::RectF(40.f, 45.f, 0.f, 0.f);
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF out_of_bounds_dirty_rect = gfx::RectF(400.f, 405.f, 500.f, 502.f);
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Before anything, test_layer should not be dirty.
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is just initialization, but SetNeedsCommit behavior is verified anyway
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to avoid warnings.
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBounds(test_bounds));
5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The real test begins here.
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: Layer should accept dirty rects that go beyond its bounds.
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
559558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_SET_NEEDS_UPDATE(
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1, test_layer->SetNeedsDisplayRect(out_of_bounds_dirty_rect));
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: SetNeedsDisplay() without the dirty rect arg.
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
567558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_SET_NEEDS_UPDATE(1, test_layer->SetNeedsDisplay());
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Case 3: SetNeedsDisplay() with an empty rect.
572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(0, test_layer->SetNeedsDisplayRect(gfx::Rect()));
575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Case 4: SetNeedsDisplay() with a non-drawable layer
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(false));
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->ResetNeedsDisplayForTesting();
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
581558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_SET_NEEDS_UPDATE(0, test_layer->SetNeedsDisplayRect(dirty1));
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, CheckPropertyChangeCausesCorrectBehavior) {
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
5877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_SET_NEEDS_FULL_TREE_SYNC(
5887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      1, layer_tree_host_->SetRootLayer(test_layer));
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(true));
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> dummy_layer1 = Layer::Create();
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> dummy_layer2 = Layer::Create();
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sanity check of initial test condition
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Next, test properties that should call SetNeedsCommit (but not
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetNeedsDisplay). All properties need to be set to new values in order for
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetNeedsCommit to be called.
60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(
60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1, test_layer->SetTransformOrigin(gfx::Point3F(1.23f, 4.56f, 0.f)));
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBackgroundColor(SK_ColorLTGRAY));
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetMasksToBounds(true));
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendMode(SkXfermode::kHue_Mode));
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsRootForIsolatedGroup(true));
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetContentsOpaque(true));
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPosition(gfx::PointF(4.f, 9.f)));
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We can use any layer pointer here since we aren't syncing for real.
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1,
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          test_layer->SetScrollClipLayerId(test_layer->id()));
6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUserScrollable(true, false));
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetScrollOffset(
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Vector2d(10, 10)));
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetShouldScrollOnMainThread(true));
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetNonFastScrollableRegion(
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Region(gfx::Rect(1, 1, 2, 2))));
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHaveWheelEventHandlers(true));
619e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHaveScrollEventHandlers(true));
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetDoubleSided(false));
6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTouchEventHandlerRegion(
6243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      gfx::Rect(10, 10)));
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      1,
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      test_layer->SetDrawCheckerboardForMissingTiles(
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          !test_layer->draw_checkerboard_for_missing_tiles()));
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetForceRenderSurface(true));
630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHideLayerAndSubtree(true));
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, test_layer->SetMaskLayer(
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dummy_layer1.get()));
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, test_layer->SetReplicaLayer(
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dummy_layer2.get()));
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The above tests should not have caused a change to the needs_display flag.
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As layers are removed from the tree, they will cause a tree sync.
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times((AnyNumber()));
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, PushPropertiesAccumulatesUpdateRect) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetNeedsDisplayRect(gfx::RectF(0.f, 0.f, 5.f, 5.f));
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FLOAT_RECT_EQ(gfx::RectF(0.f, 0.f, 5.f, 5.f),
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       impl_layer->update_rect());
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The LayerImpl's update_rect() should be accumulated here, since we did not
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // do anything to clear it.
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetNeedsDisplayRect(gfx::RectF(10.f, 10.f, 5.f, 5.f));
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FLOAT_RECT_EQ(gfx::RectF(0.f, 0.f, 15.f, 15.f),
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       impl_layer->update_rect());
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we do clear the LayerImpl side, then the next update_rect() should be
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fresh without accumulation.
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->ResetAllChangeTrackingForSubtree();
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->SetNeedsDisplayRect(gfx::RectF(10.f, 10.f, 5.f, 5.f));
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FLOAT_RECT_EQ(gfx::RectF(10.f, 10.f, 5.f, 5.f),
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       impl_layer->update_rect());
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(LayerTest, PushPropertiesCausesLayerPropertyChangedForTransform) {
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
679a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Rotate(45.0);
683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(impl_layer->LayerPropertyChanged());
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(LayerTest, PushPropertiesCausesLayerPropertyChangedForOpacity) {
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
698a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
699a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(impl_layer->LayerPropertyChanged());
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest,
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyTransformAnim) {
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
715a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->layer_animation_controller()->SetAnimationRegistrar(
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registrar.get());
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddAnimatedTransformToController(impl_layer->layer_animation_controller(),
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1.0,
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0,
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   100);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Rotate(45.0);
729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
7334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(impl_layer->LayerPropertyChanged());
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->ResetAllChangeTrackingForSubtree();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddAnimatedTransformToController(impl_layer->layer_animation_controller(),
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1.0,
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0,
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   100);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->layer_animation_controller()->GetAnimation(Animation::Transform)->
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_is_impl_only(true);
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Rotate(45.0);
743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest,
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyOpacityAnim) {
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->layer_animation_controller()->SetAnimationRegistrar(
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registrar.get());
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddOpacityTransitionToController(impl_layer->layer_animation_controller(),
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1.0,
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0.3f,
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0.7f,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   false);
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
7734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(impl_layer->LayerPropertyChanged());
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->ResetAllChangeTrackingForSubtree();
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddOpacityTransitionToController(impl_layer->layer_animation_controller(),
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1.0,
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0.3f,
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   0.7f,
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   false);
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  impl_layer->layer_animation_controller()->GetAnimation(Animation::Opacity)->
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_is_impl_only(true);
783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.75f));
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(LayerTest,
7914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyFilterAnim) {
7924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<Layer> test_layer = Layer::Create();
7934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
7944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
7954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  layer_tree_host_->SetRootLayer(test_layer));
7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
8004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  impl_layer->layer_animation_controller()->SetAnimationRegistrar(
8014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      registrar.get());
8024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddAnimatedFilterToController(
8044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      impl_layer->layer_animation_controller(), 1.0, 1.f, 2.f);
8054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  FilterOperations filters;
8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  filters.Append(FilterOperation::CreateBlurFilter(2.f));
8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFilters(filters));
8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
8114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(impl_layer->LayerPropertyChanged());
8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  impl_layer->ResetAllChangeTrackingForSubtree();
8154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AddAnimatedFilterToController(
8164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      impl_layer->layer_animation_controller(), 1.0, 1.f, 2.f);
8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  impl_layer->layer_animation_controller()->GetAnimation(Animation::Filter)->
8184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      set_is_impl_only(true);
8194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  filters.Append(FilterOperation::CreateSepiaFilter(0.5f));
8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFilters(filters));
8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_layer->PushPropertiesTo(impl_layer.get());
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(impl_layer->LayerPropertyChanged());
8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTest, MaskAndReplicaHasParent) {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask = Layer::Create();
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica = Layer::Create();
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_mask = Layer::Create();
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask_replacement = Layer::Create();
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_replacement = Layer::Create();
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_mask_replacement = Layer::Create();
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetMaskLayer(mask.get());
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetReplicaLayer(replica.get());
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica->SetMaskLayer(replica_mask.get());
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(parent.get(), child->parent());
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child.get(), mask->parent());
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child.get(), replica->parent());
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(replica.get(), replica_mask->parent());
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica->SetMaskLayer(replica_mask_replacement.get());
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, replica_mask->parent());
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(replica.get(), replica_mask_replacement->parent());
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetMaskLayer(mask_replacement.get());
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, mask->parent());
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child.get(), mask_replacement->parent());
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetReplicaLayer(replica_replacement.get());
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, replica->parent());
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(child.get(), replica_replacement->parent());
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(replica.get(), replica->mask_layer()->parent());
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8620529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(LayerTest, CheckTranformIsInvertible) {
8630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<Layer> layer = Layer::Create();
8640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<LayerImpl> impl_layer =
8650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      LayerImpl::Create(host_impl_.active_tree(), 1);
8660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
8670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
8680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  layer_tree_host_->SetRootLayer(layer);
8690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(layer->transform_is_invertible());
8710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Transform singular_transform;
8730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  singular_transform.Scale3d(
8740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
8750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  layer->SetTransform(singular_transform);
8770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  layer->PushPropertiesTo(impl_layer.get());
8780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(layer->transform_is_invertible());
8800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(impl_layer->transform_is_invertible());
8810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gfx::Transform rotation_transform;
8830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  rotation_transform.RotateAboutZAxis(-45.0);
8840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  layer->SetTransform(rotation_transform);
8860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  layer->PushPropertiesTo(impl_layer.get());
8870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(layer->transform_is_invertible());
8880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(impl_layer->transform_is_invertible());
8890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
8900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
8910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
8920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(LayerTest, TranformIsInvertibleAnimation) {
894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<Layer> layer = Layer::Create();
895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<LayerImpl> impl_layer =
896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      LayerImpl::Create(host_impl_.active_tree(), 1);
897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layer_tree_host_->SetRootLayer(layer);
900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(layer->transform_is_invertible());
902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Transform singular_transform;
904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  singular_transform.Scale3d(
905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
906010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layer->SetTransform(singular_transform);
908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layer->PushPropertiesTo(impl_layer.get());
909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(layer->transform_is_invertible());
911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(impl_layer->transform_is_invertible());
912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  gfx::Transform identity_transform;
914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layer->SetTransform(identity_transform);
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<LayerAnimationValueObserver*>(layer.get())
917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ->OnTransformAnimated(singular_transform);
918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  layer->PushPropertiesTo(impl_layer.get());
919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(layer->transform_is_invertible());
920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(impl_layer->transform_is_invertible());
921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
922010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Mock::VerifyAndClearExpectations(layer_tree_host_.get());
923010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
924010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostFactory {
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory()
92823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      : client_(FakeLayerTreeHostClient::DIRECT_3D),
92923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        shared_bitmap_manager_(new TestSharedBitmapManager()) {}
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> Create() {
9325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return LayerTreeHost::CreateSingleThreaded(
9335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               &client_,
9345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               &client_,
9355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               shared_bitmap_manager_.get(),
9365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               LayerTreeSettings(),
9375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               base::MessageLoopProxy::current()).Pass();
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> Create(LayerTreeSettings settings) {
94123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    return LayerTreeHost::CreateSingleThreaded(
9425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               &client_,
9435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               &client_,
9445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               shared_bitmap_manager_.get(),
9455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               settings,
9465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               base::MessageLoopProxy::current()).Pass();
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeLayerTreeHostClient client_;
95123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AssertLayerTreeHostMatchesForSubtree(Layer* layer, LayerTreeHost* host) {
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(host, layer->layer_tree_host());
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer->children().size(); ++i)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AssertLayerTreeHostMatchesForSubtree(layer->children()[i].get(), host);
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->mask_layer())
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AssertLayerTreeHostMatchesForSubtree(layer->mask_layer(), host);
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->replica_layer())
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AssertLayerTreeHostMatchesForSubtree(layer->replica_layer(), host);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, EnteringTree) {
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask = Layer::Create();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica = Layer::Create();
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_mask = Layer::Create();
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up a detached tree of layers. The host pointer should be nil for these
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layers.
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetMaskLayer(mask.get());
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetReplicaLayer(replica.get());
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica->SetMaskLayer(replica_mask.get());
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(), NULL);
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting the root layer should set the host pointer for all layers in the
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tree.
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(parent.get());
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clearing the root layer should also clear out the host pointers for all
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layers in the tree.
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(NULL);
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(), NULL);
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, AddingLayerSubtree) {
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(parent.get());
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(parent->layer_tree_host(), layer_tree_host.get());
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adding a subtree to a layer already associated with a host should set the
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // host pointer on all layers in that subtree.
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> grand_child = Layer::Create();
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->AddChild(grand_child);
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Masks, replicas, and replica masks should pick up the new host too.
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child_mask = Layer::Create();
10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetMaskLayer(child_mask.get());
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child_replica = Layer::Create();
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetReplicaLayer(child_replica.get());
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child_replica_mask = Layer::Create();
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child_replica->SetMaskLayer(child_replica_mask.get());
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(NULL);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, ChangeHost) {
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask = Layer::Create();
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica = Layer::Create();
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_mask = Layer::Create();
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same setup as the previous test.
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->AddChild(child);
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetMaskLayer(mask.get());
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetReplicaLayer(replica.get());
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica->SetMaskLayer(replica_mask.get());
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> first_layer_tree_host = factory.Create();
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  first_layer_tree_host->SetRootLayer(parent.get());
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(),
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       first_layer_tree_host.get());
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now re-root the tree to a new host (simulating what we do on a context lost
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // event). This should update the host pointers for all layers in the tree.
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> second_layer_tree_host = factory.Create();
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_layer_tree_host->SetRootLayer(parent.get());
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(),
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       second_layer_tree_host.get());
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_layer_tree_host->SetRootLayer(NULL);
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, ChangeHostInSubtree) {
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> first_parent = Layer::Create();
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> first_child = Layer::Create();
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> second_parent = Layer::Create();
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> second_child = Layer::Create();
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> second_grand_child = Layer::Create();
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First put all children under the first parent and set the first host.
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  first_parent->AddChild(first_child);
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_child->AddChild(second_grand_child);
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  first_parent->AddChild(second_child);
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> first_layer_tree_host = factory.Create();
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  first_layer_tree_host->SetRootLayer(first_parent.get());
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(first_parent.get(),
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       first_layer_tree_host.get());
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now reparent the subtree starting at second_child to a layer in a different
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tree.
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> second_layer_tree_host = factory.Create();
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_layer_tree_host->SetRootLayer(second_parent.get());
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_parent->AddChild(second_child);
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The moved layer and its children should point to the new host.
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(second_layer_tree_host.get(), second_child->layer_tree_host());
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(second_layer_tree_host.get(),
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            second_grand_child->layer_tree_host());
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test over, cleanup time.
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  first_layer_tree_host->SetRootLayer(NULL);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  second_layer_tree_host->SetRootLayer(NULL);
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, ReplaceMaskAndReplicaLayer) {
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> parent = Layer::Create();
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask = Layer::Create();
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica = Layer::Create();
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask_child = Layer::Create();
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_child = Layer::Create();
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> mask_replacement = Layer::Create();
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> replica_replacement = Layer::Create();
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->SetMaskLayer(mask.get());
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->SetReplicaLayer(replica.get());
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mask->AddChild(mask_child);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica->AddChild(replica_child);
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(parent.get());
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Replacing the mask should clear out the old mask's subtree's host pointers.
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->SetMaskLayer(mask_replacement.get());
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, mask->layer_tree_host());
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, mask_child->layer_tree_host());
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same for replacing a replica layer.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent->SetReplicaLayer(replica_replacement.get());
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, replica->layer_tree_host());
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, replica_child->layer_tree_host());
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test over, cleanup time.
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(NULL);
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, DestroyHostWithNonNullRootLayer) {
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root = Layer::Create();
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> child = Layer::Create();
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root->AddChild(child);
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(root);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool AddTestAnimation(Layer* layer) {
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<KeyframedFloatAnimationCurve> curve =
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      KeyframedFloatAnimationCurve::Create();
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  curve->AddKeyframe(FloatKeyframe::Create(0.0,
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           0.3f,
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           scoped_ptr<TimingFunction>()));
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  curve->AddKeyframe(FloatKeyframe::Create(1.0,
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           0.7f,
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           scoped_ptr<TimingFunction>()));
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<Animation> animation =
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Animation::Create(curve.PassAs<AnimationCurve>(),
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        0,
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        0,
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        Animation::Opacity);
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer->AddAnimation(animation.Pass());
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerLayerTreeHostTest, ShouldNotAddAnimationWithoutAnimationRegistrar) {
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> layer = Layer::Create();
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 1: without a LayerTreeHost and without an AnimationRegistrar, the
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation should not be accepted.
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddTestAnimation(layer.get()));
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->layer_animation_controller()->SetAnimationRegistrar(registrar.get());
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 2: with an AnimationRegistrar, the animation should be accepted.
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(AddTestAnimation(layer.get()));
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeSettings settings;
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.accelerated_animation_enabled = false;
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerTreeHostFactory factory;
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create(settings);
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host->SetRootLayer(layer);
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AssertLayerTreeHostMatchesForSubtree(layer.get(), layer_tree_host.get());
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Case 3: with a LayerTreeHost where accelerated animation is disabled, the
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation should be rejected.
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(AddTestAnimation(layer.get()));
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(LayerTest, SafeOpaqueBackgroundColor) {
1181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LayerTreeHostFactory factory;
1182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
1183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<Layer> layer = Layer::Create();
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  layer_tree_host->SetRootLayer(layer);
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  for (int contents_opaque = 0; contents_opaque < 2; ++contents_opaque) {
1188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (int layer_opaque = 0; layer_opaque < 2; ++layer_opaque) {
1189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      for (int host_opaque = 0; host_opaque < 2; ++host_opaque) {
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        layer->SetContentsOpaque(!!contents_opaque);
1191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        layer->SetBackgroundColor(layer_opaque ? SK_ColorRED
1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                               : SK_ColorTRANSPARENT);
1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        layer_tree_host->set_background_color(
1194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT);
1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkColor safe_color = layer->SafeOpaqueBackgroundColor();
1197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (contents_opaque) {
1198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          EXPECT_EQ(SkColorGetA(safe_color), 255u)
1199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
1200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              << host_opaque << "\n";
1201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else {
1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          EXPECT_NE(SkColorGetA(safe_color), 255u)
1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
1204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              << host_opaque << "\n";
1205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
1206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
1207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
1208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
12116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DrawsContentChangeLayer : public Layer {
12126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
12136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static scoped_refptr<DrawsContentChangeLayer> Create() {
12146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return make_scoped_refptr(new DrawsContentChangeLayer());
12156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
12166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void SetLayerTreeHost(LayerTreeHost* host) OVERRIDE {
12186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Layer::SetLayerTreeHost(host);
12196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SetFakeDrawsContent(!fake_draws_content_);
12206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
12216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual bool HasDrawableContent() const OVERRIDE {
12236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return fake_draws_content_ && Layer::HasDrawableContent();
12246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
12256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetFakeDrawsContent(bool fake_draws_content) {
12276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    fake_draws_content_ = fake_draws_content;
12286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    UpdateDrawsContent(HasDrawableContent());
12296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
12306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
12326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DrawsContentChangeLayer() : Layer(), fake_draws_content_(false) {}
12336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~DrawsContentChangeLayer() OVERRIDE {}
12346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool fake_draws_content_;
12366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
12376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(LayerTest, DrawsContentChangedInSetLayerTreeHost) {
12396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<Layer> root_layer = Layer::Create();
12406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<DrawsContentChangeLayer> becomes_not_draws_content =
12416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DrawsContentChangeLayer::Create();
12426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_refptr<DrawsContentChangeLayer> becomes_draws_content =
12436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DrawsContentChangeLayer::Create();
12446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  root_layer->SetIsDrawable(true);
12456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  becomes_not_draws_content->SetIsDrawable(true);
12466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  becomes_not_draws_content->SetFakeDrawsContent(true);
12476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0, root_layer->NumDescendantsThatDrawContent());
12486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  root_layer->AddChild(becomes_not_draws_content);
12496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(0, root_layer->NumDescendantsThatDrawContent());
12506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  becomes_draws_content->SetIsDrawable(true);
12526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  root_layer->AddChild(becomes_draws_content);
12536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1, root_layer->NumDescendantsThatDrawContent());
12546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
12556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1258