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