summaryrefslogtreecommitdiffstats
path: root/chromium/cc/layers/layer_impl_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/layers/layer_impl_unittest.cc')
-rw-r--r--chromium/cc/layers/layer_impl_unittest.cc416
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