| Index: cc/layers/layer_unittest.cc
|
| diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
|
| deleted file mode 100644
|
| index 10d774c053526dbeb194f5c0fabca04926a58363..0000000000000000000000000000000000000000
|
| --- a/cc/layers/layer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1255 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/layers/layer.h"
|
| -
|
| -#include "cc/animation/keyframed_animation_curve.h"
|
| -#include "cc/base/math_util.h"
|
| -#include "cc/layers/layer_impl.h"
|
| -#include "cc/resources/layer_painter.h"
|
| -#include "cc/test/animation_test_common.h"
|
| -#include "cc/test/fake_impl_proxy.h"
|
| -#include "cc/test/fake_layer_tree_host_client.h"
|
| -#include "cc/test/fake_layer_tree_host_impl.h"
|
| -#include "cc/test/geometry_test_utils.h"
|
| -#include "cc/test/layer_test_common.h"
|
| -#include "cc/test/test_gpu_memory_buffer_manager.h"
|
| -#include "cc/test/test_shared_bitmap_manager.h"
|
| -#include "cc/test/test_task_graph_runner.h"
|
| -#include "cc/trees/layer_tree_host.h"
|
| -#include "cc/trees/single_thread_proxy.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "ui/gfx/transform.h"
|
| -
|
| -using ::testing::AnyNumber;
|
| -using ::testing::AtLeast;
|
| -using ::testing::Mock;
|
| -using ::testing::StrictMock;
|
| -using ::testing::_;
|
| -
|
| -#define EXPECT_SET_NEEDS_FULL_TREE_SYNC(expect, code_to_test) \
|
| - do { \
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times((expect)); \
|
| - code_to_test; \
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get()); \
|
| - } while (false)
|
| -
|
| -namespace cc {
|
| -namespace {
|
| -
|
| -class MockLayerTreeHost : public LayerTreeHost {
|
| - public:
|
| - explicit MockLayerTreeHost(FakeLayerTreeHostClient* client)
|
| - : LayerTreeHost(client, nullptr, nullptr, nullptr, LayerTreeSettings()) {
|
| - InitializeSingleThreaded(client,
|
| - base::MessageLoopProxy::current(),
|
| - nullptr);
|
| - }
|
| -
|
| - MOCK_METHOD0(SetNeedsCommit, void());
|
| - MOCK_METHOD0(SetNeedsUpdateLayers, void());
|
| - MOCK_METHOD0(SetNeedsFullTreeSync, void());
|
| -};
|
| -
|
| -class MockLayerPainter : public LayerPainter {
|
| - public:
|
| - void Paint(SkCanvas* canvas, const gfx::Rect& content_rect) override {}
|
| -};
|
| -
|
| -class LayerTest : public testing::Test {
|
| - public:
|
| - LayerTest()
|
| - : host_impl_(&proxy_, &shared_bitmap_manager_, &task_graph_runner_),
|
| - fake_client_(FakeLayerTreeHostClient::DIRECT_3D) {}
|
| -
|
| - protected:
|
| - void SetUp() override {
|
| - layer_tree_host_.reset(new StrictMock<MockLayerTreeHost>(&fake_client_));
|
| - }
|
| -
|
| - void TearDown() override {
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get());
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
|
| - parent_ = nullptr;
|
| - child1_ = nullptr;
|
| - child2_ = nullptr;
|
| - child3_ = nullptr;
|
| - grand_child1_ = nullptr;
|
| - grand_child2_ = nullptr;
|
| - grand_child3_ = nullptr;
|
| -
|
| - layer_tree_host_->SetRootLayer(nullptr);
|
| - layer_tree_host_ = nullptr;
|
| - }
|
| -
|
| - void VerifyTestTreeInitialState() const {
|
| - ASSERT_EQ(3U, parent_->children().size());
|
| - EXPECT_EQ(child1_, parent_->children()[0]);
|
| - EXPECT_EQ(child2_, parent_->children()[1]);
|
| - EXPECT_EQ(child3_, parent_->children()[2]);
|
| - EXPECT_EQ(parent_.get(), child1_->parent());
|
| - EXPECT_EQ(parent_.get(), child2_->parent());
|
| - EXPECT_EQ(parent_.get(), child3_->parent());
|
| -
|
| - ASSERT_EQ(2U, child1_->children().size());
|
| - EXPECT_EQ(grand_child1_, child1_->children()[0]);
|
| - EXPECT_EQ(grand_child2_, child1_->children()[1]);
|
| - EXPECT_EQ(child1_.get(), grand_child1_->parent());
|
| - EXPECT_EQ(child1_.get(), grand_child2_->parent());
|
| -
|
| - ASSERT_EQ(1U, child2_->children().size());
|
| - EXPECT_EQ(grand_child3_, child2_->children()[0]);
|
| - EXPECT_EQ(child2_.get(), grand_child3_->parent());
|
| -
|
| - ASSERT_EQ(0U, child3_->children().size());
|
| - }
|
| -
|
| - void CreateSimpleTestTree() {
|
| - parent_ = Layer::Create();
|
| - child1_ = Layer::Create();
|
| - child2_ = Layer::Create();
|
| - child3_ = Layer::Create();
|
| - grand_child1_ = Layer::Create();
|
| - grand_child2_ = Layer::Create();
|
| - grand_child3_ = Layer::Create();
|
| -
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
|
| - layer_tree_host_->SetRootLayer(parent_);
|
| -
|
| - parent_->AddChild(child1_);
|
| - parent_->AddChild(child2_);
|
| - parent_->AddChild(child3_);
|
| - child1_->AddChild(grand_child1_);
|
| - child1_->AddChild(grand_child2_);
|
| - child2_->AddChild(grand_child3_);
|
| -
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get());
|
| -
|
| - VerifyTestTreeInitialState();
|
| - }
|
| -
|
| - FakeImplProxy proxy_;
|
| - TestSharedBitmapManager shared_bitmap_manager_;
|
| - TestTaskGraphRunner task_graph_runner_;
|
| - FakeLayerTreeHostImpl host_impl_;
|
| -
|
| - FakeLayerTreeHostClient fake_client_;
|
| - scoped_ptr<StrictMock<MockLayerTreeHost>> layer_tree_host_;
|
| - scoped_refptr<Layer> parent_;
|
| - scoped_refptr<Layer> child1_;
|
| - scoped_refptr<Layer> child2_;
|
| - scoped_refptr<Layer> child3_;
|
| - scoped_refptr<Layer> grand_child1_;
|
| - scoped_refptr<Layer> grand_child2_;
|
| - scoped_refptr<Layer> grand_child3_;
|
| -};
|
| -
|
| -TEST_F(LayerTest, BasicCreateAndDestroy) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - ASSERT_TRUE(test_layer.get());
|
| -
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
|
| - test_layer->SetLayerTreeHost(layer_tree_host_.get());
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get());
|
| -
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
|
| - test_layer->SetLayerTreeHost(nullptr);
|
| -}
|
| -
|
| -TEST_F(LayerTest, AddAndRemoveChild) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| -
|
| - // Upon creation, layers should not have children or parent.
|
| - ASSERT_EQ(0U, parent->children().size());
|
| - EXPECT_FALSE(child->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->AddChild(child));
|
| -
|
| - ASSERT_EQ(1U, parent->children().size());
|
| - EXPECT_EQ(child.get(), parent->children()[0].get());
|
| - EXPECT_EQ(parent.get(), child->parent());
|
| - EXPECT_EQ(parent.get(), child->RootLayer());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(1), child->RemoveFromParent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, AddSameChildTwice) {
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AtLeast(1));
|
| -
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| -
|
| - layer_tree_host_->SetRootLayer(parent);
|
| -
|
| - ASSERT_EQ(0u, parent->children().size());
|
| -
|
| - parent->AddChild(child);
|
| - ASSERT_EQ(1u, parent->children().size());
|
| - EXPECT_EQ(parent.get(), child->parent());
|
| -
|
| - parent->AddChild(child);
|
| - ASSERT_EQ(1u, parent->children().size());
|
| - EXPECT_EQ(parent.get(), child->parent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, InsertChild) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| - scoped_refptr<Layer> child3 = Layer::Create();
|
| - scoped_refptr<Layer> child4 = Layer::Create();
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
|
| -
|
| - ASSERT_EQ(0U, parent->children().size());
|
| -
|
| - // Case 1: inserting to empty list.
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child3, 0));
|
| - ASSERT_EQ(1U, parent->children().size());
|
| - EXPECT_EQ(child3, parent->children()[0]);
|
| - EXPECT_EQ(parent.get(), child3->parent());
|
| -
|
| - // Case 2: inserting to beginning of list
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child3, parent->children()[1]);
|
| - EXPECT_EQ(parent.get(), child1->parent());
|
| -
|
| - // Case 3: inserting to middle of list
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
|
| - ASSERT_EQ(3U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| - EXPECT_EQ(child3, parent->children()[2]);
|
| - EXPECT_EQ(parent.get(), child2->parent());
|
| -
|
| - // Case 4: inserting to end of list
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child4, 3));
|
| -
|
| - ASSERT_EQ(4U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| - EXPECT_EQ(child3, parent->children()[2]);
|
| - EXPECT_EQ(child4, parent->children()[3]);
|
| - EXPECT_EQ(parent.get(), child4->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(nullptr));
|
| -}
|
| -
|
| -TEST_F(LayerTest, InsertChildPastEndOfList) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| -
|
| - ASSERT_EQ(0U, parent->children().size());
|
| -
|
| - // insert to an out-of-bounds index
|
| - parent->InsertChild(child1, 53);
|
| -
|
| - ASSERT_EQ(1U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| -
|
| - // insert another child to out-of-bounds, when list is not already empty.
|
| - parent->InsertChild(child2, 2459);
|
| -
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| -}
|
| -
|
| -TEST_F(LayerTest, InsertSameChildTwice) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
|
| -
|
| - ASSERT_EQ(0U, parent->children().size());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
|
| -
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| -
|
| - // Inserting the same child again should cause the child to be removed and
|
| - // re-inserted at the new location.
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(1), parent->InsertChild(child1, 1));
|
| -
|
| - // child1 should now be at the end of the list.
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child2, parent->children()[0]);
|
| - EXPECT_EQ(child1, parent->children()[1]);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(nullptr));
|
| -}
|
| -
|
| -TEST_F(LayerTest, ReplaceChildWithNewChild) {
|
| - CreateSimpleTestTree();
|
| - scoped_refptr<Layer> child4 = Layer::Create();
|
| -
|
| - EXPECT_FALSE(child4->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - AtLeast(1), parent_->ReplaceChild(child2_.get(), child4));
|
| - EXPECT_FALSE(parent_->NeedsDisplayForTesting());
|
| - EXPECT_FALSE(child1_->NeedsDisplayForTesting());
|
| - EXPECT_FALSE(child2_->NeedsDisplayForTesting());
|
| - EXPECT_FALSE(child3_->NeedsDisplayForTesting());
|
| - EXPECT_FALSE(child4->NeedsDisplayForTesting());
|
| -
|
| - ASSERT_EQ(static_cast<size_t>(3), parent_->children().size());
|
| - EXPECT_EQ(child1_, parent_->children()[0]);
|
| - EXPECT_EQ(child4, parent_->children()[1]);
|
| - EXPECT_EQ(child3_, parent_->children()[2]);
|
| - EXPECT_EQ(parent_.get(), child4->parent());
|
| -
|
| - EXPECT_FALSE(child2_->parent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, ReplaceChildWithNewChildThatHasOtherParent) {
|
| - CreateSimpleTestTree();
|
| -
|
| - // create another simple tree with test_layer and child4.
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_refptr<Layer> child4 = Layer::Create();
|
| - test_layer->AddChild(child4);
|
| - ASSERT_EQ(1U, test_layer->children().size());
|
| - EXPECT_EQ(child4, test_layer->children()[0]);
|
| - EXPECT_EQ(test_layer.get(), child4->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - AtLeast(1), parent_->ReplaceChild(child2_.get(), child4));
|
| -
|
| - ASSERT_EQ(3U, parent_->children().size());
|
| - EXPECT_EQ(child1_, parent_->children()[0]);
|
| - EXPECT_EQ(child4, parent_->children()[1]);
|
| - EXPECT_EQ(child3_, parent_->children()[2]);
|
| - EXPECT_EQ(parent_.get(), child4->parent());
|
| -
|
| - // test_layer should no longer have child4,
|
| - // and child2 should no longer have a parent.
|
| - ASSERT_EQ(0U, test_layer->children().size());
|
| - EXPECT_FALSE(child2_->parent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, DeleteRemovedScrollParent) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
|
| -
|
| - ASSERT_EQ(0U, parent->children().size());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
|
| -
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(2, child1->SetScrollParent(child2.get()));
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, child2->RemoveFromParent());
|
| -
|
| - child1->reset_needs_push_properties_for_testing();
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(1, child2 = nullptr);
|
| -
|
| - EXPECT_TRUE(child1->needs_push_properties());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(nullptr));
|
| -}
|
| -
|
| -TEST_F(LayerTest, DeleteRemovedScrollChild) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(parent));
|
| -
|
| - ASSERT_EQ(0U, parent->children().size());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child1, 0));
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, parent->InsertChild(child2, 1));
|
| -
|
| - ASSERT_EQ(2U, parent->children().size());
|
| - EXPECT_EQ(child1, parent->children()[0]);
|
| - EXPECT_EQ(child2, parent->children()[1]);
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(2, child1->SetScrollParent(child2.get()));
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, child1->RemoveFromParent());
|
| -
|
| - child2->reset_needs_push_properties_for_testing();
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(1, child1 = nullptr);
|
| -
|
| - EXPECT_TRUE(child2->needs_push_properties());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(nullptr));
|
| -}
|
| -
|
| -TEST_F(LayerTest, ReplaceChildWithSameChild) {
|
| - CreateSimpleTestTree();
|
| -
|
| - // SetNeedsFullTreeSync / SetNeedsCommit should not be called because its the
|
| - // same child.
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(0);
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(0);
|
| - parent_->ReplaceChild(child2_.get(), child2_);
|
| -
|
| - VerifyTestTreeInitialState();
|
| -}
|
| -
|
| -TEST_F(LayerTest, RemoveAllChildren) {
|
| - CreateSimpleTestTree();
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(AtLeast(3), parent_->RemoveAllChildren());
|
| -
|
| - ASSERT_EQ(0U, parent_->children().size());
|
| - EXPECT_FALSE(child1_->parent());
|
| - EXPECT_FALSE(child2_->parent());
|
| - EXPECT_FALSE(child3_->parent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, SetChildren) {
|
| - scoped_refptr<Layer> old_parent = Layer::Create();
|
| - scoped_refptr<Layer> new_parent = Layer::Create();
|
| -
|
| - scoped_refptr<Layer> child1 = Layer::Create();
|
| - scoped_refptr<Layer> child2 = Layer::Create();
|
| -
|
| - LayerList new_children;
|
| - new_children.push_back(child1);
|
| - new_children.push_back(child2);
|
| -
|
| - // Set up and verify initial test conditions: child1 has a parent, child2 has
|
| - // no parent.
|
| - old_parent->AddChild(child1);
|
| - ASSERT_EQ(0U, new_parent->children().size());
|
| - EXPECT_EQ(old_parent.get(), child1->parent());
|
| - EXPECT_FALSE(child2->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - 1, layer_tree_host_->SetRootLayer(new_parent));
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - AtLeast(1), new_parent->SetChildren(new_children));
|
| -
|
| - ASSERT_EQ(2U, new_parent->children().size());
|
| - EXPECT_EQ(new_parent.get(), child1->parent());
|
| - EXPECT_EQ(new_parent.get(), child2->parent());
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, layer_tree_host_->SetRootLayer(nullptr));
|
| -}
|
| -
|
| -TEST_F(LayerTest, HasAncestor) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - EXPECT_FALSE(parent->HasAncestor(parent.get()));
|
| -
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - parent->AddChild(child);
|
| -
|
| - EXPECT_FALSE(child->HasAncestor(child.get()));
|
| - EXPECT_TRUE(child->HasAncestor(parent.get()));
|
| - EXPECT_FALSE(parent->HasAncestor(child.get()));
|
| -
|
| - scoped_refptr<Layer> child_child = Layer::Create();
|
| - child->AddChild(child_child);
|
| -
|
| - EXPECT_FALSE(child_child->HasAncestor(child_child.get()));
|
| - EXPECT_TRUE(child_child->HasAncestor(parent.get()));
|
| - EXPECT_TRUE(child_child->HasAncestor(child.get()));
|
| - EXPECT_FALSE(parent->HasAncestor(child.get()));
|
| - EXPECT_FALSE(parent->HasAncestor(child_child.get()));
|
| -}
|
| -
|
| -TEST_F(LayerTest, GetRootLayerAfterTreeManipulations) {
|
| - CreateSimpleTestTree();
|
| -
|
| - // For this test we don't care about SetNeedsFullTreeSync calls.
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(AnyNumber());
|
| -
|
| - scoped_refptr<Layer> child4 = Layer::Create();
|
| -
|
| - EXPECT_EQ(parent_.get(), parent_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child3_->RootLayer());
|
| - EXPECT_EQ(child4.get(), child4->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
|
| -
|
| - child1_->RemoveFromParent();
|
| -
|
| - // |child1| and its children, grand_child1 and grand_child2 are now on a
|
| - // separate subtree.
|
| - EXPECT_EQ(parent_.get(), parent_->RootLayer());
|
| - EXPECT_EQ(child1_.get(), child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child3_->RootLayer());
|
| - EXPECT_EQ(child4.get(), child4->RootLayer());
|
| - EXPECT_EQ(child1_.get(), grand_child1_->RootLayer());
|
| - EXPECT_EQ(child1_.get(), grand_child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
|
| -
|
| - grand_child3_->AddChild(child4);
|
| -
|
| - EXPECT_EQ(parent_.get(), parent_->RootLayer());
|
| - EXPECT_EQ(child1_.get(), child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child3_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child4->RootLayer());
|
| - EXPECT_EQ(child1_.get(), grand_child1_->RootLayer());
|
| - EXPECT_EQ(child1_.get(), grand_child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child3_->RootLayer());
|
| -
|
| - child2_->ReplaceChild(grand_child3_.get(), child1_);
|
| -
|
| - // |grand_child3| gets orphaned and the child1 subtree gets planted back into
|
| - // the tree under child2.
|
| - EXPECT_EQ(parent_.get(), parent_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child2_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), child3_->RootLayer());
|
| - EXPECT_EQ(grand_child3_.get(), child4->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child1_->RootLayer());
|
| - EXPECT_EQ(parent_.get(), grand_child2_->RootLayer());
|
| - EXPECT_EQ(grand_child3_.get(), grand_child3_->RootLayer());
|
| -}
|
| -
|
| -TEST_F(LayerTest, CheckSetNeedsDisplayCausesCorrectBehavior) {
|
| - // The semantics for SetNeedsDisplay which are tested here:
|
| - // 1. sets NeedsDisplay flag appropriately.
|
| - // 2. indirectly calls SetNeedsUpdate, exactly once for each call to
|
| - // SetNeedsDisplay.
|
| -
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - 1, layer_tree_host_->SetRootLayer(test_layer));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(true));
|
| -
|
| - gfx::Size test_bounds = gfx::Size(501, 508);
|
| -
|
| - gfx::Rect dirty1 = gfx::Rect(10, 15, 1, 2);
|
| - gfx::Rect dirty2 = gfx::Rect(20, 25, 3, 4);
|
| - gfx::Rect out_of_bounds_dirty_rect = gfx::Rect(400, 405, 500, 502);
|
| -
|
| - // Before anything, test_layer should not be dirty.
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // This is just initialization, but SetNeedsCommit behavior is verified anyway
|
| - // to avoid warnings.
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBounds(test_bounds));
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // The real test begins here.
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // Case 1: Layer should accept dirty rects that go beyond its bounds.
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| - EXPECT_SET_NEEDS_UPDATE(
|
| - 1, test_layer->SetNeedsDisplayRect(out_of_bounds_dirty_rect));
|
| - EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| -
|
| - // Case 2: SetNeedsDisplay() without the dirty rect arg.
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| - EXPECT_SET_NEEDS_UPDATE(1, test_layer->SetNeedsDisplay());
|
| - EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| -
|
| - // Case 3: SetNeedsDisplay() with an empty rect.
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| - EXPECT_SET_NEEDS_COMMIT(0, test_layer->SetNeedsDisplayRect(gfx::Rect()));
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // Case 4: SetNeedsDisplay() with a non-drawable layer
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(false));
|
| - test_layer->ResetNeedsDisplayForTesting();
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| - EXPECT_SET_NEEDS_UPDATE(0, test_layer->SetNeedsDisplayRect(dirty1));
|
| - EXPECT_TRUE(test_layer->NeedsDisplayForTesting());
|
| -}
|
| -
|
| -TEST_F(LayerTest, CheckPropertyChangeCausesCorrectBehavior) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(
|
| - 1, layer_tree_host_->SetRootLayer(test_layer));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsDrawable(true));
|
| -
|
| - scoped_refptr<Layer> dummy_layer1 = Layer::Create();
|
| - scoped_refptr<Layer> dummy_layer2 = Layer::Create();
|
| -
|
| - // sanity check of initial test condition
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // Next, test properties that should call SetNeedsCommit (but not
|
| - // SetNeedsDisplay). All properties need to be set to new values in order for
|
| - // SetNeedsCommit to be called.
|
| - EXPECT_SET_NEEDS_COMMIT(
|
| - 1, test_layer->SetTransformOrigin(gfx::Point3F(1.23f, 4.56f, 0.f)));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBackgroundColor(SK_ColorLTGRAY));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetMasksToBounds(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetBlendMode(SkXfermode::kHue_Mode));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetIsRootForIsolatedGroup(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetContentsOpaque(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetPosition(gfx::PointF(4.f, 9.f)));
|
| - // We can use any layer pointer here since we aren't syncing for real.
|
| - EXPECT_SET_NEEDS_COMMIT(1,
|
| - test_layer->SetScrollClipLayerId(test_layer->id()));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetUserScrollable(true, false));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetScrollOffset(
|
| - gfx::ScrollOffset(10, 10)));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetShouldScrollOnMainThread(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetNonFastScrollableRegion(
|
| - Region(gfx::Rect(1, 1, 2, 2))));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHaveWheelEventHandlers(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHaveScrollEventHandlers(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(
|
| - gfx::Transform(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetDoubleSided(false));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTouchEventHandlerRegion(
|
| - gfx::Rect(10, 10)));
|
| - EXPECT_SET_NEEDS_COMMIT(
|
| - 1,
|
| - test_layer->SetDrawCheckerboardForMissingTiles(
|
| - !test_layer->draw_checkerboard_for_missing_tiles()));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetForceRenderSurface(true));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetHideLayerAndSubtree(true));
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, test_layer->SetMaskLayer(
|
| - dummy_layer1.get()));
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1, test_layer->SetReplicaLayer(
|
| - dummy_layer2.get()));
|
| -
|
| - // The above tests should not have caused a change to the needs_display flag.
|
| - EXPECT_FALSE(test_layer->NeedsDisplayForTesting());
|
| -
|
| - // As layers are removed from the tree, they will cause a tree sync.
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times((AnyNumber()));
|
| -}
|
| -
|
| -TEST_F(LayerTest, PushPropertiesAccumulatesUpdateRect) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - test_layer->SetNeedsDisplayRect(gfx::Rect(5, 5));
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FLOAT_RECT_EQ(gfx::RectF(0.f, 0.f, 5.f, 5.f),
|
| - impl_layer->update_rect());
|
| -
|
| - // The LayerImpl's update_rect() should be accumulated here, since we did not
|
| - // do anything to clear it.
|
| - test_layer->SetNeedsDisplayRect(gfx::Rect(10, 10, 5, 5));
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FLOAT_RECT_EQ(gfx::RectF(0.f, 0.f, 15.f, 15.f),
|
| - impl_layer->update_rect());
|
| -
|
| - // If we do clear the LayerImpl side, then the next update_rect() should be
|
| - // fresh without accumulation.
|
| - impl_layer->ResetAllChangeTrackingForSubtree();
|
| - test_layer->SetNeedsDisplayRect(gfx::Rect(10, 10, 5, 5));
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FLOAT_RECT_EQ(gfx::RectF(10.f, 10.f, 5.f, 5.f),
|
| - impl_layer->update_rect());
|
| -}
|
| -
|
| -TEST_F(LayerTest, PushPropertiesCausesLayerPropertyChangedForTransform) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - gfx::Transform transform;
|
| - transform.Rotate(45.0);
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| -
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| -
|
| - EXPECT_TRUE(impl_layer->LayerPropertyChanged());
|
| -}
|
| -
|
| -TEST_F(LayerTest, PushPropertiesCausesLayerPropertyChangedForOpacity) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| -
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| -
|
| - EXPECT_TRUE(impl_layer->LayerPropertyChanged());
|
| -}
|
| -
|
| -TEST_F(LayerTest,
|
| - PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyTransformAnim) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
|
| - impl_layer->layer_animation_controller()->SetAnimationRegistrar(
|
| - registrar.get());
|
| -
|
| - AddAnimatedTransformToController(impl_layer->layer_animation_controller(),
|
| - 1.0,
|
| - 0,
|
| - 100);
|
| -
|
| - gfx::Transform transform;
|
| - transform.Rotate(45.0);
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_TRUE(impl_layer->LayerPropertyChanged());
|
| -
|
| - impl_layer->ResetAllChangeTrackingForSubtree();
|
| - AddAnimatedTransformToController(impl_layer->layer_animation_controller(),
|
| - 1.0,
|
| - 0,
|
| - 100);
|
| - impl_layer->layer_animation_controller()
|
| - ->GetAnimation(Animation::TRANSFORM)
|
| - ->set_is_impl_only(true);
|
| - transform.Rotate(45.0);
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetTransform(transform));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| -}
|
| -
|
| -TEST_F(LayerTest,
|
| - PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyOpacityAnim) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
|
| - impl_layer->layer_animation_controller()->SetAnimationRegistrar(
|
| - registrar.get());
|
| -
|
| - AddOpacityTransitionToController(impl_layer->layer_animation_controller(),
|
| - 1.0,
|
| - 0.3f,
|
| - 0.7f,
|
| - false);
|
| -
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.5f));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_TRUE(impl_layer->LayerPropertyChanged());
|
| -
|
| - impl_layer->ResetAllChangeTrackingForSubtree();
|
| - AddOpacityTransitionToController(impl_layer->layer_animation_controller(),
|
| - 1.0,
|
| - 0.3f,
|
| - 0.7f,
|
| - false);
|
| - impl_layer->layer_animation_controller()
|
| - ->GetAnimation(Animation::OPACITY)
|
| - ->set_is_impl_only(true);
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetOpacity(0.75f));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| -}
|
| -
|
| -TEST_F(LayerTest,
|
| - PushPropsDoesntCauseLayerPropertyChangedDuringImplOnlyFilterAnim) {
|
| - scoped_refptr<Layer> test_layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| -
|
| - EXPECT_SET_NEEDS_FULL_TREE_SYNC(1,
|
| - layer_tree_host_->SetRootLayer(test_layer));
|
| -
|
| - scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
|
| - impl_layer->layer_animation_controller()->SetAnimationRegistrar(
|
| - registrar.get());
|
| -
|
| - AddAnimatedFilterToController(
|
| - impl_layer->layer_animation_controller(), 1.0, 1.f, 2.f);
|
| -
|
| - FilterOperations filters;
|
| - filters.Append(FilterOperation::CreateBlurFilter(2.f));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFilters(filters));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_TRUE(impl_layer->LayerPropertyChanged());
|
| -
|
| - impl_layer->ResetAllChangeTrackingForSubtree();
|
| - AddAnimatedFilterToController(
|
| - impl_layer->layer_animation_controller(), 1.0, 1.f, 2.f);
|
| - impl_layer->layer_animation_controller()
|
| - ->GetAnimation(Animation::FILTER)
|
| - ->set_is_impl_only(true);
|
| - filters.Append(FilterOperation::CreateSepiaFilter(0.5f));
|
| - EXPECT_SET_NEEDS_COMMIT(1, test_layer->SetFilters(filters));
|
| -
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| - test_layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FALSE(impl_layer->LayerPropertyChanged());
|
| -}
|
| -
|
| -TEST_F(LayerTest, MaskAndReplicaHasParent) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - scoped_refptr<Layer> mask = Layer::Create();
|
| - scoped_refptr<Layer> replica = Layer::Create();
|
| - scoped_refptr<Layer> replica_mask = Layer::Create();
|
| - scoped_refptr<Layer> mask_replacement = Layer::Create();
|
| - scoped_refptr<Layer> replica_replacement = Layer::Create();
|
| - scoped_refptr<Layer> replica_mask_replacement = Layer::Create();
|
| -
|
| - parent->AddChild(child);
|
| - child->SetMaskLayer(mask.get());
|
| - child->SetReplicaLayer(replica.get());
|
| - replica->SetMaskLayer(replica_mask.get());
|
| -
|
| - EXPECT_EQ(parent.get(), child->parent());
|
| - EXPECT_EQ(child.get(), mask->parent());
|
| - EXPECT_EQ(child.get(), replica->parent());
|
| - EXPECT_EQ(replica.get(), replica_mask->parent());
|
| -
|
| - replica->SetMaskLayer(replica_mask_replacement.get());
|
| - EXPECT_EQ(nullptr, replica_mask->parent());
|
| - EXPECT_EQ(replica.get(), replica_mask_replacement->parent());
|
| -
|
| - child->SetMaskLayer(mask_replacement.get());
|
| - EXPECT_EQ(nullptr, mask->parent());
|
| - EXPECT_EQ(child.get(), mask_replacement->parent());
|
| -
|
| - child->SetReplicaLayer(replica_replacement.get());
|
| - EXPECT_EQ(nullptr, replica->parent());
|
| - EXPECT_EQ(child.get(), replica_replacement->parent());
|
| -
|
| - EXPECT_EQ(replica.get(), replica->mask_layer()->parent());
|
| -}
|
| -
|
| -TEST_F(LayerTest, CheckTranformIsInvertible) {
|
| - scoped_refptr<Layer> layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
|
| - layer_tree_host_->SetRootLayer(layer);
|
| -
|
| - EXPECT_TRUE(layer->transform_is_invertible());
|
| -
|
| - gfx::Transform singular_transform;
|
| - singular_transform.Scale3d(
|
| - SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
|
| -
|
| - layer->SetTransform(singular_transform);
|
| - layer->PushPropertiesTo(impl_layer.get());
|
| -
|
| - EXPECT_FALSE(layer->transform_is_invertible());
|
| - EXPECT_FALSE(impl_layer->transform_is_invertible());
|
| -
|
| - gfx::Transform rotation_transform;
|
| - rotation_transform.RotateAboutZAxis(-45.0);
|
| -
|
| - layer->SetTransform(rotation_transform);
|
| - layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_TRUE(layer->transform_is_invertible());
|
| - EXPECT_TRUE(impl_layer->transform_is_invertible());
|
| -
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get());
|
| -}
|
| -
|
| -TEST_F(LayerTest, TranformIsInvertibleAnimation) {
|
| - scoped_refptr<Layer> layer = Layer::Create();
|
| - scoped_ptr<LayerImpl> impl_layer =
|
| - LayerImpl::Create(host_impl_.active_tree(), 1);
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsFullTreeSync()).Times(1);
|
| - EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber());
|
| - layer_tree_host_->SetRootLayer(layer);
|
| -
|
| - EXPECT_TRUE(layer->transform_is_invertible());
|
| -
|
| - gfx::Transform singular_transform;
|
| - singular_transform.Scale3d(
|
| - SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
|
| -
|
| - layer->SetTransform(singular_transform);
|
| - layer->PushPropertiesTo(impl_layer.get());
|
| -
|
| - EXPECT_FALSE(layer->transform_is_invertible());
|
| - EXPECT_FALSE(impl_layer->transform_is_invertible());
|
| -
|
| - gfx::Transform identity_transform;
|
| -
|
| - layer->SetTransform(identity_transform);
|
| - static_cast<LayerAnimationValueObserver*>(layer.get())
|
| - ->OnTransformAnimated(singular_transform);
|
| - layer->PushPropertiesTo(impl_layer.get());
|
| - EXPECT_FALSE(layer->transform_is_invertible());
|
| - EXPECT_FALSE(impl_layer->transform_is_invertible());
|
| -
|
| - Mock::VerifyAndClearExpectations(layer_tree_host_.get());
|
| -}
|
| -
|
| -class LayerTreeHostFactory {
|
| - public:
|
| - LayerTreeHostFactory()
|
| - : client_(FakeLayerTreeHostClient::DIRECT_3D),
|
| - shared_bitmap_manager_(new TestSharedBitmapManager),
|
| - gpu_memory_buffer_manager_(new TestGpuMemoryBufferManager) {}
|
| -
|
| - scoped_ptr<LayerTreeHost> Create() {
|
| - return LayerTreeHost::CreateSingleThreaded(
|
| - &client_, &client_, shared_bitmap_manager_.get(),
|
| - gpu_memory_buffer_manager_.get(), nullptr, LayerTreeSettings(),
|
| - base::MessageLoopProxy::current(), nullptr);
|
| - }
|
| -
|
| - scoped_ptr<LayerTreeHost> Create(LayerTreeSettings settings) {
|
| - return LayerTreeHost::CreateSingleThreaded(
|
| - &client_, &client_, shared_bitmap_manager_.get(),
|
| - gpu_memory_buffer_manager_.get(), nullptr, settings,
|
| - base::MessageLoopProxy::current(), nullptr);
|
| - }
|
| -
|
| - private:
|
| - FakeLayerTreeHostClient client_;
|
| - scoped_ptr<TestSharedBitmapManager> shared_bitmap_manager_;
|
| - scoped_ptr<TestGpuMemoryBufferManager> gpu_memory_buffer_manager_;
|
| -};
|
| -
|
| -void AssertLayerTreeHostMatchesForSubtree(Layer* layer, LayerTreeHost* host) {
|
| - EXPECT_EQ(host, layer->layer_tree_host());
|
| -
|
| - for (size_t i = 0; i < layer->children().size(); ++i)
|
| - AssertLayerTreeHostMatchesForSubtree(layer->children()[i].get(), host);
|
| -
|
| - if (layer->mask_layer())
|
| - AssertLayerTreeHostMatchesForSubtree(layer->mask_layer(), host);
|
| -
|
| - if (layer->replica_layer())
|
| - AssertLayerTreeHostMatchesForSubtree(layer->replica_layer(), host);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, EnteringTree) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - scoped_refptr<Layer> mask = Layer::Create();
|
| - scoped_refptr<Layer> replica = Layer::Create();
|
| - scoped_refptr<Layer> replica_mask = Layer::Create();
|
| -
|
| - // Set up a detached tree of layers. The host pointer should be nil for these
|
| - // layers.
|
| - parent->AddChild(child);
|
| - child->SetMaskLayer(mask.get());
|
| - child->SetReplicaLayer(replica.get());
|
| - replica->SetMaskLayer(replica_mask.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(), nullptr);
|
| -
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
|
| - // Setting the root layer should set the host pointer for all layers in the
|
| - // tree.
|
| - layer_tree_host->SetRootLayer(parent.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
|
| -
|
| - // Clearing the root layer should also clear out the host pointers for all
|
| - // layers in the tree.
|
| - layer_tree_host->SetRootLayer(nullptr);
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(), nullptr);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, AddingLayerSubtree) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
|
| -
|
| - layer_tree_host->SetRootLayer(parent.get());
|
| -
|
| - EXPECT_EQ(parent->layer_tree_host(), layer_tree_host.get());
|
| -
|
| - // Adding a subtree to a layer already associated with a host should set the
|
| - // host pointer on all layers in that subtree.
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - scoped_refptr<Layer> grand_child = Layer::Create();
|
| - child->AddChild(grand_child);
|
| -
|
| - // Masks, replicas, and replica masks should pick up the new host too.
|
| - scoped_refptr<Layer> child_mask = Layer::Create();
|
| - child->SetMaskLayer(child_mask.get());
|
| - scoped_refptr<Layer> child_replica = Layer::Create();
|
| - child->SetReplicaLayer(child_replica.get());
|
| - scoped_refptr<Layer> child_replica_mask = Layer::Create();
|
| - child_replica->SetMaskLayer(child_replica_mask.get());
|
| -
|
| - parent->AddChild(child);
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
|
| -
|
| - layer_tree_host->SetRootLayer(nullptr);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, ChangeHost) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - scoped_refptr<Layer> mask = Layer::Create();
|
| - scoped_refptr<Layer> replica = Layer::Create();
|
| - scoped_refptr<Layer> replica_mask = Layer::Create();
|
| -
|
| - // Same setup as the previous test.
|
| - parent->AddChild(child);
|
| - child->SetMaskLayer(mask.get());
|
| - child->SetReplicaLayer(replica.get());
|
| - replica->SetMaskLayer(replica_mask.get());
|
| -
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> first_layer_tree_host = factory.Create();
|
| - first_layer_tree_host->SetRootLayer(parent.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(),
|
| - first_layer_tree_host.get());
|
| -
|
| - // Now re-root the tree to a new host (simulating what we do on a context lost
|
| - // event). This should update the host pointers for all layers in the tree.
|
| - scoped_ptr<LayerTreeHost> second_layer_tree_host = factory.Create();
|
| - second_layer_tree_host->SetRootLayer(parent.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(),
|
| - second_layer_tree_host.get());
|
| -
|
| - second_layer_tree_host->SetRootLayer(nullptr);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, ChangeHostInSubtree) {
|
| - scoped_refptr<Layer> first_parent = Layer::Create();
|
| - scoped_refptr<Layer> first_child = Layer::Create();
|
| - scoped_refptr<Layer> second_parent = Layer::Create();
|
| - scoped_refptr<Layer> second_child = Layer::Create();
|
| - scoped_refptr<Layer> second_grand_child = Layer::Create();
|
| -
|
| - // First put all children under the first parent and set the first host.
|
| - first_parent->AddChild(first_child);
|
| - second_child->AddChild(second_grand_child);
|
| - first_parent->AddChild(second_child);
|
| -
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> first_layer_tree_host = factory.Create();
|
| - first_layer_tree_host->SetRootLayer(first_parent.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(first_parent.get(),
|
| - first_layer_tree_host.get());
|
| -
|
| - // Now reparent the subtree starting at second_child to a layer in a different
|
| - // tree.
|
| - scoped_ptr<LayerTreeHost> second_layer_tree_host = factory.Create();
|
| - second_layer_tree_host->SetRootLayer(second_parent.get());
|
| -
|
| - second_parent->AddChild(second_child);
|
| -
|
| - // The moved layer and its children should point to the new host.
|
| - EXPECT_EQ(second_layer_tree_host.get(), second_child->layer_tree_host());
|
| - EXPECT_EQ(second_layer_tree_host.get(),
|
| - second_grand_child->layer_tree_host());
|
| -
|
| - // Test over, cleanup time.
|
| - first_layer_tree_host->SetRootLayer(nullptr);
|
| - second_layer_tree_host->SetRootLayer(nullptr);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, ReplaceMaskAndReplicaLayer) {
|
| - scoped_refptr<Layer> parent = Layer::Create();
|
| - scoped_refptr<Layer> mask = Layer::Create();
|
| - scoped_refptr<Layer> replica = Layer::Create();
|
| - scoped_refptr<Layer> mask_child = Layer::Create();
|
| - scoped_refptr<Layer> replica_child = Layer::Create();
|
| - scoped_refptr<Layer> mask_replacement = Layer::Create();
|
| - scoped_refptr<Layer> replica_replacement = Layer::Create();
|
| -
|
| - parent->SetMaskLayer(mask.get());
|
| - parent->SetReplicaLayer(replica.get());
|
| - mask->AddChild(mask_child);
|
| - replica->AddChild(replica_child);
|
| -
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
|
| - layer_tree_host->SetRootLayer(parent.get());
|
| -
|
| - AssertLayerTreeHostMatchesForSubtree(parent.get(), layer_tree_host.get());
|
| -
|
| - // Replacing the mask should clear out the old mask's subtree's host pointers.
|
| - parent->SetMaskLayer(mask_replacement.get());
|
| - EXPECT_EQ(nullptr, mask->layer_tree_host());
|
| - EXPECT_EQ(nullptr, mask_child->layer_tree_host());
|
| -
|
| - // Same for replacing a replica layer.
|
| - parent->SetReplicaLayer(replica_replacement.get());
|
| - EXPECT_EQ(nullptr, replica->layer_tree_host());
|
| - EXPECT_EQ(nullptr, replica_child->layer_tree_host());
|
| -
|
| - // Test over, cleanup time.
|
| - layer_tree_host->SetRootLayer(nullptr);
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, DestroyHostWithNonNullRootLayer) {
|
| - scoped_refptr<Layer> root = Layer::Create();
|
| - scoped_refptr<Layer> child = Layer::Create();
|
| - root->AddChild(child);
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
|
| - layer_tree_host->SetRootLayer(root);
|
| -}
|
| -
|
| -static bool AddTestAnimation(Layer* layer) {
|
| - scoped_ptr<KeyframedFloatAnimationCurve> curve =
|
| - KeyframedFloatAnimationCurve::Create();
|
| - curve->AddKeyframe(FloatKeyframe::Create(base::TimeDelta(), 0.3f, nullptr));
|
| - curve->AddKeyframe(
|
| - FloatKeyframe::Create(base::TimeDelta::FromSecondsD(1.0), 0.7f, nullptr));
|
| - scoped_ptr<Animation> animation =
|
| - Animation::Create(curve.Pass(), 0, 0, Animation::OPACITY);
|
| -
|
| - return layer->AddAnimation(animation.Pass());
|
| -}
|
| -
|
| -TEST(LayerLayerTreeHostTest, ShouldNotAddAnimationWithoutAnimationRegistrar) {
|
| - scoped_refptr<Layer> layer = Layer::Create();
|
| -
|
| - // Case 1: without a LayerTreeHost and without an AnimationRegistrar, the
|
| - // animation should not be accepted.
|
| - EXPECT_FALSE(AddTestAnimation(layer.get()));
|
| -
|
| - scoped_ptr<AnimationRegistrar> registrar = AnimationRegistrar::Create();
|
| - layer->layer_animation_controller()->SetAnimationRegistrar(registrar.get());
|
| -
|
| - // Case 2: with an AnimationRegistrar, the animation should be accepted.
|
| - EXPECT_TRUE(AddTestAnimation(layer.get()));
|
| -
|
| - LayerTreeSettings settings;
|
| - settings.accelerated_animation_enabled = false;
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create(settings);
|
| - layer_tree_host->SetRootLayer(layer);
|
| - AssertLayerTreeHostMatchesForSubtree(layer.get(), layer_tree_host.get());
|
| -
|
| - // Case 3: with a LayerTreeHost where accelerated animation is disabled, the
|
| - // animation should be rejected.
|
| - EXPECT_FALSE(AddTestAnimation(layer.get()));
|
| -}
|
| -
|
| -TEST_F(LayerTest, SafeOpaqueBackgroundColor) {
|
| - LayerTreeHostFactory factory;
|
| - scoped_ptr<LayerTreeHost> layer_tree_host = factory.Create();
|
| -
|
| - scoped_refptr<Layer> layer = Layer::Create();
|
| - layer_tree_host->SetRootLayer(layer);
|
| -
|
| - for (int contents_opaque = 0; contents_opaque < 2; ++contents_opaque) {
|
| - for (int layer_opaque = 0; layer_opaque < 2; ++layer_opaque) {
|
| - for (int host_opaque = 0; host_opaque < 2; ++host_opaque) {
|
| - layer->SetContentsOpaque(!!contents_opaque);
|
| - layer->SetBackgroundColor(layer_opaque ? SK_ColorRED
|
| - : SK_ColorTRANSPARENT);
|
| - layer_tree_host->set_background_color(
|
| - host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT);
|
| -
|
| - SkColor safe_color = layer->SafeOpaqueBackgroundColor();
|
| - if (contents_opaque) {
|
| - EXPECT_EQ(SkColorGetA(safe_color), 255u)
|
| - << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
|
| - << host_opaque << "\n";
|
| - } else {
|
| - EXPECT_NE(SkColorGetA(safe_color), 255u)
|
| - << "Flags: " << contents_opaque << ", " << layer_opaque << ", "
|
| - << host_opaque << "\n";
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -class DrawsContentChangeLayer : public Layer {
|
| - public:
|
| - static scoped_refptr<DrawsContentChangeLayer> Create() {
|
| - return make_scoped_refptr(new DrawsContentChangeLayer());
|
| - }
|
| -
|
| - void SetLayerTreeHost(LayerTreeHost* host) override {
|
| - Layer::SetLayerTreeHost(host);
|
| - SetFakeDrawsContent(!fake_draws_content_);
|
| - }
|
| -
|
| - bool HasDrawableContent() const override {
|
| - return fake_draws_content_ && Layer::HasDrawableContent();
|
| - }
|
| -
|
| - void SetFakeDrawsContent(bool fake_draws_content) {
|
| - fake_draws_content_ = fake_draws_content;
|
| - UpdateDrawsContent(HasDrawableContent());
|
| - }
|
| -
|
| - private:
|
| - DrawsContentChangeLayer() : Layer(), fake_draws_content_(false) {}
|
| - ~DrawsContentChangeLayer() override {}
|
| -
|
| - bool fake_draws_content_;
|
| -};
|
| -
|
| -TEST_F(LayerTest, DrawsContentChangedInSetLayerTreeHost) {
|
| - scoped_refptr<Layer> root_layer = Layer::Create();
|
| - scoped_refptr<DrawsContentChangeLayer> becomes_not_draws_content =
|
| - DrawsContentChangeLayer::Create();
|
| - scoped_refptr<DrawsContentChangeLayer> becomes_draws_content =
|
| - DrawsContentChangeLayer::Create();
|
| - root_layer->SetIsDrawable(true);
|
| - becomes_not_draws_content->SetIsDrawable(true);
|
| - becomes_not_draws_content->SetFakeDrawsContent(true);
|
| - EXPECT_EQ(0, root_layer->NumDescendantsThatDrawContent());
|
| - root_layer->AddChild(becomes_not_draws_content);
|
| - EXPECT_EQ(0, root_layer->NumDescendantsThatDrawContent());
|
| -
|
| - becomes_draws_content->SetIsDrawable(true);
|
| - root_layer->AddChild(becomes_draws_content);
|
| - EXPECT_EQ(1, root_layer->NumDescendantsThatDrawContent());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace cc
|
|
|