| 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 14 matching lines...) Expand all Loading... |
| 25 #include "cc/test/test_task_graph_runner.h" | 25 #include "cc/test/test_task_graph_runner.h" |
| 26 #include "cc/trees/effect_node.h" | 26 #include "cc/trees/effect_node.h" |
| 27 #include "cc/trees/layer_tree_host_common.h" | 27 #include "cc/trees/layer_tree_host_common.h" |
| 28 #include "cc/trees/single_thread_proxy.h" | 28 #include "cc/trees/single_thread_proxy.h" |
| 29 #include "cc/trees/task_runner_provider.h" | 29 #include "cc/trees/task_runner_provider.h" |
| 30 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
| 31 | 31 |
| 32 namespace cc { | 32 namespace cc { |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 bool AreScrollOffsetsEqual(const SyncedScrollOffset* a, |
| 36 const SyncedScrollOffset* b) { |
| 37 return a->ActiveBase() == b->ActiveBase() && |
| 38 a->PendingBase() == b->PendingBase() && a->Delta() == b->Delta() && |
| 39 a->PendingDelta().get() == b->PendingDelta().get(); |
| 40 } |
| 41 |
| 35 class MockLayerImpl : public LayerImpl { | 42 class MockLayerImpl : public LayerImpl { |
| 36 public: | 43 public: |
| 37 static std::unique_ptr<MockLayerImpl> Create(LayerTreeImpl* tree_impl, | 44 static std::unique_ptr<MockLayerImpl> Create(LayerTreeImpl* tree_impl, |
| 38 int layer_id) { | 45 int layer_id) { |
| 39 return base::WrapUnique(new MockLayerImpl(tree_impl, layer_id)); | 46 return base::WrapUnique(new MockLayerImpl(tree_impl, layer_id)); |
| 40 } | 47 } |
| 41 ~MockLayerImpl() override { | 48 ~MockLayerImpl() override { |
| 42 if (layer_impl_destruction_list_) | 49 if (layer_impl_destruction_list_) |
| 43 layer_impl_destruction_list_->push_back(id()); | 50 layer_impl_destruction_list_->push_back(id()); |
| 44 } | 51 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 } | 134 } |
| 128 | 135 |
| 129 class TreeSynchronizerTest : public testing::Test { | 136 class TreeSynchronizerTest : public testing::Test { |
| 130 protected: | 137 protected: |
| 131 TreeSynchronizerTest() | 138 TreeSynchronizerTest() |
| 132 : animation_host_(AnimationHost::CreateForTesting(ThreadInstance::MAIN)), | 139 : animation_host_(AnimationHost::CreateForTesting(ThreadInstance::MAIN)), |
| 133 host_(FakeLayerTreeHost::Create(&client_, | 140 host_(FakeLayerTreeHost::Create(&client_, |
| 134 &task_graph_runner_, | 141 &task_graph_runner_, |
| 135 animation_host_.get())) {} | 142 animation_host_.get())) {} |
| 136 | 143 |
| 137 bool is_equal(ScrollTree::ScrollOffsetMap map, | |
| 138 ScrollTree::ScrollOffsetMap other) { | |
| 139 if (map.size() != other.size()) | |
| 140 return false; | |
| 141 for (auto& map_entry : map) { | |
| 142 if (other.find(map_entry.first) == other.end()) | |
| 143 return false; | |
| 144 SyncedScrollOffset& from_map = *map_entry.second.get(); | |
| 145 SyncedScrollOffset& from_other = *other[map_entry.first].get(); | |
| 146 if (from_map.PendingBase() != from_other.PendingBase() || | |
| 147 from_map.ActiveBase() != from_other.ActiveBase() || | |
| 148 from_map.Delta() != from_other.Delta() || | |
| 149 from_map.PendingDelta().get() != from_other.PendingDelta().get()) | |
| 150 return false; | |
| 151 } | |
| 152 return true; | |
| 153 } | |
| 154 | |
| 155 FakeLayerTreeHostClient client_; | 144 FakeLayerTreeHostClient client_; |
| 156 StubLayerTreeHostSingleThreadClient single_thread_client_; | 145 StubLayerTreeHostSingleThreadClient single_thread_client_; |
| 157 TestTaskGraphRunner task_graph_runner_; | 146 TestTaskGraphRunner task_graph_runner_; |
| 158 std::unique_ptr<AnimationHost> animation_host_; | 147 std::unique_ptr<AnimationHost> animation_host_; |
| 159 std::unique_ptr<FakeLayerTreeHost> host_; | 148 std::unique_ptr<FakeLayerTreeHost> host_; |
| 160 }; | 149 }; |
| 161 | 150 |
| 162 // Attempts to synchronizes a null tree. This should not crash, and should | 151 // Attempts to synchronizes a null tree. This should not crash, and should |
| 163 // return a null tree. | 152 // return a null tree. |
| 164 TEST_F(TreeSynchronizerTest, SyncNullTree) { | 153 TEST_F(TreeSynchronizerTest, SyncNullTree) { |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 host_->CommitAndCreatePendingTree(); | 550 host_->CommitAndCreatePendingTree(); |
| 562 host_impl->ActivateSyncTree(); | 551 host_impl->ActivateSyncTree(); |
| 563 | 552 |
| 564 ExpectTreesAreIdentical(layer_tree_root.get(), | 553 ExpectTreesAreIdentical(layer_tree_root.get(), |
| 565 host_impl->active_tree()->root_layer_for_testing(), | 554 host_impl->active_tree()->root_layer_for_testing(), |
| 566 host_impl->active_tree()); | 555 host_impl->active_tree()); |
| 567 | 556 |
| 568 // After the initial commit, scroll_offset_map in scroll_tree is expected to | 557 // After the initial commit, scroll_offset_map in scroll_tree is expected to |
| 569 // have one entry for scroll_layer and one entry for transient_scroll_layer, | 558 // have one entry for scroll_layer and one entry for transient_scroll_layer, |
| 570 // the pending base and active base must be the same at this stage. | 559 // the pending base and active base must be the same at this stage. |
| 571 ScrollTree::ScrollOffsetMap scroll_offset_map; | 560 scoped_refptr<SyncedScrollOffset> scroll_layer_offset = |
| 572 scroll_offset_map[scroll_layer->id()] = new SyncedScrollOffset; | 561 new SyncedScrollOffset; |
| 573 scroll_offset_map[transient_scroll_layer->id()] = new SyncedScrollOffset; | 562 scroll_layer_offset->PushFromMainThread(scroll_layer->scroll_offset()); |
| 574 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( | 563 scroll_layer_offset->PushPendingToActive(); |
| 575 scroll_layer->scroll_offset()); | 564 EXPECT_TRUE(AreScrollOffsetsEqual( |
| 576 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); | 565 scroll_layer_offset.get(), |
| 577 scroll_offset_map[transient_scroll_layer->id()]->PushFromMainThread( | 566 host_impl->active_tree() |
| 567 ->property_trees() |
| 568 ->scroll_tree.GetSyncedScrollOffset(scroll_layer->id()))); |
| 569 |
| 570 scoped_refptr<SyncedScrollOffset> transient_scroll_layer_offset = |
| 571 new SyncedScrollOffset; |
| 572 transient_scroll_layer_offset->PushFromMainThread( |
| 578 transient_scroll_layer->scroll_offset()); | 573 transient_scroll_layer->scroll_offset()); |
| 579 scroll_offset_map[transient_scroll_layer->id()]->PushPendingToActive(); | 574 transient_scroll_layer_offset->PushPendingToActive(); |
| 580 EXPECT_TRUE( | 575 EXPECT_TRUE(AreScrollOffsetsEqual( |
| 581 is_equal(scroll_offset_map, host_impl->active_tree() | 576 transient_scroll_layer_offset.get(), |
| 582 ->property_trees() | 577 host_impl->active_tree() |
| 583 ->scroll_tree.scroll_offset_map())); | 578 ->property_trees() |
| 579 ->scroll_tree.GetSyncedScrollOffset(transient_scroll_layer->id()))); |
| 584 | 580 |
| 585 // Set ScrollOffset active delta: gfx::ScrollOffset(10, 10) | 581 // Set ScrollOffset active delta: gfx::ScrollOffset(10, 10) |
| 586 LayerImpl* scroll_layer_impl = | 582 LayerImpl* scroll_layer_impl = |
| 587 host_impl->active_tree()->LayerById(scroll_layer->id()); | 583 host_impl->active_tree()->LayerById(scroll_layer->id()); |
| 588 ScrollTree& scroll_tree = | 584 ScrollTree& scroll_tree = |
| 589 host_impl->active_tree()->property_trees()->scroll_tree; | 585 host_impl->active_tree()->property_trees()->scroll_tree; |
| 590 scroll_tree.SetScrollOffset(scroll_layer_impl->id(), | 586 scroll_tree.SetScrollOffset(scroll_layer_impl->id(), |
| 591 gfx::ScrollOffset(20, 30)); | 587 gfx::ScrollOffset(20, 30)); |
| 592 | 588 |
| 593 // Pull ScrollOffset delta for main thread, and change offset on main thread | 589 // Pull ScrollOffset delta for main thread, and change offset on main thread |
| (...skipping 12 matching lines...) Expand all Loading... |
| 606 // Make one layer unscrollable so that scroll tree topology changes | 602 // Make one layer unscrollable so that scroll tree topology changes |
| 607 transient_scroll_layer->SetScrollClipLayerId(Layer::INVALID_ID); | 603 transient_scroll_layer->SetScrollClipLayerId(Layer::INVALID_ID); |
| 608 host_->BuildPropertyTreesForTesting(); | 604 host_->BuildPropertyTreesForTesting(); |
| 609 | 605 |
| 610 host_impl->CreatePendingTree(); | 606 host_impl->CreatePendingTree(); |
| 611 host_->CommitAndCreatePendingTree(); | 607 host_->CommitAndCreatePendingTree(); |
| 612 host_impl->ActivateSyncTree(); | 608 host_impl->ActivateSyncTree(); |
| 613 | 609 |
| 614 EXPECT_EQ(scroll_layer->id(), | 610 EXPECT_EQ(scroll_layer->id(), |
| 615 host_impl->active_tree()->CurrentlyScrollingLayer()->id()); | 611 host_impl->active_tree()->CurrentlyScrollingLayer()->id()); |
| 616 scroll_offset_map.erase(transient_scroll_layer->id()); | 612 scroll_layer_offset->SetCurrent(gfx::ScrollOffset(20, 30)); |
| 617 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(20, 30)); | 613 scroll_layer_offset->PullDeltaForMainThread(); |
| 618 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread(); | 614 scroll_layer_offset->SetCurrent(gfx::ScrollOffset(40, 50)); |
| 619 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50)); | 615 scroll_layer_offset->PushFromMainThread(gfx::ScrollOffset(100, 100)); |
| 620 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( | 616 scroll_layer_offset->PushPendingToActive(); |
| 621 gfx::ScrollOffset(100, 100)); | 617 EXPECT_TRUE(AreScrollOffsetsEqual( |
| 622 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); | 618 scroll_layer_offset.get(), |
| 623 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map())); | 619 host_impl->active_tree() |
| 620 ->property_trees() |
| 621 ->scroll_tree.GetSyncedScrollOffset(scroll_layer->id()))); |
| 622 EXPECT_EQ(nullptr, host_impl->active_tree() |
| 623 ->property_trees() |
| 624 ->scroll_tree.GetSyncedScrollOffset( |
| 625 transient_scroll_layer->id())); |
| 624 } | 626 } |
| 625 | 627 |
| 626 TEST_F(TreeSynchronizerTest, RefreshPropertyTreesCachedData) { | 628 TEST_F(TreeSynchronizerTest, RefreshPropertyTreesCachedData) { |
| 627 host_->InitializeSingleThreaded(&single_thread_client_, | 629 host_->InitializeSingleThreaded(&single_thread_client_, |
| 628 base::ThreadTaskRunnerHandle::Get()); | 630 base::ThreadTaskRunnerHandle::Get()); |
| 629 LayerTreeSettings settings; | 631 LayerTreeSettings settings; |
| 630 FakeLayerTreeHostImplClient client; | 632 FakeLayerTreeHostImplClient client; |
| 631 FakeImplTaskRunnerProvider task_runner_provider; | 633 FakeImplTaskRunnerProvider task_runner_provider; |
| 632 FakeRenderingStatsInstrumentation stats_instrumentation; | 634 FakeRenderingStatsInstrumentation stats_instrumentation; |
| 633 TestTaskGraphRunner task_graph_runner; | 635 TestTaskGraphRunner task_graph_runner; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 663 host_->CommitAndCreatePendingTree(); | 665 host_->CommitAndCreatePendingTree(); |
| 664 host_impl->ActivateSyncTree(); | 666 host_impl->ActivateSyncTree(); |
| 665 EXPECT_EQ( | 667 EXPECT_EQ( |
| 666 CombinedAnimationScale(0.f, 0.f), | 668 CombinedAnimationScale(0.f, 0.f), |
| 667 host_impl->active_tree()->property_trees()->GetAnimationScales( | 669 host_impl->active_tree()->property_trees()->GetAnimationScales( |
| 668 transform_layer->transform_tree_index(), host_impl->active_tree())); | 670 transform_layer->transform_tree_index(), host_impl->active_tree())); |
| 669 } | 671 } |
| 670 | 672 |
| 671 } // namespace | 673 } // namespace |
| 672 } // namespace cc | 674 } // namespace cc |
| OLD | NEW |