Index: cc/trees/layer_tree_host_common_unittest.cc |
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc |
index 238c3cb28a9e30fbb9e8018d7a61a774c8ca2dec..df2b30e1f22e446b09a58272fa9b2c130fd0d12c 100644 |
--- a/cc/trees/layer_tree_host_common_unittest.cc |
+++ b/cc/trees/layer_tree_host_common_unittest.cc |
@@ -34,6 +34,7 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gfx/geometry/quad_f.h" |
+#include "ui/gfx/geometry/vector2d_conversions.h" |
#include "ui/gfx/transform.h" |
namespace cc { |
@@ -347,7 +348,7 @@ TEST_F(LayerTreeHostCommonTest, TransformsAboutScrollOffset) { |
scroll_layer->AddChild(sublayer_scoped_ptr.Pass()); |
LayerImpl* scroll_layer_raw_ptr = scroll_layer_scoped_ptr.get(); |
clip_layer->AddChild(scroll_layer_scoped_ptr.Pass()); |
- scroll_layer_raw_ptr->SetScrollOffset(kScrollOffset); |
+ scroll_layer_raw_ptr->PushScrollOffsetFromMainThread(kScrollOffset); |
scoped_ptr<LayerImpl> root(LayerImpl::Create(host_impl.active_tree(), 3)); |
SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(), |
@@ -7763,6 +7764,90 @@ TEST_F(LayerTreeHostCommonTest, ScrollCompensationWithRounding) { |
} |
} |
+TEST_F(LayerTreeHostCommonTest, |
+ ScrollCompensationMainScrollOffsetFractionalPart) { |
+ // This test verifies that a scrolling layer that has fractional scroll offset |
+ // from main doesn't move a fixed position child. |
+ // |
+ // + root |
+ // + container |
+ // + scroller |
+ // + fixed |
+ // |
+ FakeImplProxy proxy; |
+ TestSharedBitmapManager shared_bitmap_manager; |
+ FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager); |
+ host_impl.CreatePendingTree(); |
+ scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1); |
+ scoped_ptr<LayerImpl> container = |
+ LayerImpl::Create(host_impl.active_tree(), 2); |
+ LayerImpl* container_layer = container.get(); |
+ scoped_ptr<LayerImpl> scroller = |
+ LayerImpl::Create(host_impl.active_tree(), 3); |
+ LayerImpl* scroll_layer = scroller.get(); |
+ scoped_ptr<LayerImpl> fixed = LayerImpl::Create(host_impl.active_tree(), 4); |
+ LayerImpl* fixed_layer = fixed.get(); |
+ |
+ container->SetIsContainerForFixedPositionLayers(true); |
+ |
+ LayerPositionConstraint constraint; |
+ constraint.set_is_fixed_position(true); |
+ fixed->SetPositionConstraint(constraint); |
+ |
+ scroller->SetScrollClipLayer(container->id()); |
+ |
+ gfx::Transform identity_transform; |
+ gfx::Transform container_transform; |
+ container_transform.Translate3d(10.0, 20.0, 0.0); |
+ gfx::Vector2dF container_offset = container_transform.To2dTranslation(); |
+ |
+ SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(), |
+ gfx::PointF(), gfx::Size(50, 50), true, false, |
+ true); |
+ SetLayerPropertiesForTesting(container.get(), container_transform, |
+ gfx::Point3F(), gfx::PointF(), gfx::Size(40, 40), |
+ true, false, false); |
+ SetLayerPropertiesForTesting(scroller.get(), identity_transform, |
+ gfx::Point3F(), gfx::PointF(0.0, 0.0), |
+ gfx::Size(30, 30), true, false, false); |
+ |
+ gfx::ScrollOffset scroll_offset(3.3, 4.2); |
+ gfx::Vector2dF main_scroll_fractional_part(0.3f, 0.2f); |
+ gfx::Vector2dF scroll_delta(0.1f, 0.4f); |
+ // Blink only uses the integer part of the scroll_offset for fixed |
+ // position layer. |
+ SetLayerPropertiesForTesting(fixed.get(), identity_transform, gfx::Point3F(), |
+ gfx::PointF(3.0f, 4.0f), gfx::Size(50, 50), true, |
+ false, false); |
+ scroll_layer->PushScrollOffsetFromMainThread(scroll_offset); |
+ scroll_layer->SetScrollDelta(scroll_delta); |
+ scroll_layer->SetScrollCompensationAdjustment(main_scroll_fractional_part); |
+ |
+ scroller->AddChild(fixed.Pass()); |
+ container->AddChild(scroller.Pass()); |
+ root->AddChild(container.Pass()); |
+ |
+ LayerImplList render_surface_layer_list; |
+ LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( |
+ root.get(), root->bounds(), &render_surface_layer_list); |
+ LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ( |
+ container_layer->draw_properties().screen_space_transform, |
+ fixed_layer->draw_properties().screen_space_transform); |
+ EXPECT_VECTOR_EQ( |
+ fixed_layer->draw_properties().screen_space_transform.To2dTranslation(), |
+ container_offset); |
+ |
+ gfx::ScrollOffset effective_scroll_offset = |
+ ScrollOffsetWithDelta(scroll_offset, scroll_delta); |
+ gfx::Vector2d rounded_effective_scroll_offset = |
+ ToRoundedVector2d(ScrollOffsetToVector2dF(effective_scroll_offset)); |
+ EXPECT_VECTOR_EQ( |
+ scroll_layer->draw_properties().screen_space_transform.To2dTranslation(), |
+ container_offset - rounded_effective_scroll_offset); |
+} |
+ |
class AnimationScaleFactorTrackingLayerImpl : public LayerImpl { |
public: |
static scoped_ptr<AnimationScaleFactorTrackingLayerImpl> Create( |