Chromium Code Reviews| Index: cc/CCLayerTreeHostImplTest.cpp |
| =================================================================== |
| --- cc/CCLayerTreeHostImplTest.cpp (revision 158825) |
| +++ 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) |
|
aelias_OOO_until_Jul13
2012/09/26 23:15:09
Hmm... all of these tests should really be run in
Jeff Timanus
2012/10/01 21:42:36
I converted all of these tests to parametrized, an
|
| { |
| 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) |