| Index: cc/trees/layer_tree_host_impl_unittest.cc
|
| diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
|
| index 22174b4aff7beb19cca12041c12a74897e332b65..a80419faba234dd1ea6c75196cfa575e188aeebc 100644
|
| --- a/cc/trees/layer_tree_host_impl_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_impl_unittest.cc
|
| @@ -5848,5 +5848,119 @@ TEST_F(LayerTreeHostImplWithTopControlsTest, NoIdleAnimations) {
|
| EXPECT_FALSE(did_request_redraw_);
|
| }
|
|
|
| +class LayerTreeHostImplVirtualViewportTest : public LayerTreeHostImplTest {
|
| + public:
|
| + void SetupVirtualViewportLayers(const gfx::Size& content_size,
|
| + const gfx::Size& outer_viewport,
|
| + const gfx::Size& inner_viewport) {
|
| + LayerTreeImpl* layer_tree_impl = host_impl_->active_tree();
|
| + const int kOuterViewportClipLayerId = 6;
|
| + const int kOuterViewportScrollLayerId = 7;
|
| + const int kInnerViewportScrollLayerId = 2;
|
| + const int kInnerViewportClipLayerId = 4;
|
| + const int kPageScaleLayerId = 5;
|
| +
|
| + scoped_ptr<LayerImpl> inner_scroll =
|
| + LayerImpl::Create(layer_tree_impl, kInnerViewportScrollLayerId);
|
| + inner_scroll->SetIsContainerForFixedPositionLayers(true);
|
| + inner_scroll->SetScrollOffset(gfx::Vector2d());
|
| +
|
| + scoped_ptr<LayerImpl> inner_clip =
|
| + LayerImpl::Create(layer_tree_impl, kInnerViewportClipLayerId);
|
| + inner_clip->SetBounds(inner_viewport);
|
| +
|
| + scoped_ptr<LayerImpl> page_scale =
|
| + LayerImpl::Create(layer_tree_impl, kPageScaleLayerId);
|
| +
|
| + inner_scroll->SetScrollClipLayer(inner_clip->id());
|
| + inner_scroll->SetBounds(outer_viewport);
|
| + inner_scroll->SetContentBounds(outer_viewport);
|
| + inner_scroll->SetPosition(gfx::PointF());
|
| + inner_scroll->SetAnchorPoint(gfx::PointF());
|
| +
|
| + scoped_ptr<LayerImpl> outer_clip =
|
| + LayerImpl::Create(layer_tree_impl, kOuterViewportClipLayerId);
|
| + outer_clip->SetBounds(outer_viewport);
|
| + outer_clip->SetIsContainerForFixedPositionLayers(true);
|
| +
|
| + scoped_ptr<LayerImpl> outer_scroll =
|
| + LayerImpl::Create(layer_tree_impl, kOuterViewportScrollLayerId);
|
| + outer_scroll->SetScrollClipLayer(outer_clip->id());
|
| + outer_scroll->SetScrollOffset(gfx::Vector2d());
|
| + outer_scroll->SetBounds(content_size);
|
| + outer_scroll->SetContentBounds(content_size);
|
| + outer_scroll->SetPosition(gfx::PointF());
|
| + outer_scroll->SetAnchorPoint(gfx::PointF());
|
| +
|
| + scoped_ptr<LayerImpl> contents =
|
| + LayerImpl::Create(layer_tree_impl, 8);
|
| + contents->SetDrawsContent(true);
|
| + contents->SetBounds(content_size);
|
| + contents->SetContentBounds(content_size);
|
| + contents->SetPosition(gfx::PointF());
|
| + contents->SetAnchorPoint(gfx::PointF());
|
| +
|
| + outer_scroll->AddChild(contents.Pass());
|
| + outer_clip->AddChild(outer_scroll.Pass());
|
| + inner_scroll->AddChild(outer_clip.Pass());
|
| + page_scale->AddChild(inner_scroll.Pass());
|
| + inner_clip->AddChild(page_scale.Pass());
|
| +
|
| + layer_tree_impl->SetRootLayer(inner_clip.Pass());
|
| + layer_tree_impl->SetViewportLayersFromIds(kPageScaleLayerId,
|
| + kInnerViewportScrollLayerId, kOuterViewportScrollLayerId);
|
| +
|
| + host_impl_->active_tree()->DidBecomeActive();
|
| + }
|
| +};
|
| +
|
| +TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) {
|
| + gfx::Size content_size = gfx::Size(100, 160);
|
| + gfx::Size outer_viewport = gfx::Size(50, 80);
|
| + gfx::Size inner_viewport = gfx::Size(25, 40);
|
| +
|
| + SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport);
|
| +
|
| + LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer();
|
| + LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer();
|
| + DrawFrame();
|
| + {
|
| + gfx::Vector2dF inner_expected;
|
| + gfx::Vector2dF outer_expected;
|
| + EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset());
|
| + EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset());
|
| +
|
| + // Make sure the fling goes to the outer viewport first
|
| + EXPECT_EQ(InputHandler::ScrollStarted,
|
| + host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture));
|
| + EXPECT_EQ(InputHandler::ScrollStarted, host_impl_->FlingScrollBegin());
|
| +
|
| + gfx::Vector2d scroll_delta(inner_viewport.width(), inner_viewport.height());
|
| + host_impl_->ScrollBy(gfx::Point(), scroll_delta);
|
| + outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
|
| +
|
| + host_impl_->ScrollEnd();
|
| +
|
| + EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset());
|
| + EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset());
|
| +
|
| + // Fling past the outer viewport boundry, make sure inner viewport scrolls.
|
| + EXPECT_EQ(InputHandler::ScrollStarted,
|
| + host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture));
|
| + EXPECT_EQ(InputHandler::ScrollStarted, host_impl_->FlingScrollBegin());
|
| +
|
| + host_impl_->ScrollBy(gfx::Point(), scroll_delta);
|
| + outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
|
| +
|
| + host_impl_->ScrollBy(gfx::Point(), scroll_delta);
|
| + inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
|
| +
|
| + host_impl_->ScrollEnd();
|
| +
|
| + EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset());
|
| + EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset());
|
| + }
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|