| OLD | NEW |
| 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/trees/tree_synchronizer.h" | 5 #include "cc/trees/tree_synchronizer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 SCOPED_TRACE("replica_layer"); | 102 SCOPED_TRACE("replica_layer"); |
| 103 ExpectTreesAreIdentical(layer->replica_layer(), layer_impl->replica_layer(), | 103 ExpectTreesAreIdentical(layer->replica_layer(), layer_impl->replica_layer(), |
| 104 tree_impl); | 104 tree_impl); |
| 105 } | 105 } |
| 106 | 106 |
| 107 const LayerList& layer_children = layer->children(); | 107 const LayerList& layer_children = layer->children(); |
| 108 const LayerImplList& layer_impl_children = layer_impl->children(); | 108 const LayerImplList& layer_impl_children = layer_impl->children(); |
| 109 | 109 |
| 110 ASSERT_EQ(layer_children.size(), layer_impl_children.size()); | 110 ASSERT_EQ(layer_children.size(), layer_impl_children.size()); |
| 111 | 111 |
| 112 const std::set<Layer*>* layer_scroll_children = layer->scroll_children(); | 112 const Layer* layer_scroll_parent = layer->scroll_parent(); |
| 113 const std::set<LayerImpl*>* layer_impl_scroll_children = | |
| 114 layer_impl->scroll_children(); | |
| 115 | 113 |
| 116 ASSERT_EQ(!!layer_scroll_children, !!layer_impl_scroll_children); | 114 if (layer_scroll_parent) { |
| 117 | 115 ASSERT_TRUE(layer_scroll_parent->scroll_children()->find(layer) != |
| 118 if (layer_scroll_children) { | 116 layer_scroll_parent->scroll_children()->end()); |
| 119 ASSERT_EQ(layer_scroll_children->size(), | |
| 120 layer_impl_scroll_children->size()); | |
| 121 } | 117 } |
| 122 | 118 |
| 123 const Layer* layer_scroll_parent = layer->scroll_parent(); | |
| 124 const LayerImpl* layer_impl_scroll_parent = layer_impl->scroll_parent(); | |
| 125 | |
| 126 ASSERT_EQ(!!layer_scroll_parent, !!layer_impl_scroll_parent); | |
| 127 | |
| 128 if (layer_scroll_parent) { | |
| 129 ASSERT_EQ(layer_scroll_parent->id(), layer_impl_scroll_parent->id()); | |
| 130 ASSERT_TRUE(layer_scroll_parent->scroll_children()->find(layer) != | |
| 131 layer_scroll_parent->scroll_children()->end()); | |
| 132 ASSERT_TRUE(layer_impl_scroll_parent->scroll_children()->find(layer_impl) != | |
| 133 layer_impl_scroll_parent->scroll_children()->end()); | |
| 134 } | |
| 135 | |
| 136 const std::set<Layer*>* layer_clip_children = layer->clip_children(); | |
| 137 const std::set<LayerImpl*>* layer_impl_clip_children = | |
| 138 layer_impl->clip_children(); | |
| 139 | |
| 140 ASSERT_EQ(!!layer_clip_children, !!layer_impl_clip_children); | |
| 141 | |
| 142 if (layer_clip_children) | |
| 143 ASSERT_EQ(layer_clip_children->size(), layer_impl_clip_children->size()); | |
| 144 | |
| 145 const Layer* layer_clip_parent = layer->clip_parent(); | 119 const Layer* layer_clip_parent = layer->clip_parent(); |
| 146 const LayerImpl* layer_impl_clip_parent = layer_impl->clip_parent(); | |
| 147 | |
| 148 ASSERT_EQ(!!layer_clip_parent, !!layer_impl_clip_parent); | |
| 149 | 120 |
| 150 if (layer_clip_parent) { | 121 if (layer_clip_parent) { |
| 151 const std::set<LayerImpl*>* clip_children_impl = | |
| 152 layer_impl_clip_parent->clip_children(); | |
| 153 const std::set<Layer*>* clip_children = layer_clip_parent->clip_children(); | 122 const std::set<Layer*>* clip_children = layer_clip_parent->clip_children(); |
| 154 ASSERT_EQ(layer_clip_parent->id(), layer_impl_clip_parent->id()); | |
| 155 ASSERT_TRUE(clip_children->find(layer) != clip_children->end()); | 123 ASSERT_TRUE(clip_children->find(layer) != clip_children->end()); |
| 156 ASSERT_TRUE(clip_children_impl->find(layer_impl) != | |
| 157 clip_children_impl->end()); | |
| 158 } | 124 } |
| 159 | 125 |
| 160 for (size_t i = 0; i < layer_children.size(); ++i) { | 126 for (size_t i = 0; i < layer_children.size(); ++i) { |
| 161 SCOPED_TRACE(base::StringPrintf("child layer %" PRIuS, i).c_str()); | 127 SCOPED_TRACE(base::StringPrintf("child layer %" PRIuS, i).c_str()); |
| 162 ExpectTreesAreIdentical(layer_children[i].get(), layer_impl_children[i], | 128 ExpectTreesAreIdentical(layer_children[i].get(), layer_impl_children[i], |
| 163 tree_impl); | 129 tree_impl); |
| 164 } | 130 } |
| 165 } | 131 } |
| 166 | 132 |
| 167 class TreeSynchronizerTest : public testing::Test { | 133 class TreeSynchronizerTest : public testing::Test { |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 replica_layer_with_mask->SetMaskLayer(NULL); | 489 replica_layer_with_mask->SetMaskLayer(NULL); |
| 524 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | 490 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), |
| 525 host_->active_tree()); | 491 host_->active_tree()); |
| 526 layer_impl_tree_root = host_->active_tree()->root_layer(); | 492 layer_impl_tree_root = host_->active_tree()->root_layer(); |
| 527 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | 493 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, |
| 528 host_->active_tree()); | 494 host_->active_tree()); |
| 529 | 495 |
| 530 host_->active_tree()->ClearLayers(); | 496 host_->active_tree()->ClearLayers(); |
| 531 } | 497 } |
| 532 | 498 |
| 533 TEST_F(TreeSynchronizerTest, SynchronizeScrollParent) { | |
| 534 LayerTreeSettings settings; | |
| 535 FakeImplTaskRunnerProvider task_runner_provider; | |
| 536 FakeRenderingStatsInstrumentation stats_instrumentation; | |
| 537 FakeLayerTreeHostImplClient impl_client; | |
| 538 TestSharedBitmapManager shared_bitmap_manager; | |
| 539 TestTaskGraphRunner task_graph_runner; | |
| 540 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( | |
| 541 settings, &impl_client, &task_runner_provider, &stats_instrumentation, | |
| 542 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); | |
| 543 | |
| 544 scoped_refptr<Layer> layer_tree_root = Layer::Create(); | |
| 545 scoped_refptr<Layer> scroll_parent = Layer::Create(); | |
| 546 layer_tree_root->AddChild(scroll_parent); | |
| 547 layer_tree_root->AddChild(Layer::Create()); | |
| 548 layer_tree_root->AddChild(Layer::Create()); | |
| 549 | |
| 550 host_->SetRootLayer(layer_tree_root); | |
| 551 | |
| 552 // First child is the second and third child's scroll parent. | |
| 553 layer_tree_root->children()[1]->SetScrollParent(scroll_parent.get()); | |
| 554 layer_tree_root->children()[2]->SetScrollParent(scroll_parent.get()); | |
| 555 | |
| 556 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 557 host_impl->active_tree()); | |
| 558 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer(); | |
| 559 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 560 host_impl->active_tree()); | |
| 561 { | |
| 562 SCOPED_TRACE("case one"); | |
| 563 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 564 host_impl->active_tree()); | |
| 565 } | |
| 566 | |
| 567 // Remove the first scroll child. | |
| 568 layer_tree_root->children()[1]->RemoveFromParent(); | |
| 569 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 570 host_impl->active_tree()); | |
| 571 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 572 host_impl->active_tree()); | |
| 573 { | |
| 574 SCOPED_TRACE("case two"); | |
| 575 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 576 host_impl->active_tree()); | |
| 577 } | |
| 578 | |
| 579 // Add an additional scroll layer. | |
| 580 scoped_refptr<Layer> additional_scroll_child = Layer::Create(); | |
| 581 layer_tree_root->AddChild(additional_scroll_child); | |
| 582 additional_scroll_child->SetScrollParent(scroll_parent.get()); | |
| 583 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 584 host_impl->active_tree()); | |
| 585 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 586 host_impl->active_tree()); | |
| 587 { | |
| 588 SCOPED_TRACE("case three"); | |
| 589 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 590 host_impl->active_tree()); | |
| 591 } | |
| 592 } | |
| 593 | |
| 594 TEST_F(TreeSynchronizerTest, SynchronizeClipParent) { | |
| 595 LayerTreeSettings settings; | |
| 596 FakeImplTaskRunnerProvider task_runner_provider; | |
| 597 FakeRenderingStatsInstrumentation stats_instrumentation; | |
| 598 FakeLayerTreeHostImplClient impl_client; | |
| 599 TestSharedBitmapManager shared_bitmap_manager; | |
| 600 TestTaskGraphRunner task_graph_runner; | |
| 601 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( | |
| 602 settings, &impl_client, &task_runner_provider, &stats_instrumentation, | |
| 603 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); | |
| 604 | |
| 605 scoped_refptr<Layer> layer_tree_root = Layer::Create(); | |
| 606 scoped_refptr<Layer> clip_parent = Layer::Create(); | |
| 607 scoped_refptr<Layer> intervening = Layer::Create(); | |
| 608 scoped_refptr<Layer> clip_child1 = Layer::Create(); | |
| 609 scoped_refptr<Layer> clip_child2 = Layer::Create(); | |
| 610 layer_tree_root->AddChild(clip_parent); | |
| 611 clip_parent->AddChild(intervening); | |
| 612 intervening->AddChild(clip_child1); | |
| 613 intervening->AddChild(clip_child2); | |
| 614 | |
| 615 host_->SetRootLayer(layer_tree_root); | |
| 616 | |
| 617 // First child is the second and third child's scroll parent. | |
| 618 clip_child1->SetClipParent(clip_parent.get()); | |
| 619 clip_child2->SetClipParent(clip_parent.get()); | |
| 620 | |
| 621 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 622 host_impl->active_tree()); | |
| 623 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer(); | |
| 624 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 625 host_impl->active_tree()); | |
| 626 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 627 host_impl->active_tree()); | |
| 628 | |
| 629 // Remove the first clip child. | |
| 630 clip_child1->RemoveFromParent(); | |
| 631 clip_child1 = NULL; | |
| 632 | |
| 633 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 634 host_impl->active_tree()); | |
| 635 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 636 host_impl->active_tree()); | |
| 637 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 638 host_impl->active_tree()); | |
| 639 | |
| 640 // Add an additional clip child. | |
| 641 scoped_refptr<Layer> additional_clip_child = Layer::Create(); | |
| 642 intervening->AddChild(additional_clip_child); | |
| 643 additional_clip_child->SetClipParent(clip_parent.get()); | |
| 644 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 645 host_impl->active_tree()); | |
| 646 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 647 host_impl->active_tree()); | |
| 648 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 649 host_impl->active_tree()); | |
| 650 | |
| 651 // Remove the nearest clipping ancestor. | |
| 652 clip_parent->RemoveFromParent(); | |
| 653 clip_parent = NULL; | |
| 654 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), | |
| 655 host_impl->active_tree()); | |
| 656 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), | |
| 657 host_impl->active_tree()); | |
| 658 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, | |
| 659 host_impl->active_tree()); | |
| 660 | |
| 661 // The clip children should have been unhooked. | |
| 662 EXPECT_EQ(2u, intervening->children().size()); | |
| 663 EXPECT_FALSE(clip_child2->clip_parent()); | |
| 664 EXPECT_FALSE(additional_clip_child->clip_parent()); | |
| 665 } | |
| 666 | |
| 667 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) { | 499 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) { |
| 668 LayerTreeSettings settings; | 500 LayerTreeSettings settings; |
| 669 FakeLayerTreeHostImplClient client; | 501 FakeLayerTreeHostImplClient client; |
| 670 FakeImplTaskRunnerProvider task_runner_provider; | 502 FakeImplTaskRunnerProvider task_runner_provider; |
| 671 FakeRenderingStatsInstrumentation stats_instrumentation; | 503 FakeRenderingStatsInstrumentation stats_instrumentation; |
| 672 TestSharedBitmapManager shared_bitmap_manager; | 504 TestSharedBitmapManager shared_bitmap_manager; |
| 673 TestTaskGraphRunner task_graph_runner; | 505 TestTaskGraphRunner task_graph_runner; |
| 674 FakeLayerTreeHostImpl* host_impl = host_->host_impl(); | 506 FakeLayerTreeHostImpl* host_impl = host_->host_impl(); |
| 675 host_impl->CreatePendingTree(); | 507 host_impl->CreatePendingTree(); |
| 676 | 508 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 801 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread(); | 633 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread(); |
| 802 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50)); | 634 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50)); |
| 803 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( | 635 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( |
| 804 gfx::ScrollOffset(100, 100)); | 636 gfx::ScrollOffset(100, 100)); |
| 805 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); | 637 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); |
| 806 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map())); | 638 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map())); |
| 807 } | 639 } |
| 808 | 640 |
| 809 } // namespace | 641 } // namespace |
| 810 } // namespace cc | 642 } // namespace cc |
| OLD | NEW |