summaryrefslogtreecommitdiffstats
path: root/cc/layers
diff options
context:
space:
mode:
Diffstat (limited to 'cc/layers')
-rw-r--r--cc/layers/layer.cc84
-rw-r--r--cc/layers/layer.h10
-rw-r--r--cc/layers/layer_proto_converter.cc11
-rw-r--r--cc/layers/layer_proto_converter.h3
-rw-r--r--cc/layers/layer_proto_converter_unittest.cc25
-rw-r--r--cc/layers/layer_unittest.cc130
6 files changed, 162 insertions, 101 deletions
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 0567738..1bd263d 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -1309,16 +1309,51 @@ void Layer::ToLayerNodeProto(proto::LayerNode* proto) const {
replica_layer_->ToLayerNodeProto(proto->mutable_replica_layer());
}
+void Layer::ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ LayerIdMap* layer_map) {
+ (*layer_map)[layer_id_] = this;
+
+ if (layer_tree_host_)
+ layer_tree_host_->UnregisterLayer(this);
+
+ layer_tree_host_ = nullptr;
+ parent_ = nullptr;
+
+ // Clear these properties for all the children and add them to the map.
+ for (auto& child : children_) {
+ child->ClearLayerTreePropertiesForDeserializationAndAddToMap(layer_map);
+ }
+
+ children_.clear();
+
+ if (mask_layer_) {
+ mask_layer_->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ layer_map);
+ mask_layer_ = nullptr;
+ }
+
+ if (replica_layer_) {
+ replica_layer_->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ layer_map);
+ replica_layer_ = nullptr;
+ }
+}
+
void Layer::FromLayerNodeProto(const proto::LayerNode& proto,
- const LayerIdMap& layer_map) {
+ const LayerIdMap& layer_map,
+ LayerTreeHost* layer_tree_host) {
+ DCHECK(!layer_tree_host_);
+ DCHECK(children_.empty());
+ DCHECK(!mask_layer_);
+ DCHECK(!replica_layer_);
+ DCHECK(layer_tree_host);
DCHECK(proto.has_id());
+
layer_id_ = proto.id();
- // To deserialize the new children, make a copy of the old list, before
- // inserting each of the new children in a new list, reusing old Layer objects
- // if the Layer already exists.
- LayerList old_children = children_;
- children_.clear();
+ layer_tree_host_ = layer_tree_host;
+ layer_tree_host_->RegisterLayer(this);
+
for (int i = 0; i < proto.children_size(); ++i) {
const proto::LayerNode& child_proto = proto.children(i);
DCHECK(child_proto.has_type());
@@ -1326,51 +1361,26 @@ void Layer::FromLayerNodeProto(const proto::LayerNode& proto,
LayerProtoConverter::FindOrAllocateAndConstruct(child_proto, layer_map);
// The child must now refer to this layer as its parent, and must also have
// the same LayerTreeHost. This must be done before deserializing children.
+ DCHECK(!child->parent_);
child->parent_ = this;
- child->layer_tree_host_ = layer_tree_host_;
- child->FromLayerNodeProto(child_proto, layer_map);
+ child->FromLayerNodeProto(child_proto, layer_map, layer_tree_host_);
children_.push_back(child);
}
- // Remove now-unused children from the tree.
- for (auto& child : old_children) {
- // A child might have been moved to a different parent.
- if (child->parent_ != this)
- continue;
- // Our own child is not part of our new children, so remove it.
- if (std::find(children_.begin(), children_.end(), child) ==
- children_.end()) {
- child->parent_ = nullptr;
- child->layer_tree_host_ = nullptr;
- }
- }
-
- if (mask_layer_) {
- mask_layer_->parent_ = nullptr;
- mask_layer_->layer_tree_host_ = nullptr;
- }
if (proto.has_mask_layer()) {
mask_layer_ = LayerProtoConverter::FindOrAllocateAndConstruct(
proto.mask_layer(), layer_map);
mask_layer_->parent_ = this;
- mask_layer_->layer_tree_host_ = layer_tree_host_;
- mask_layer_->FromLayerNodeProto(proto.mask_layer(), layer_map);
- } else {
- mask_layer_ = nullptr;
+ mask_layer_->FromLayerNodeProto(proto.mask_layer(), layer_map,
+ layer_tree_host_);
}
- if (replica_layer_) {
- replica_layer_->parent_ = nullptr;
- replica_layer_->layer_tree_host_ = nullptr;
- }
if (proto.has_replica_layer()) {
replica_layer_ = LayerProtoConverter::FindOrAllocateAndConstruct(
proto.replica_layer(), layer_map);
replica_layer_->parent_ = this;
- replica_layer_->layer_tree_host_ = layer_tree_host_;
- replica_layer_->FromLayerNodeProto(proto.replica_layer(), layer_map);
- } else {
- replica_layer_ = nullptr;
+ replica_layer_->FromLayerNodeProto(proto.replica_layer(), layer_map,
+ layer_tree_host_);
}
}
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 409a556..aa0d9a9 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -375,12 +375,20 @@ class CC_EXPORT Layer : public base::RefCounted<Layer> {
// construction of the correct layer on the client.
void ToLayerNodeProto(proto::LayerNode* proto) const;
+ // Recursively iterate over this layer and all children and reset the
+ // properties sent with the hierarchical structure in the LayerNode protos.
+ // This must be done before deserializing the new LayerTree from the Layernode
+ // protos.
+ void ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ LayerIdMap* layer_map);
+
// Recursively iterate over the given LayerNode proto and read the structure
// into this node and its children. The |layer_map| should be used to look
// for previously existing Layers, since they should be re-used between each
// hierarchy update.
void FromLayerNodeProto(const proto::LayerNode& proto,
- const LayerIdMap& layer_map);
+ const LayerIdMap& layer_map,
+ LayerTreeHost* layer_tree_host);
// This method is similar to PushPropertiesTo, but instead of pushing to
// a LayerImpl, it pushes the properties to proto::LayerProperties. It is
diff --git a/cc/layers/layer_proto_converter.cc b/cc/layers/layer_proto_converter.cc
index 626380d..f4c097f 100644
--- a/cc/layers/layer_proto_converter.cc
+++ b/cc/layers/layer_proto_converter.cc
@@ -30,10 +30,13 @@ void LayerProtoConverter::SerializeLayerHierarchy(
// static
scoped_refptr<Layer> LayerProtoConverter::DeserializeLayerHierarchy(
scoped_refptr<Layer> existing_root,
- const proto::LayerNode& root_node) {
+ const proto::LayerNode& root_node,
+ LayerTreeHost* layer_tree_host) {
LayerIdMap layer_id_map;
- if (existing_root)
- RecursivelyFindAllLayers(existing_root.get(), &layer_id_map);
+ if (existing_root) {
+ existing_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &layer_id_map);
+ }
scoped_refptr<Layer> new_root = existing_root;
if (!existing_root ||
@@ -42,7 +45,7 @@ scoped_refptr<Layer> LayerProtoConverter::DeserializeLayerHierarchy(
// so find or create the new root.
new_root = FindOrAllocateAndConstruct(root_node, layer_id_map);
}
- new_root->FromLayerNodeProto(root_node, layer_id_map);
+ new_root->FromLayerNodeProto(root_node, layer_id_map, layer_tree_host);
return new_root;
}
diff --git a/cc/layers/layer_proto_converter.h b/cc/layers/layer_proto_converter.h
index 92a4b54..b86ae91 100644
--- a/cc/layers/layer_proto_converter.h
+++ b/cc/layers/layer_proto_converter.h
@@ -33,7 +33,8 @@ class CC_EXPORT LayerProtoConverter {
// the first deserialize.
static scoped_refptr<Layer> DeserializeLayerHierarchy(
const scoped_refptr<Layer> existing_root,
- const proto::LayerNode& root_node);
+ const proto::LayerNode& root_node,
+ LayerTreeHost* layer_tree_host);
// Serializes the properties of all the dirty nodes in the Layer hierarchy.
// The proto::LayerUpdate will contain all nodes that are dirty. These nodes
diff --git a/cc/layers/layer_proto_converter_unittest.cc b/cc/layers/layer_proto_converter_unittest.cc
index 2de7f7d..33d12ac 100644
--- a/cc/layers/layer_proto_converter_unittest.cc
+++ b/cc/layers/layer_proto_converter_unittest.cc
@@ -68,7 +68,8 @@ TEST_F(LayerProtoConverterTest, TestKeepingRoot) {
child_c_node->set_parent_id(child_b_node->id());
scoped_refptr<Layer> new_root =
- LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node);
+ LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node,
+ layer_tree_host_.get());
// The new root should not be the same as the old root.
EXPECT_EQ(old_root->id(), new_root->id());
@@ -84,6 +85,8 @@ TEST_F(LayerProtoConverterTest, TestKeepingRoot) {
scoped_refptr<Layer> child_c = child_b->children()[0];
EXPECT_EQ(child_c_node->id(), child_c->id());
+
+ new_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerProtoConverterTest, TestNoExistingRoot) {
@@ -104,7 +107,8 @@ TEST_F(LayerProtoConverterTest, TestNoExistingRoot) {
child_a_node->set_parent_id(new_root_id); // root_node
scoped_refptr<Layer> new_root =
- LayerProtoConverter::DeserializeLayerHierarchy(nullptr, root_node);
+ LayerProtoConverter::DeserializeLayerHierarchy(nullptr, root_node,
+ layer_tree_host_.get());
// The new root should not be the same as the old root.
EXPECT_EQ(new_root_id, new_root->id());
@@ -113,6 +117,8 @@ TEST_F(LayerProtoConverterTest, TestNoExistingRoot) {
EXPECT_EQ(child_a_node->id(), child_a->id());
EXPECT_EQ(0u, child_a->children().size());
+
+ new_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerProtoConverterTest, TestSwappingRoot) {
@@ -145,7 +151,8 @@ TEST_F(LayerProtoConverterTest, TestSwappingRoot) {
scoped_refptr<Layer> old_root = Layer::Create();
scoped_refptr<Layer> new_root =
- LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node);
+ LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node,
+ layer_tree_host_.get());
// The new root should not be the same as the old root.
EXPECT_EQ(root_node.id(), new_root->id());
@@ -161,6 +168,8 @@ TEST_F(LayerProtoConverterTest, TestSwappingRoot) {
scoped_refptr<Layer> child_c = child_b->children()[0];
EXPECT_EQ(child_c_node->id(), child_c->id());
+
+ new_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerProtoConverterTest, RecursivePropertiesSerialization) {
@@ -343,7 +352,8 @@ TEST_F(LayerProtoConverterTest, PictureLayerTypeDeserialization) {
root_node.set_type(proto::LayerNode::PICTURE_LAYER);
scoped_refptr<Layer> new_root =
- LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node);
+ LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node,
+ layer_tree_host_.get());
// Validate that the ids are equal.
EXPECT_EQ(old_root->id(), new_root->id());
@@ -353,6 +363,8 @@ TEST_F(LayerProtoConverterTest, PictureLayerTypeDeserialization) {
proto::LayerNode layer_node;
new_root->SetTypeForProtoSerialization(&layer_node);
EXPECT_EQ(proto::LayerNode::PICTURE_LAYER, layer_node.type());
+
+ new_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerProtoConverterTest, HudLayerTypeSerialization) {
@@ -374,7 +386,8 @@ TEST_F(LayerProtoConverterTest, HudLayerTypeDeserialization) {
root_node.set_type(proto::LayerNode::HEADS_UP_DISPLAY_LAYER);
scoped_refptr<Layer> new_root =
- LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node);
+ LayerProtoConverter::DeserializeLayerHierarchy(old_root, root_node,
+ layer_tree_host_.get());
// Validate that the ids are equal.
EXPECT_EQ(old_root->id(), new_root->id());
@@ -384,6 +397,8 @@ TEST_F(LayerProtoConverterTest, HudLayerTypeDeserialization) {
proto::LayerNode layer_node;
new_root->SetTypeForProtoSerialization(&layer_node);
EXPECT_EQ(proto::LayerNode::HEADS_UP_DISPLAY_LAYER, layer_node.type());
+
+ new_root->SetLayerTreeHost(nullptr);
}
} // namespace
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc
index da644f5..752757b 100644
--- a/cc/layers/layer_unittest.cc
+++ b/cc/layers/layer_unittest.cc
@@ -393,11 +393,8 @@ class LayerSerializationTest : public testing::Test {
Layer::LayerIdMap empty_dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- // Forcefully set the layer tree host for the root layer, which should cause
- // it to propagate to all the children.
- layer_dest_root->layer_tree_host_ = layer_tree_host_.get();
-
- layer_dest_root->FromLayerNodeProto(proto, empty_dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(proto, empty_dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
EXPECT_EQ(nullptr, layer_dest_root->parent());
@@ -451,15 +448,19 @@ class LayerSerializationTest : public testing::Test {
layer_root->ToLayerNodeProto(&root_proto);
Layer::LayerIdMap dest_layer_map;
- dest_layer_map[layer_root->id()] = layer_root;
- dest_layer_map[layer_src_a->id()] = layer_src_a;
- layer_root->FromLayerNodeProto(root_proto, dest_layer_map);
+ layer_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_root->FromLayerNodeProto(root_proto, dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(33, layer_root->transform_tree_index_);
ASSERT_EQ(1u, layer_root->children().size());
scoped_refptr<Layer> layer_dest_a = layer_root->children()[0];
EXPECT_EQ(layer_src_a, layer_dest_a);
EXPECT_EQ(42, layer_dest_a->transform_tree_index_);
+
+ // Clear the reference to the LTH for all the layers.
+ layer_root->SetLayerTreeHost(nullptr);
}
void RunNonDestructiveDeserializationReorderChildrenTest() {
@@ -488,7 +489,8 @@ class LayerSerializationTest : public testing::Test {
layer_src_root->ToLayerNodeProto(&root_proto_1);
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map,
+ layer_tree_host_.get());
// Ensure initial copy is correct.
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -510,10 +512,10 @@ class LayerSerializationTest : public testing::Test {
// Now serialize and deserialize again.
proto::LayerNode root_proto_2;
layer_src_root->ToLayerNodeProto(&root_proto_2);
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_a->id()] = layer_dest_a;
- dest_layer_map[layer_dest_b->id()] = layer_dest_b;
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map,
+ layer_tree_host_.get());
// Ensure second copy is correct.
EXPECT_EQ(33, layer_dest_root->transform_tree_index_);
@@ -524,6 +526,8 @@ class LayerSerializationTest : public testing::Test {
layer_dest_a = layer_dest_root->children()[1];
EXPECT_EQ(layer_src_a->id(), layer_dest_a->id());
EXPECT_EQ(42, layer_dest_a->transform_tree_index_);
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
void RunNonDestructiveDeserializationAddChildTest() {
@@ -550,7 +554,8 @@ class LayerSerializationTest : public testing::Test {
layer_src_root->ToLayerNodeProto(&root_proto_1);
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map,
+ layer_tree_host_.get());
// Ensure initial copy is correct.
ASSERT_EQ(1u, layer_dest_root->children().size());
@@ -568,9 +573,10 @@ class LayerSerializationTest : public testing::Test {
// Now serialize and deserialize again.
proto::LayerNode root_proto_2;
layer_src_root->ToLayerNodeProto(&root_proto_2);
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_a->id()] = layer_dest_a;
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map,
+ layer_tree_host_.get());
// Ensure second copy is correct.
EXPECT_EQ(33, layer_dest_root->transform_tree_index_);
@@ -580,6 +586,8 @@ class LayerSerializationTest : public testing::Test {
EXPECT_EQ(42, layer_dest_a->transform_tree_index_);
scoped_refptr<Layer> layer_dest_b = layer_dest_root->children()[1];
EXPECT_EQ(layer_src_b->id(), layer_dest_b->id());
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
void RunNonDestructiveDeserializationRemoveChildTest() {
@@ -608,7 +616,8 @@ class LayerSerializationTest : public testing::Test {
layer_src_root->ToLayerNodeProto(&root_proto_1);
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map,
+ layer_tree_host_.get());
// Ensure initial copy is correct.
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -628,10 +637,10 @@ class LayerSerializationTest : public testing::Test {
// Now serialize and deserialize again.
proto::LayerNode root_proto_2;
layer_src_root->ToLayerNodeProto(&root_proto_2);
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_a->id()] = layer_dest_a;
- dest_layer_map[layer_dest_b->id()] = layer_dest_b;
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map,
+ layer_tree_host_.get());
// Ensure second copy is correct.
EXPECT_EQ(33, layer_dest_root->transform_tree_index_);
@@ -639,6 +648,8 @@ class LayerSerializationTest : public testing::Test {
layer_dest_a = layer_dest_root->children()[0];
EXPECT_EQ(layer_src_a->id(), layer_dest_a->id());
EXPECT_EQ(42, layer_dest_a->transform_tree_index_);
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
void RunNonDestructiveDeserializationMoveChildEarlierTest() {
@@ -673,7 +684,8 @@ class LayerSerializationTest : public testing::Test {
layer_src_root->ToLayerNodeProto(&root_proto_1);
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map,
+ layer_tree_host_.get());
// Ensure initial copy is correct.
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -699,11 +711,10 @@ class LayerSerializationTest : public testing::Test {
// Now serialize and deserialize again.
proto::LayerNode root_proto_2;
layer_src_root->ToLayerNodeProto(&root_proto_2);
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_a->id()] = layer_dest_a;
- dest_layer_map[layer_dest_b->id()] = layer_dest_b;
- dest_layer_map[layer_dest_c->id()] = layer_dest_c;
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map,
+ layer_tree_host_.get());
// Ensure second copy is correct.
EXPECT_EQ(33, layer_dest_root->transform_tree_index_);
@@ -718,6 +729,8 @@ class LayerSerializationTest : public testing::Test {
layer_dest_c = layer_dest_a->children()[0];
EXPECT_EQ(layer_src_c->id(), layer_dest_c->id());
EXPECT_EQ(99, layer_dest_c->transform_tree_index_);
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
void RunNonDestructiveDeserializationMoveChildLaterTest() {
@@ -752,7 +765,8 @@ class LayerSerializationTest : public testing::Test {
layer_src_root->ToLayerNodeProto(&root_proto_1);
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map,
+ layer_tree_host_.get());
// Ensure initial copy is correct.
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -778,11 +792,10 @@ class LayerSerializationTest : public testing::Test {
// Now serialize and deserialize again.
proto::LayerNode root_proto_2;
layer_src_root->ToLayerNodeProto(&root_proto_2);
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_a->id()] = layer_dest_a;
- dest_layer_map[layer_dest_b->id()] = layer_dest_b;
- dest_layer_map[layer_dest_c->id()] = layer_dest_c;
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map,
+ layer_tree_host_.get());
// Ensure second copy is correct.
EXPECT_EQ(33, layer_dest_root->transform_tree_index_);
@@ -797,6 +810,8 @@ class LayerSerializationTest : public testing::Test {
layer_dest_c = layer_dest_b->children()[0];
EXPECT_EQ(layer_src_c->id(), layer_dest_c->id());
EXPECT_EQ(99, layer_dest_c->transform_tree_index_);
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
TestTaskGraphRunner task_graph_runner_;
@@ -2232,7 +2247,8 @@ TEST_F(LayerTest, RecursiveHierarchySerialization) {
Layer::LayerIdMap empty_dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(proto, empty_dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(proto, empty_dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
EXPECT_EQ(nullptr, layer_dest_root->parent());
@@ -2254,6 +2270,8 @@ TEST_F(LayerTest, RecursiveHierarchySerialization) {
EXPECT_EQ(0u, layer_dest_c->children().size());
EXPECT_EQ(layer_src_c_mask->id(), layer_dest_c->mask_layer()->id());
EXPECT_EQ(layer_src_c_replica->id(), layer_dest_c->replica_layer()->id());
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
@@ -2278,7 +2296,8 @@ TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
Layer::LayerIdMap dest_layer_map_1;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map_1);
+ layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map_1,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
ASSERT_EQ(1u, layer_dest_root->children().size());
@@ -2287,8 +2306,8 @@ TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
// Setup new destination layer map.
Layer::LayerIdMap dest_layer_map_2;
- dest_layer_map_2[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map_2[layer_dest_a_1->id()] = layer_dest_a_1;
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map_2);
// Add Layer |b|.
scoped_refptr<Layer> layer_src_b = Layer::Create();
@@ -2299,7 +2318,8 @@ TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
layer_src_root->ToLayerNodeProto(&root_proto_2);
// Second deserialization.
- layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map_2);
+ layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map_2,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -2316,6 +2336,8 @@ TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
// Layer |a| should be the same.
EXPECT_EQ(layer_dest_a_1.get(), layer_dest_a_2.get());
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerTest, DeletingSubtreeDeletesLayers) {
@@ -2347,7 +2369,8 @@ TEST_F(LayerTest, DeletingSubtreeDeletesLayers) {
// Deserialization 1.
Layer::LayerIdMap empty_dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(proto1, empty_dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(proto1, empty_dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
ASSERT_EQ(2u, layer_dest_root->children().size());
@@ -2367,13 +2390,15 @@ TEST_F(LayerTest, DeletingSubtreeDeletesLayers) {
// Deserialization 2.
Layer::LayerIdMap dest_layer_map_2;
- dest_layer_map_2[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map_2[layer_dest_a->id()] = layer_dest_a;
- dest_layer_map_2[layer_dest_b->id()] = layer_dest_b;
- layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map_2);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map_2);
+ layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map_2,
+ layer_tree_host_.get());
EXPECT_EQ(0u, layer_dest_a->children().size());
EXPECT_EQ(0u, layer_dest_b->children().size());
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerTest, DeleteMaskAndReplicaLayer) {
@@ -2390,7 +2415,8 @@ TEST_F(LayerTest, DeleteMaskAndReplicaLayer) {
// Deserialization 1.
Layer::LayerIdMap dest_layer_map;
scoped_refptr<Layer> layer_dest_root = Layer::Create();
- layer_dest_root->FromLayerNodeProto(proto1, dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(proto1, dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
ASSERT_TRUE(layer_dest_root->mask_layer());
@@ -2401,13 +2427,6 @@ TEST_F(LayerTest, DeleteMaskAndReplicaLayer) {
EXPECT_EQ(layer_src_root->replica_layer()->id(),
layer_dest_root->replica_layer()->id());
- // Store the newly constructed layer structure in the id map.
- dest_layer_map[layer_dest_root->id()] = layer_dest_root;
- dest_layer_map[layer_dest_root->mask_layer()->id()] =
- layer_dest_root->mask_layer();
- dest_layer_map[layer_dest_root->replica_layer()->id()] =
- layer_dest_root->replica_layer();
-
// Clear mask and replica layers.
layer_src_root->mask_layer()->RemoveFromParent();
layer_src_root->replica_layer()->RemoveFromParent();
@@ -2417,10 +2436,15 @@ TEST_F(LayerTest, DeleteMaskAndReplicaLayer) {
layer_src_root->ToLayerNodeProto(&proto2);
// Deserialization 2.
- layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map);
+ layer_dest_root->ClearLayerTreePropertiesForDeserializationAndAddToMap(
+ &dest_layer_map);
+ layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map,
+ layer_tree_host_.get());
EXPECT_EQ(nullptr, layer_dest_root->mask_layer());
EXPECT_EQ(nullptr, layer_dest_root->replica_layer());
+
+ layer_dest_root->SetLayerTreeHost(nullptr);
}
TEST_F(LayerSerializationTest, HierarchyDeserializationWithLayerTreeHost) {