Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: cc/layers/layer_unittest.cc

Issue 1398443008: Add support for (de)serializing cc::Layer hierarchy. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@review-1394353002
Patch Set: Fixed CC_EXPORT Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/layer.h" 5 #include "cc/layers/layer.h"
6 6
7 #include "base/thread_task_runner_handle.h" 7 #include "base/thread_task_runner_handle.h"
8 #include "cc/animation/keyframed_animation_curve.h" 8 #include "cc/animation/keyframed_animation_curve.h"
9 #include "cc/base/math_util.h" 9 #include "cc/base/math_util.h"
10 #include "cc/layers/layer_impl.h" 10 #include "cc/layers/layer_impl.h"
11 #include "cc/output/copy_output_request.h" 11 #include "cc/output/copy_output_request.h"
12 #include "cc/output/copy_output_result.h" 12 #include "cc/output/copy_output_result.h"
13 #include "cc/proto/layer.pb.h"
13 #include "cc/test/animation_test_common.h" 14 #include "cc/test/animation_test_common.h"
14 #include "cc/test/fake_impl_proxy.h" 15 #include "cc/test/fake_impl_proxy.h"
15 #include "cc/test/fake_layer_tree_host_client.h" 16 #include "cc/test/fake_layer_tree_host_client.h"
16 #include "cc/test/fake_layer_tree_host_impl.h" 17 #include "cc/test/fake_layer_tree_host_impl.h"
17 #include "cc/test/geometry_test_utils.h" 18 #include "cc/test/geometry_test_utils.h"
18 #include "cc/test/layer_test_common.h" 19 #include "cc/test/layer_test_common.h"
19 #include "cc/test/test_gpu_memory_buffer_manager.h" 20 #include "cc/test/test_gpu_memory_buffer_manager.h"
20 #include "cc/test/test_shared_bitmap_manager.h" 21 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "cc/test/test_task_graph_runner.h" 22 #include "cc/test/test_task_graph_runner.h"
22 #include "cc/trees/layer_tree_host.h" 23 #include "cc/trees/layer_tree_host.h"
(...skipping 1317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 layer->OnTransformAnimated(transform); 1341 layer->OnTransformAnimated(transform);
1341 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); 1342 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
1342 1343
1343 // Scroll offset animation should not schedule a layer update since it is 1344 // Scroll offset animation should not schedule a layer update since it is
1344 // handled similarly to normal compositor scroll updates. 1345 // handled similarly to normal compositor scroll updates.
1345 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(0); 1346 EXPECT_CALL(*layer_tree_host_, SetNeedsUpdateLayers()).Times(0);
1346 layer->OnScrollOffsetAnimated(gfx::ScrollOffset(10, 10)); 1347 layer->OnScrollOffsetAnimated(gfx::ScrollOffset(10, 10));
1347 Mock::VerifyAndClearExpectations(layer_tree_host_.get()); 1348 Mock::VerifyAndClearExpectations(layer_tree_host_.get());
1348 } 1349 }
1349 1350
1351 TEST_F(LayerTest, RecursiveHierarchySerialization) {
1352 // Testing serialization and deserialization of a tree that looks like this:
1353 // root
1354 // / \
1355 // a b
1356 // \
1357 // c
1358 // Layer c also has a mask layer and a replica layer.
1359 scoped_refptr<Layer> layer_src_root = Layer::Create(LayerSettings());
1360 scoped_refptr<Layer> layer_src_a = Layer::Create(LayerSettings());
1361 scoped_refptr<Layer> layer_src_b = Layer::Create(LayerSettings());
1362 scoped_refptr<Layer> layer_src_c = Layer::Create(LayerSettings());
1363 scoped_refptr<Layer> layer_src_c_mask = Layer::Create(LayerSettings());
1364 scoped_refptr<Layer> layer_src_c_replica = Layer::Create(LayerSettings());
1365 layer_src_root->AddChild(layer_src_a);
1366 layer_src_root->AddChild(layer_src_b);
1367 layer_src_b->AddChild(layer_src_c);
1368 layer_src_c->SetMaskLayer(layer_src_c_mask.get());
1369 layer_src_c->SetReplicaLayer(layer_src_c_replica.get());
1370
1371 proto::LayerNode proto;
1372 layer_src_root->ToLayerNodeProto(&proto);
1373
1374 Layer::LayerIdMap empty_dest_layer_map;
1375 scoped_refptr<Layer> layer_dest_root = Layer::Create(LayerSettings());
1376 layer_dest_root->FromLayerNodeProto(proto, empty_dest_layer_map);
1377
1378 EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
1379 EXPECT_EQ(nullptr, layer_dest_root->parent());
1380 ASSERT_EQ(2UL, layer_dest_root->children().size());
vmpstr 2015/10/21 22:34:14 nit: we just usually lower case u, like 2u
nyquist 2015/10/23 00:12:31 Done.
1381
1382 scoped_refptr<Layer> layer_dest_a = layer_dest_root->children()[0];
1383 EXPECT_EQ(layer_src_a->id(), layer_dest_a->id());
1384 EXPECT_EQ(layer_src_root->id(), layer_dest_a->parent()->id());
1385 EXPECT_EQ(0UL, layer_dest_a->children().size());
1386
1387 scoped_refptr<Layer> layer_dest_b = layer_dest_root->children()[1];
1388 EXPECT_EQ(layer_src_b->id(), layer_dest_b->id());
1389 EXPECT_EQ(layer_src_root->id(), layer_dest_b->parent()->id());
1390 ASSERT_EQ(1UL, layer_dest_b->children().size());
1391
1392 scoped_refptr<Layer> layer_dest_c = layer_dest_b->children()[0];
1393 EXPECT_EQ(layer_src_c->id(), layer_dest_c->id());
1394 EXPECT_EQ(layer_src_b->id(), layer_dest_c->parent()->id());
1395 EXPECT_EQ(0UL, layer_dest_c->children().size());
1396 EXPECT_EQ(layer_src_c_mask->id(), layer_dest_c->mask_layer()->id());
1397 EXPECT_EQ(layer_src_c_replica->id(), layer_dest_c->replica_layer()->id());
1398 }
1399
1400 TEST_F(LayerTest, RecursiveHierarchySerializationWithNodeReuse) {
1401 // Testing serialization and deserialization of a tree that initially looks
1402 // like this:
1403 // root
1404 // /
1405 // a
1406 // The source tree is then updated by adding layer |b|:
1407 // root
1408 // / \
1409 // a b
1410 // The deserialization should then re-use the Layers from last
1411 // deserialization.
1412 scoped_refptr<Layer> layer_src_root = Layer::Create(LayerSettings());
1413 scoped_refptr<Layer> layer_src_a = Layer::Create(LayerSettings());
1414 layer_src_root->AddChild(layer_src_a);
1415
1416 proto::LayerNode root_proto_1;
1417 layer_src_root->ToLayerNodeProto(&root_proto_1);
1418
1419 Layer::LayerIdMap dest_layer_map_1;
1420 scoped_refptr<Layer> layer_dest_root = Layer::Create(LayerSettings());
1421 layer_dest_root->FromLayerNodeProto(root_proto_1, dest_layer_map_1);
1422
1423 EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
1424 ASSERT_EQ(1UL, layer_dest_root->children().size());
1425 scoped_refptr<Layer> layer_dest_a_1 = layer_dest_root->children()[0];
1426 EXPECT_EQ(layer_src_a->id(), layer_dest_a_1->id());
1427
1428 // Setup new destination layer map.
1429 Layer::LayerIdMap dest_layer_map_2;
1430 dest_layer_map_2[layer_dest_root->id()] = layer_dest_root;
1431 dest_layer_map_2[layer_dest_a_1->id()] = layer_dest_a_1;
1432
1433 // Add Layer |b|.
1434 scoped_refptr<Layer> layer_src_b = Layer::Create(LayerSettings());
1435 layer_src_root->AddChild(layer_src_b);
1436
1437 // Second serialization.
1438 proto::LayerNode root_proto_2;
1439 layer_src_root->ToLayerNodeProto(&root_proto_2);
1440
1441 // Second deserialization.
1442 layer_dest_root->FromLayerNodeProto(root_proto_2, dest_layer_map_2);
1443
1444 EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
1445 ASSERT_EQ(2UL, layer_dest_root->children().size());
1446
1447 scoped_refptr<Layer> layer_dest_a_2 = layer_dest_root->children()[0];
1448 EXPECT_EQ(layer_src_a->id(), layer_dest_a_2->id());
1449 EXPECT_EQ(layer_src_root->id(), layer_dest_a_2->parent()->id());
1450 EXPECT_EQ(0UL, layer_dest_a_2->children().size());
1451
1452 scoped_refptr<Layer> layer_dest_b_2 = layer_dest_root->children()[1];
1453 EXPECT_EQ(layer_src_b->id(), layer_dest_b_2->id());
1454 EXPECT_EQ(layer_src_root->id(), layer_dest_b_2->parent()->id());
1455 EXPECT_EQ(0UL, layer_dest_b_2->children().size());
1456
1457 // Layer |a| should be the same.
1458 EXPECT_EQ(layer_dest_a_1.get(), layer_dest_a_2.get());
1459 }
1460
1461 TEST_F(LayerTest, DeletingSubtreeDeletesLayers) {
1462 // Testing serialization and deserialization of a tree that initially
1463 // looks like this:
1464 // root
1465 // / \
1466 // a b
1467 // \
1468 // c
1469 // \
1470 // d
1471 // Then the subtree rooted at node |b| is deleted in the next update.
1472 scoped_refptr<Layer> layer_src_root = Layer::Create(LayerSettings());
1473 scoped_refptr<Layer> layer_src_a = Layer::Create(LayerSettings());
1474 scoped_refptr<Layer> layer_src_b = Layer::Create(LayerSettings());
1475 scoped_refptr<Layer> layer_src_c = Layer::Create(LayerSettings());
1476 scoped_refptr<Layer> layer_src_d = Layer::Create(LayerSettings());
1477 layer_src_root->AddChild(layer_src_a);
1478 layer_src_root->AddChild(layer_src_b);
1479 layer_src_b->AddChild(layer_src_c);
1480 layer_src_c->AddChild(layer_src_d);
1481
1482 // Serialization 1.
1483 proto::LayerNode proto1;
1484 layer_src_root->ToLayerNodeProto(&proto1);
1485
1486 // Deserialization 1.
1487 Layer::LayerIdMap empty_dest_layer_map;
1488 scoped_refptr<Layer> layer_dest_root = Layer::Create(LayerSettings());
1489 layer_dest_root->FromLayerNodeProto(proto1, empty_dest_layer_map);
1490
1491 EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
1492 ASSERT_EQ(2UL, layer_dest_root->children().size());
1493 scoped_refptr<Layer> layer_dest_a = layer_dest_root->children()[0];
1494 scoped_refptr<Layer> layer_dest_b = layer_dest_root->children()[1];
1495 ASSERT_EQ(1UL, layer_dest_b->children().size());
1496 scoped_refptr<Layer> layer_dest_c = layer_dest_b->children()[0];
1497 ASSERT_EQ(1UL, layer_dest_c->children().size());
1498 scoped_refptr<Layer> layer_dest_d = layer_dest_c->children()[0];
1499
1500 // Delete the Layer |b| subtree.
1501 layer_src_b->RemoveAllChildren();
1502
1503 // Serialization 2.
1504 proto::LayerNode proto2;
1505 layer_src_root->ToLayerNodeProto(&proto2);
1506
1507 // Deserialization 2.
1508 Layer::LayerIdMap dest_layer_map_2;
1509 dest_layer_map_2[layer_dest_root->id()] = layer_dest_root;
1510 dest_layer_map_2[layer_dest_a->id()] = layer_dest_a;
1511 dest_layer_map_2[layer_dest_b->id()] = layer_dest_b;
1512 layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map_2);
1513
1514 EXPECT_EQ(0UL, layer_dest_a->children().size());
1515 EXPECT_EQ(0UL, layer_dest_b->children().size());
1516 }
1517
1518 TEST_F(LayerTest, DeleteMaskAndReplicaLayer) {
1519 scoped_refptr<Layer> layer_src_root = Layer::Create(LayerSettings());
1520 scoped_refptr<Layer> layer_src_mask = Layer::Create(LayerSettings());
1521 scoped_refptr<Layer> layer_src_replica = Layer::Create(LayerSettings());
1522 layer_src_root->SetMaskLayer(layer_src_mask.get());
1523 layer_src_root->SetReplicaLayer(layer_src_replica.get());
1524
1525 // Serialization 1.
1526 proto::LayerNode proto1;
1527 layer_src_root->ToLayerNodeProto(&proto1);
1528
1529 // Deserialization 1.
1530 Layer::LayerIdMap dest_layer_map;
1531 scoped_refptr<Layer> layer_dest_root = Layer::Create(LayerSettings());
1532 layer_dest_root->FromLayerNodeProto(proto1, dest_layer_map);
1533
1534 EXPECT_EQ(layer_src_root->id(), layer_dest_root->id());
1535 ASSERT_TRUE(layer_dest_root->mask_layer());
1536 ASSERT_TRUE(layer_dest_root->replica_layer());
1537 EXPECT_EQ(layer_src_root->mask_layer()->id(),
1538 layer_dest_root->mask_layer()->id());
1539 EXPECT_EQ(layer_src_root->replica_layer()->id(),
1540 layer_dest_root->replica_layer()->id());
1541
1542 // Store the newly constructed layer structure in the id map.
1543 dest_layer_map[layer_dest_root->id()] = layer_dest_root;
1544 dest_layer_map[layer_dest_root->mask_layer()->id()] =
1545 layer_dest_root->mask_layer();
1546 dest_layer_map[layer_dest_root->replica_layer()->id()] =
1547 layer_dest_root->replica_layer();
1548
1549 // Clear mask and replica layers.
1550 layer_src_root->mask_layer()->RemoveFromParent();
1551 layer_src_root->replica_layer()->RemoveFromParent();
1552
1553 // Serialization 2.
1554 proto::LayerNode proto2;
1555 layer_src_root->ToLayerNodeProto(&proto2);
1556
1557 // Deserialization 2.
1558 layer_dest_root->FromLayerNodeProto(proto2, dest_layer_map);
1559
1560 EXPECT_EQ(nullptr, layer_dest_root->mask_layer());
1561 EXPECT_EQ(nullptr, layer_dest_root->replica_layer());
1562 }
1563
1350 } // namespace 1564 } // namespace
1351 } // namespace cc 1565 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698