diff options
Diffstat (limited to 'chromium/cc/layers/layer_impl_unittest.cc')
-rw-r--r-- | chromium/cc/layers/layer_impl_unittest.cc | 416 |
1 files changed, 156 insertions, 260 deletions
diff --git a/chromium/cc/layers/layer_impl_unittest.cc b/chromium/cc/layers/layer_impl_unittest.cc index 4dc4d5b24af..8de7247dd7b 100644 --- a/chromium/cc/layers/layer_impl_unittest.cc +++ b/chromium/cc/layers/layer_impl_unittest.cc @@ -10,11 +10,8 @@ #include "cc/paint/filter_operation.h" #include "cc/paint/filter_operations.h" #include "cc/test/animation_test_common.h" -#include "cc/test/fake_impl_task_runner_provider.h" -#include "cc/test/fake_layer_tree_frame_sink.h" -#include "cc/test/fake_layer_tree_host_impl.h" #include "cc/test/geometry_test_utils.h" -#include "cc/test/test_task_graph_runner.h" +#include "cc/test/layer_tree_impl_test_base.h" #include "cc/trees/layer_tree_impl.h" #include "cc/trees/single_thread_proxy.h" #include "cc/trees/tree_synchronizer.h" @@ -55,19 +52,19 @@ namespace { EXPECT_FALSE(child->LayerPropertyChanged()); \ EXPECT_FALSE(grand_child->LayerPropertyChanged()); -#define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ - root->layer_tree_impl()->ResetAllChangeTracking(); \ - host_impl.ForcePrepareToDraw(); \ - EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \ - code_to_test; \ - EXPECT_TRUE(host_impl.active_tree()->needs_update_draw_properties()); +#define VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ + root->layer_tree_impl()->ResetAllChangeTracking(); \ + host_impl()->ForcePrepareToDraw(); \ + EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties()); \ + code_to_test; \ + EXPECT_TRUE(host_impl()->active_tree()->needs_update_draw_properties()); -#define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ - root->layer_tree_impl()->ResetAllChangeTracking(); \ - host_impl.ForcePrepareToDraw(); \ - EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); \ - code_to_test; \ - EXPECT_FALSE(host_impl.active_tree()->needs_update_draw_properties()); +#define VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(code_to_test) \ + root->layer_tree_impl()->ResetAllChangeTracking(); \ + host_impl()->ForcePrepareToDraw(); \ + EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties()); \ + code_to_test; \ + EXPECT_FALSE(host_impl()->active_tree()->needs_update_draw_properties()); static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) { gfx::ScrollOffset delta = layer_impl->layer_tree_impl() @@ -77,39 +74,32 @@ static gfx::Vector2dF ScrollDelta(LayerImpl* layer_impl) { return gfx::Vector2dF(delta.x(), delta.y()); } -TEST(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) { +class LayerImplTest : public LayerTreeImplTestBase, public ::testing::Test { + public: + using LayerTreeImplTestBase::LayerTreeImplTestBase; +}; + +TEST_F(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) { // // This test checks that LayerPropertyChanged() has the correct behavior. // // The constructor on this will fake that we are on the correct thread. // Create a simple LayerImpl tree: - FakeImplTaskRunnerProvider task_runner_provider; - TestTaskGraphRunner task_graph_runner; - std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink = - FakeLayerTreeFrameSink::Create3d(); - FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner); - host_impl.SetVisible(true); - EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get())); - host_impl.CreatePendingTree(); - std::unique_ptr<LayerImpl> root_ptr = - LayerImpl::Create(host_impl.pending_tree(), 2); - LayerImpl* root = root_ptr.get(); - host_impl.pending_tree()->SetRootLayerForTesting(std::move(root_ptr)); - - root->test_properties()->force_render_surface = true; + host_impl()->CreatePendingTree(); + LayerImpl* root = EnsureRootLayerInPendingTree(); root->SetMasksToBounds(true); + CreateClipNode(root); root->layer_tree_impl()->ResetAllChangeTracking(); - root->test_properties()->AddChild( - LayerImpl::Create(host_impl.pending_tree(), 7)); - LayerImpl* child = root->test_properties()->children[0]; - child->test_properties()->AddChild( - LayerImpl::Create(host_impl.pending_tree(), 8)); - LayerImpl* grand_child = child->test_properties()->children[0]; - host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting(); + LayerImpl* child = AddLayerInPendingTree<LayerImpl>(); + CopyProperties(root, child); + LayerImpl* grand_child = AddLayerInPendingTree<LayerImpl>(); + CopyProperties(child, grand_child); - // Adding children is an internal operation and should not mark layers as + UpdatePendingTreeDrawProperties(); + + // Creating children is an internal operation and should not mark layers as // changed. EXPECT_FALSE(root->LayerPropertyChanged()); EXPECT_FALSE(child->LayerPropertyChanged()); @@ -131,20 +121,21 @@ TEST(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) { EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE( root->SetUpdateRect(arbitrary_rect)); EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetBounds(arbitrary_size)); - host_impl.pending_tree()->property_trees()->needs_rebuild = true; - host_impl.pending_tree()->BuildLayerListAndPropertyTreesForTesting(); + UpdatePendingTreeDrawProperties(); // Changing these properties affects the entire subtree of layers. - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(host_impl.pending_tree()->SetFilterMutated( - root->element_id(), arbitrary_filters)); - EXECUTE_AND_VERIFY_SUBTREE_CHANGED(host_impl.pending_tree()->SetFilterMutated( - root->element_id(), FilterOperations())); EXECUTE_AND_VERIFY_SUBTREE_CHANGED( - host_impl.pending_tree()->SetOpacityMutated(root->element_id(), - arbitrary_number)); + host_impl()->pending_tree()->SetFilterMutated(root->element_id(), + arbitrary_filters)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGED( + host_impl()->pending_tree()->SetFilterMutated(root->element_id(), + FilterOperations())); EXECUTE_AND_VERIFY_SUBTREE_CHANGED( - host_impl.pending_tree()->SetTransformMutated(root->element_id(), - arbitrary_transform)); + host_impl()->pending_tree()->SetOpacityMutated(root->element_id(), + arbitrary_number)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGED( + host_impl()->pending_tree()->SetTransformMutated(root->element_id(), + arbitrary_transform)); // Changing these properties only affects the layer itself. EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->SetDrawsContent(true)); @@ -163,105 +154,21 @@ TEST(LayerImplTest, VerifyPendingLayerChangesAreTrackedProperly) { EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->SetBounds(root->bounds())); } -TEST(LayerImplTest, VerifyActiveLayerChangesAreTrackedProperly) { - FakeImplTaskRunnerProvider task_runner_provider; - TestTaskGraphRunner task_graph_runner; - std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink = - FakeLayerTreeFrameSink::Create3d(); - FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner); - host_impl.SetVisible(true); - EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get())); - std::unique_ptr<LayerImpl> root_ptr = - LayerImpl::Create(host_impl.active_tree(), 2); - LayerImpl* root = root_ptr.get(); - host_impl.active_tree()->SetRootLayerForTesting(std::move(root_ptr)); - - root->test_properties()->AddChild( - LayerImpl::Create(host_impl.active_tree(), 7)); - LayerImpl* child = root->test_properties()->children[0]; - root->SetScrollable(gfx::Size(100, 100)); - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - - // Make root the outer viewport container layer. This ensures the later call - // to |SetViewportBoundsDelta| will be on a viewport layer. - LayerTreeImpl::ViewportLayerIds viewport_ids; - viewport_ids.outer_viewport_container = root->id(); - host_impl.active_tree()->SetViewportLayersFromIds(viewport_ids); - - root->SetMasksToBounds(true); - host_impl.active_tree()->property_trees()->needs_rebuild = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - root->layer_tree_impl()->ResetAllChangeTracking(); - - // SetViewportBoundsDelta changes subtree only when masks_to_bounds is true. - root->SetViewportBoundsDelta(gfx::Vector2d(222, 333)); - EXPECT_TRUE(root->LayerPropertyChanged()); - EXPECT_TRUE(root->LayerPropertyChangedFromPropertyTrees()); - EXPECT_FALSE(root->LayerPropertyChangedNotFromPropertyTrees()); - EXPECT_TRUE(host_impl.active_tree()->property_trees()->full_tree_damaged); - - root->SetMasksToBounds(false); - host_impl.active_tree()->property_trees()->needs_rebuild = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - root->layer_tree_impl()->ResetAllChangeTracking(); - - // SetViewportBoundsDelta does not change the subtree without masks_to_bounds. - root->SetViewportBoundsDelta(gfx::Vector2d(333, 444)); - EXPECT_TRUE(root->LayerPropertyChanged()); - EXPECT_FALSE(root->LayerPropertyChangedFromPropertyTrees()); - EXPECT_TRUE(root->LayerPropertyChangedNotFromPropertyTrees()); - EXPECT_FALSE(host_impl.active_tree()->property_trees()->full_tree_damaged); - - host_impl.active_tree()->property_trees()->needs_rebuild = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - root->layer_tree_impl()->ResetAllChangeTracking(); - - // Ensure some node is affected by the outer viewport bounds delta. This - // ensures the later call to |SetViewportBoundsDelta| will require a - // transform tree update. - TransformTree& transform_tree = - host_impl.active_tree()->property_trees()->transform_tree; - transform_tree.AddNodeAffectedByOuterViewportBoundsDelta( - child->transform_tree_index()); - EXPECT_FALSE(transform_tree.needs_update()); - root->SetViewportBoundsDelta(gfx::Vector2d(111, 222)); - EXPECT_TRUE(transform_tree.needs_update()); - - host_impl.active_tree()->property_trees()->needs_rebuild = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - root->layer_tree_impl()->ResetAllChangeTracking(); +TEST_F(LayerImplTest, VerifyNeedsUpdateDrawProperties) { + LayerImpl* root = root_layer(); + LayerImpl* layer = AddLayer<LayerImpl>(); + layer->SetBounds(gfx::Size(100, 100)); + layer->SetScrollable(gfx::Size(1, 1)); + LayerImpl* layer2 = AddLayer<LayerImpl>(); + SetElementIdsForTesting(); - // Ensure scrolling changes the transform tree but does not damage all trees. - root->ScrollBy(gfx::Vector2d(7, 9)); - EXPECT_TRUE(transform_tree.needs_update()); - EXPECT_TRUE(root->LayerPropertyChanged()); - EXPECT_TRUE(root->LayerPropertyChangedFromPropertyTrees()); - EXPECT_FALSE(root->LayerPropertyChangedNotFromPropertyTrees()); - EXPECT_FALSE(host_impl.active_tree()->property_trees()->full_tree_damaged); -} + CopyProperties(root, layer); + CreateTransformNode(layer); + CreateScrollNode(layer); + CopyProperties(root, layer2); -TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { - FakeImplTaskRunnerProvider task_runner_provider; - TestTaskGraphRunner task_graph_runner; - std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink = - FakeLayerTreeFrameSink::Create3d(); - FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner); - host_impl.SetVisible(true); - EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get())); - host_impl.active_tree()->SetRootLayerForTesting( - LayerImpl::Create(host_impl.active_tree(), 1)); - LayerImpl* root = host_impl.active_tree()->root_layer_for_testing(); - std::unique_ptr<LayerImpl> layer_ptr = - LayerImpl::Create(host_impl.active_tree(), 2); - LayerImpl* layer = layer_ptr.get(); - root->test_properties()->AddChild(std::move(layer_ptr)); - layer->SetScrollable(gfx::Size(1, 1)); - std::unique_ptr<LayerImpl> layer2_ptr = - LayerImpl::Create(host_impl.active_tree(), 3); - LayerImpl* layer2 = layer2_ptr.get(); - root->test_properties()->AddChild(std::move(layer2_ptr)); - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - DCHECK(host_impl.CanDraw()); + DCHECK(host_impl()->CanDraw()); + UpdateActiveTreeDrawProperties(); float arbitrary_number = 0.352f; gfx::Size arbitrary_size = gfx::Size(111, 222); @@ -280,26 +187,29 @@ TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { // Create a render surface, because we must have a render surface if we have // filters. - layer->test_properties()->force_render_surface = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); + CreateEffectNode(layer).render_surface_reason = RenderSurfaceReason::kTest; + UpdateActiveTreeDrawProperties(); // Related filter functions. - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated( - root->element_id(), arbitrary_filters)); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( + host_impl()->active_tree()->SetFilterMutated(root->element_id(), + arbitrary_filters)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( - host_impl.active_tree()->SetFilterMutated(root->element_id(), - arbitrary_filters)); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated( - root->element_id(), FilterOperations())); - VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(host_impl.active_tree()->SetFilterMutated( - root->element_id(), arbitrary_filters)); + host_impl()->active_tree()->SetFilterMutated(root->element_id(), + arbitrary_filters)); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( + host_impl()->active_tree()->SetFilterMutated(root->element_id(), + FilterOperations())); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( + host_impl()->active_tree()->SetFilterMutated(root->element_id(), + arbitrary_filters)); // Related scrolling functions. VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(large_size)); - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - host_impl.active_tree()->set_needs_update_draw_properties(); - host_impl.active_tree()->UpdateDrawProperties(); + host_impl()->active_tree()->set_needs_update_draw_properties(); + UpdateActiveTreeDrawProperties(); + VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(arbitrary_vector2d)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->ScrollBy(gfx::Vector2d())); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( @@ -314,30 +224,30 @@ TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { gfx::ScrollOffset(arbitrary_vector2d.x(), arbitrary_vector2d.y()))); // Unrelated functions, always set to new values, always set needs update. - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - host_impl.active_tree()->set_needs_update_draw_properties(); - host_impl.active_tree()->UpdateDrawProperties(); + host_impl()->active_tree()->set_needs_update_draw_properties(); + UpdateActiveTreeDrawProperties(); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true); layer->NoteLayerPropertyChanged()); + CreateClipNode(layer); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true); layer->NoteLayerPropertyChanged()); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( layer->SetBackgroundColor(arbitrary_color)); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( - host_impl.active_tree()->SetOpacityMutated(layer->element_id(), - arbitrary_number)); + host_impl()->active_tree()->SetOpacityMutated(layer->element_id(), + arbitrary_number)); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES( - host_impl.active_tree()->SetTransformMutated(layer->element_id(), - arbitrary_transform)); + host_impl()->active_tree()->SetTransformMutated(layer->element_id(), + arbitrary_transform)); VERIFY_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetBounds(arbitrary_size); layer->NoteLayerPropertyChanged()); // Unrelated functions, set to the same values, no needs update. - layer->test_properties()->filters = arbitrary_filters; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); + GetEffectNode(layer)->filters = arbitrary_filters; + UpdateActiveTreeDrawProperties(); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES( - host_impl.active_tree()->SetFilterMutated(layer->element_id(), - arbitrary_filters)); + host_impl()->active_tree()->SetFilterMutated(layer->element_id(), + arbitrary_filters)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetMasksToBounds(true)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetContentsOpaque(true)); VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetDrawsContent(true)); @@ -347,58 +257,10 @@ TEST(LayerImplTest, VerifyNeedsUpdateDrawProperties) { VERIFY_NO_NEEDS_UPDATE_DRAW_PROPERTIES(layer->SetElementId(ElementId(2))); } -TEST(LayerImplTest, SafeOpaqueBackgroundColor) { - FakeImplTaskRunnerProvider task_runner_provider; - TestTaskGraphRunner task_graph_runner; - std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink = - FakeLayerTreeFrameSink::Create3d(); - FakeLayerTreeHostImpl host_impl(&task_runner_provider, &task_graph_runner); - host_impl.SetVisible(true); - EXPECT_TRUE(host_impl.InitializeFrameSink(layer_tree_frame_sink.get())); - host_impl.active_tree()->SetRootLayerForTesting( - LayerImpl::Create(host_impl.active_tree(), 1)); - LayerImpl* layer = host_impl.active_tree()->root_layer_for_testing(); - - 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); - host_impl.active_tree()->set_background_color( - host_opaque ? SK_ColorRED : SK_ColorTRANSPARENT); - host_impl.active_tree()->property_trees()->needs_rebuild = true; - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); - - 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"; - } - } - } - } -} - -TEST(LayerImplTest, PerspectiveTransformHasReasonableScale) { - FakeImplTaskRunnerProvider task_runner_provider; - TestTaskGraphRunner task_graph_runner; - std::unique_ptr<LayerTreeFrameSink> layer_tree_frame_sink = - FakeLayerTreeFrameSink::Create3d(); - LayerTreeSettings settings; - FakeLayerTreeHostImpl host_impl(settings, &task_runner_provider, - &task_graph_runner); - auto owned_layer = LayerImpl::Create(host_impl.active_tree(), 1); - LayerImpl* layer = owned_layer.get(); +TEST_F(LayerImplTest, PerspectiveTransformHasReasonableScale) { + LayerImpl* layer = root_layer(); layer->SetBounds(gfx::Size(10, 10)); layer->set_contributes_to_drawn_render_surface(true); - host_impl.active_tree()->SetRootLayerForTesting(std::move(owned_layer)); - host_impl.active_tree()->BuildLayerListAndPropertyTreesForTesting(); // Ensure that we are close to the maximum scale for the matrix. { @@ -443,50 +305,36 @@ TEST(LayerImplTest, PerspectiveTransformHasReasonableScale) { } } -class LayerImplScrollTest : public testing::Test { +class LayerImplScrollTest : public LayerImplTest { public: - LayerImplScrollTest() : LayerImplScrollTest(LayerTreeSettings()) {} + LayerImplScrollTest() : LayerImplScrollTest(LayerListSettings()) {} explicit LayerImplScrollTest(const LayerTreeSettings& settings) - : host_impl_(settings, &task_runner_provider_, &task_graph_runner_), - root_id_(7) { - host_impl_.active_tree()->SetRootLayerForTesting( - LayerImpl::Create(host_impl_.active_tree(), root_id_)); - host_impl_.active_tree() - ->root_layer_for_testing() - ->test_properties() - ->AddChild(LayerImpl::Create(host_impl_.active_tree(), root_id_ + 1)); + : LayerImplTest(settings) { + LayerImpl* root = root_layer(); + root->SetBounds(gfx::Size(1, 1)); + + layer_ = AddLayer<LayerImpl>(); + SetElementIdsForTesting(); // Set the max scroll offset by noting that the root layer has bounds (1,1), // thus whatever bounds are set for the layer will be the max scroll // offset plus 1 in each direction. - host_impl_.active_tree()->root_layer_for_testing()->SetBounds( - gfx::Size(1, 1)); - layer()->SetScrollable(gfx::Size(1, 1)); - gfx::Vector2d max_scroll_offset(51, 81); - layer()->SetBounds(gfx::Size(max_scroll_offset.x(), max_scroll_offset.y())); - host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting(); + layer_->SetScrollable(gfx::Size(1, 1)); + layer_->SetBounds(gfx::Size(51, 81)); + CopyProperties(root, layer_); + CreateTransformNode(layer_); + CreateScrollNode(layer_); + UpdateActiveTreeDrawProperties(); } - LayerImpl* layer() { - return host_impl_.active_tree() - ->root_layer_for_testing() - ->test_properties() - ->children[0]; - } + LayerImpl* layer() { return layer_; } ScrollTree* scroll_tree(LayerImpl* layer_impl) { return &layer_impl->layer_tree_impl()->property_trees()->scroll_tree; } - LayerTreeHostImpl& host_impl() { return host_impl_; } - - LayerTreeImpl* tree() { return host_impl_.active_tree(); } - private: - FakeImplTaskRunnerProvider task_runner_provider_; - TestTaskGraphRunner task_graph_runner_; - FakeLayerTreeHostImpl host_impl_; - int root_id_; + LayerImpl* layer_; }; class CommitToPendingTreeLayerImplScrollTest : public LayerImplScrollTest { @@ -494,9 +342,9 @@ class CommitToPendingTreeLayerImplScrollTest : public LayerImplScrollTest { CommitToPendingTreeLayerImplScrollTest() : LayerImplScrollTest(settings()) {} LayerTreeSettings settings() { - LayerTreeSettings tree_settings; - tree_settings.commit_to_active_tree = false; - return tree_settings; + LayerListSettings settings; + settings.commit_to_active_tree = false; + return settings; } }; @@ -592,9 +440,8 @@ TEST_F(LayerImplScrollTest, ScrollUserUnscrollableLayer) { gfx::ScrollOffset scroll_offset(10, 5); gfx::Vector2dF scroll_delta(20.5f, 8.5f); - layer()->test_properties()->user_scrollable_vertical = false; - layer()->layer_tree_impl()->property_trees()->needs_rebuild = true; - layer()->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting(); + GetScrollNode(layer())->user_scrollable_vertical = false; + UpdateDrawProperties(layer()->layer_tree_impl()); scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->element_id(), scroll_offset); gfx::Vector2dF unscrolled = layer()->ScrollBy(scroll_delta); @@ -606,9 +453,9 @@ TEST_F(LayerImplScrollTest, ScrollUserUnscrollableLayer) { // |LayerImpl::all_touch_action_regions_| is a cache of all regions on // |LayerImpl::touch_action_region_| and must be invalidated on changes. TEST_F(LayerImplScrollTest, TouchActionRegionCacheInvalidation) { - host_impl().CreatePendingTree(); + host_impl()->CreatePendingTree(); std::unique_ptr<LayerImpl> pending_layer = - LayerImpl::Create(host_impl().pending_tree(), 2); + LayerImpl::Create(host_impl()->pending_tree(), 2); TouchActionRegion region; region.Union(kTouchActionNone, gfx::Rect(0, 0, 50, 50)); @@ -633,7 +480,7 @@ TEST_F(CommitToPendingTreeLayerImplScrollTest, gfx::ScrollOffset scroll_offset(10, 5); gfx::Vector2dF scroll_delta(12, 18); - host_impl().CreatePendingTree(); + host_impl()->CreatePendingTree(); scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->element_id(), scroll_offset); @@ -645,7 +492,7 @@ TEST_F(CommitToPendingTreeLayerImplScrollTest, scroll_tree(layer())->CollectScrollDeltasForTesting(); std::unique_ptr<LayerImpl> pending_layer = - LayerImpl::Create(host_impl().sync_tree(), layer()->id()); + LayerImpl::Create(host_impl()->sync_tree(), layer()->id()); pending_layer->SetElementId( LayerIdToElementIdForTesting(pending_layer->id())); scroll_tree(pending_layer.get()) @@ -659,5 +506,54 @@ TEST_F(CommitToPendingTreeLayerImplScrollTest, pending_layer->CurrentScrollOffset()); } +TEST_F(LayerImplTest, JitterTest) { + host_impl()->CreatePendingTree(); + auto* root_layer = EnsureRootLayerInPendingTree(); + root_layer->SetBounds(gfx::Size(50, 50)); + SetupViewport(root_layer, gfx::Size(100, 100), gfx::Size(100, 100)); + auto* scroll_layer = + host_impl()->pending_tree()->InnerViewportScrollLayerForTesting(); + auto* content_layer = AddLayerInPendingTree<LayerImpl>(); + content_layer->SetBounds(gfx::Size(100, 100)); + content_layer->SetDrawsContent(true); + CopyProperties( + host_impl()->pending_tree()->OuterViewportScrollLayerForTesting(), + content_layer); + UpdatePendingTreeDrawProperties(); + + host_impl()->pending_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); + const int scroll = 5; + int accumulated_scroll = 0; + for (int i = 0; i < LayerTreeImpl::kFixedPointHitsThreshold + 1; ++i) { + host_impl()->ActivateSyncTree(); + accumulated_scroll += scroll; + SetScrollOffset( + host_impl()->active_tree()->InnerViewportScrollLayerForTesting(), + gfx::ScrollOffset(0, accumulated_scroll)); + UpdateActiveTreeDrawProperties(); + + host_impl()->CreatePendingTree(); + LayerTreeImpl* pending_tree = host_impl()->pending_tree(); + pending_tree->set_source_frame_number(i + 1); + pending_tree->PushPageScaleFromMainThread(1.f, 1.f, 1.f); + // Simulate scroll offset pushed from the main thread. + SetScrollOffset(scroll_layer, gfx::ScrollOffset(0, accumulated_scroll)); + // The scroll done on the active tree is undone on the pending tree. + content_layer->SetOffsetToTransformParent( + gfx::Vector2dF(0, accumulated_scroll)); + content_layer->SetNeedsPushProperties(); + UpdateDrawProperties(pending_tree); + + float jitter = content_layer->CalculateJitter(); + // There should not be any jitter measured till we hit the fixed point hits + // threshold. 250 is sqrt(50 * 50) * 5. 50x50 is the visible bounds of + // content (clipped by the viewport). 5 is the distance between the + // locations of the content in the pending tree and the active tree. + float expected_jitter = + (i == pending_tree->kFixedPointHitsThreshold) ? 250 : 0; + EXPECT_EQ(jitter, expected_jitter); + } +} + } // namespace } // namespace cc |