| Index: cc/CCLayerTreeHostImplTest.cpp
|
| ===================================================================
|
| --- cc/CCLayerTreeHostImplTest.cpp (revision 158365)
|
| +++ cc/CCLayerTreeHostImplTest.cpp (working copy)
|
| @@ -452,6 +452,60 @@
|
| EXPECT_EQ(m_hostImpl->rootLayer()->maxScrollPosition(), IntSize(75, 75));
|
| }
|
|
|
| +TEST_F(CCLayerTreeHostImplTest, implPinchZoom)
|
| +{
|
| + CCSettings::setPageScalePinchZoomEnabled(true);
|
| + setupScrollAndContentsLayers(IntSize(100, 100));
|
| + m_hostImpl->setViewportSize(IntSize(50, 50), IntSize(50, 50));
|
| + initializeRendererAndDrawFrame();
|
| +
|
| + CCLayerImpl* scrollLayer = m_hostImpl->rootScrollLayer();
|
| + ASSERT(scrollLayer);
|
| +
|
| + const float minPageScale = 1, maxPageScale = 4;
|
| + const WebTransformationMatrix identityScaleTransform;
|
| +
|
| + // The impl-based pinch zoome should not adjust the max scroll position.
|
| + {
|
| + m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| + scrollLayer->setScrollDelta(IntSize());
|
| +
|
| + float pageScaleDelta = 2;
|
| + m_hostImpl->pinchGestureBegin();
|
| + m_hostImpl->pinchGestureUpdate(pageScaleDelta, IntPoint(50, 50));
|
| + m_hostImpl->pinchGestureEnd();
|
| + EXPECT_TRUE(m_didRequestRedraw);
|
| + EXPECT_TRUE(m_didRequestCommit);
|
| +
|
| + OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
|
| + EXPECT_EQ(scrollInfo->pageScaleDelta, pageScaleDelta);
|
| +
|
| + EXPECT_EQ(m_hostImpl->rootLayer()->maxScrollPosition(), IntSize(50, 50));
|
| + }
|
| +
|
| + // Scrolling after a pinch gesture should always be in local space. The scroll deltas do not
|
| + // have the page scale factor applied.
|
| + {
|
| + m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| + scrollLayer->setScrollDelta(IntSize());
|
| +
|
| + float pageScaleDelta = 2;
|
| + m_hostImpl->pinchGestureBegin();
|
| + m_hostImpl->pinchGestureUpdate(pageScaleDelta, IntPoint(50, 50));
|
| + m_hostImpl->pinchGestureEnd();
|
| +
|
| + IntSize scrollDelta(0, 10);
|
| + EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(5, 5), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollStarted);
|
| + m_hostImpl->scrollBy(IntPoint(), scrollDelta);
|
| + m_hostImpl->scrollEnd();
|
| +
|
| + OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
|
| + expectContains(*scrollInfo.get(), m_hostImpl->rootLayer()->id(), scrollDelta);
|
| + }
|
| +}
|
| +
|
| TEST_F(CCLayerTreeHostImplTest, pinchGesture)
|
| {
|
| setupScrollAndContentsLayers(IntSize(100, 100));
|
| @@ -462,11 +516,12 @@
|
| ASSERT(scrollLayer);
|
|
|
| const float minPageScale = 0.5, maxPageScale = 4;
|
| + const WebTransformationMatrix identityScaleTransform;
|
|
|
| // Basic pinch zoom in gesture
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollDelta(IntSize());
|
|
|
| float pageScaleDelta = 2;
|
| @@ -483,7 +538,7 @@
|
| // Zoom-in clamping
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollDelta(IntSize());
|
| float pageScaleDelta = 10;
|
|
|
| @@ -498,7 +553,7 @@
|
| // Zoom-out clamping
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollDelta(IntSize());
|
| scrollLayer->setScrollPosition(IntPoint(50, 50));
|
|
|
| @@ -517,7 +572,7 @@
|
| // Two-finger panning
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollDelta(IntSize());
|
| scrollLayer->setScrollPosition(IntPoint(20, 20));
|
|
|
| @@ -547,11 +602,12 @@
|
| const double duration = 0.1;
|
| const double halfwayThroughAnimation = startTime + duration / 2;
|
| const double endTime = startTime + duration;
|
| + const WebTransformationMatrix identityScaleTransform;
|
|
|
| // Non-anchor zoom-in
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollPosition(IntPoint(50, 50));
|
|
|
| m_hostImpl->startPageScaleAnimation(IntSize(0, 0), false, 2, startTime, duration);
|
| @@ -568,7 +624,7 @@
|
| // Anchor zoom-out
|
| {
|
| m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
|
| - scrollLayer->setPageScaleDelta(1);
|
| + scrollLayer->setImplTransform(identityScaleTransform);
|
| scrollLayer->setScrollPosition(IntPoint(50, 50));
|
|
|
| m_hostImpl->startPageScaleAnimation(IntSize(25, 25), true, minPageScale, startTime, duration);
|
| @@ -1046,7 +1102,7 @@
|
| EXPECT_EQ(m_hostImpl->rootLayer()->maxScrollPosition(), expectedMaxScroll);
|
|
|
| // The page scale delta remains constant because the impl thread did not scale.
|
| - EXPECT_EQ(m_hostImpl->rootLayer()->pageScaleDelta(), 1);
|
| + EXPECT_EQ(m_hostImpl->rootLayer()->implTransform(), WebTransformationMatrix());
|
| }
|
|
|
| TEST_F(CCLayerTreeHostImplTest, scrollRootAndChangePageScaleOnImplThread)
|
| @@ -1070,6 +1126,7 @@
|
| m_hostImpl->pinchGestureBegin();
|
| m_hostImpl->pinchGestureUpdate(pageScale, IntPoint());
|
| m_hostImpl->pinchGestureEnd();
|
| + m_hostImpl->updateRootScrollLayerImplTransform();
|
|
|
| // The scroll delta is not scaled because the main thread did not scale.
|
| OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
|
| @@ -1079,14 +1136,20 @@
|
| EXPECT_EQ(m_hostImpl->rootLayer()->maxScrollPosition(), expectedMaxScroll);
|
|
|
| // The page scale delta should match the new scale on the impl side.
|
| - EXPECT_EQ(m_hostImpl->rootLayer()->pageScaleDelta(), pageScale);
|
| + WebTransformationMatrix expectedScale;
|
| + expectedScale.scale(pageScale);
|
| + EXPECT_EQ(m_hostImpl->rootLayer()->implTransform(), expectedScale);
|
| }
|
|
|
| TEST_F(CCLayerTreeHostImplTest, pageScaleDeltaAppliedToRootScrollLayerOnly)
|
| {
|
| IntSize surfaceSize(10, 10);
|
| float defaultPageScale = 1;
|
| + WebTransformationMatrix defaultPageScaleMatrix;
|
| +
|
| float newPageScale = 2;
|
| + WebTransformationMatrix newPageScaleMatrix;
|
| + newPageScaleMatrix.scale(newPageScale);
|
|
|
| // Create a normal scrollable root layer and another scrollable child layer.
|
| setupScrollAndContentsLayers(surfaceSize);
|
| @@ -1101,11 +1164,12 @@
|
| m_hostImpl->pinchGestureBegin();
|
| m_hostImpl->pinchGestureUpdate(newPageScale, IntPoint());
|
| m_hostImpl->pinchGestureEnd();
|
| + m_hostImpl->updateRootScrollLayerImplTransform();
|
|
|
| // The page scale delta should only be applied to the scrollable root layer.
|
| - EXPECT_EQ(root->pageScaleDelta(), newPageScale);
|
| - EXPECT_EQ(child->pageScaleDelta(), defaultPageScale);
|
| - EXPECT_EQ(grandChild->pageScaleDelta(), defaultPageScale);
|
| + EXPECT_EQ(root->implTransform(), newPageScaleMatrix);
|
| + EXPECT_EQ(child->implTransform(), defaultPageScaleMatrix);
|
| + EXPECT_EQ(grandChild->implTransform(), defaultPageScaleMatrix);
|
|
|
| // Make sure all the layers are drawn with the page scale delta applied, i.e., the page scale
|
| // delta on the root layer is applied hierarchically.
|
| @@ -1148,6 +1212,8 @@
|
| float pageScale = 2;
|
| m_hostImpl->setPageScaleFactorAndLimits(pageScale, 1, pageScale);
|
|
|
| + m_hostImpl->updateRootScrollLayerImplTransform();
|
| +
|
| // The scale should apply to the scroll delta.
|
| expectedScrollDelta.scale(pageScale);
|
| OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
|
| @@ -1157,7 +1223,8 @@
|
| EXPECT_EQ(child->maxScrollPosition(), expectedMaxScroll);
|
|
|
| // The page scale delta remains constant because the impl thread did not scale.
|
| - EXPECT_EQ(child->pageScaleDelta(), 1);
|
| + WebTransformationMatrix identityTransform;
|
| + EXPECT_EQ(child->implTransform(), WebTransformationMatrix());
|
| }
|
|
|
| TEST_F(CCLayerTreeHostImplTest, scrollChildBeyondLimit)
|
|
|