Index: Source/web/tests/PinchViewportTest.cpp |
diff --git a/Source/web/tests/PinchViewportTest.cpp b/Source/web/tests/PinchViewportTest.cpp |
index 5856c4df118ee10a37ebbe9c93287fda76b31ccb..11a78d7ff57e5d98f6fce79e64fc0c1660dae6bb 100644 |
--- a/Source/web/tests/PinchViewportTest.cpp |
+++ b/Source/web/tests/PinchViewportTest.cpp |
@@ -162,6 +162,12 @@ protected: |
private: |
FrameTestHelpers::WebViewHelper m_helper; |
+ |
+ // To prevent platform differneces in content rendering, use mock |
+ // scrollbars. This is especially needed for Mac, where the presence |
+ // or absence of a mouse will change frame sizes because of different |
+ // scrollbar themes. |
+ FrameTestHelpers::UseMockScrollbarSettings m_useMockScrollbars; |
}; |
// Test that resizing the PinchViewport works as expected and that resizing the |
@@ -522,13 +528,9 @@ TEST_F(PinchViewportTest, TestOffsetClampingWithResizeAndScale) |
EXPECT_FLOAT_POINT_EQ(FloatPoint(165, 125), pinchViewport.visibleRect().location()); |
// The viewport can be larger than the main frame (currently 320, 240) though typically |
- // the scale will be clamped to prevent it from actually being larger. Make sure size |
- // changes clamp the offset so the inner remains within the outer. |
+ // the scale will be clamped to prevent it from actually being larger. |
pinchViewport.setSize(IntSize(330, 250)); |
EXPECT_SIZE_EQ(IntSize(330, 250), pinchViewport.size()); |
- EXPECT_FLOAT_POINT_EQ(FloatPoint(155, 115), pinchViewport.visibleRect().location()); |
- pinchViewport.setLocation(FloatPoint(200, 200)); |
- EXPECT_FLOAT_POINT_EQ(FloatPoint(155, 115), pinchViewport.visibleRect().location()); |
// Resize both the viewport and the frame to be larger. |
webViewImpl()->resize(IntSize(640, 480)); |
@@ -543,11 +545,6 @@ TEST_F(PinchViewportTest, TestOffsetClampingWithResizeAndScale) |
pinchViewport.setLocation(FloatPoint(200, 200)); |
pinchViewport.setSize(IntSize(880, 560)); |
EXPECT_FLOAT_POINT_EQ(FloatPoint(200, 200), pinchViewport.visibleRect().location()); |
- |
- // Resizing the viewport such that the viewport is out of bounds should move the |
- // viewport. |
- pinchViewport.setSize(IntSize(920, 640)); |
- EXPECT_FLOAT_POINT_EQ(FloatPoint(180, 160), pinchViewport.visibleRect().location()); |
} |
// The main FrameView's size should be set such that its the size of the pinch viewport |
@@ -564,7 +561,8 @@ TEST_F(PinchViewportTest, TestFrameViewSizedToContent) |
webViewImpl()->resize(IntSize(600, 800)); |
webViewImpl()->layout(); |
- EXPECT_SIZE_EQ(IntSize(200, 266), |
+ // Note: the size is ceiled and should match the behavior in CC's LayerImpl::bounds(). |
+ EXPECT_SIZE_EQ(IntSize(200, 267), |
webViewImpl()->mainFrameImpl()->frameView()->frameRect().size()); |
} |
@@ -967,4 +965,160 @@ TEST_F(PinchViewportTest, DISABLED_TestScrollingDocumentRegionIntoView) |
EXPECT_FLOAT_POINT_EQ(FloatPoint(50, 75), pinchViewport.visibleRect().location()); |
} |
+static IntPoint expectedMaxFrameViewScrollOffset(PinchViewport& pinchViewport, FrameView& frameView) |
+{ |
+ float aspectRatio = pinchViewport.visibleRect().width() / pinchViewport.visibleRect().height(); |
+ float newHeight = frameView.frameRect().width() / aspectRatio; |
+ return IntPoint( |
+ frameView.contentsSize().width() - frameView.frameRect().width(), |
+ frameView.contentsSize().height() - newHeight); |
+} |
+ |
+TEST_F(PinchViewportTest, TestTopControlsAdjustment) |
+{ |
+ initializeWithAndroidSettings(); |
+ webViewImpl()->resize(IntSize(100, 150)); |
+ |
+ registerMockedHttpURLLoad("content-width-1000.html"); |
+ navigateTo(m_baseURL + "content-width-1000.html"); |
+ |
+ PinchViewport& pinchViewport = frame()->page()->frameHost().pinchViewport(); |
+ FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView(); |
+ |
+ pinchViewport.setScale(1); |
+ EXPECT_SIZE_EQ(IntSize(100, 150), pinchViewport.visibleRect().size()); |
+ EXPECT_SIZE_EQ(IntSize(1000, 1500), frameView.frameRect().size()); |
+ |
+ // Simulate bringing down the top controls by 20px. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 1, 20); |
+ EXPECT_SIZE_EQ(IntSize(100, 130), pinchViewport.visibleRect().size()); |
+ |
+ // Test that the scroll bounds are adjusted appropriately: the pinch viewport |
+ // should be shrunk by 20px to 130px. The outer viewport was shrunk to maintain the |
+ // aspect ratio so it's height is 1300px. |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ EXPECT_POINT_EQ(FloatPoint(900, 1300 - 130), pinchViewport.location()); |
+ |
+ // The outer viewport (FrameView) should be affected as well. |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ EXPECT_POINT_EQ( |
+ expectedMaxFrameViewScrollOffset(pinchViewport, frameView), |
+ frameView.scrollPosition()); |
+ |
+ // Simulate bringing up the top controls by 10.5px. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 1, -10.5f); |
+ EXPECT_SIZE_EQ(FloatSize(100, 140.5f), pinchViewport.visibleRect().size()); |
+ |
+ // maximumScrollPosition floors the final values. |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ EXPECT_POINT_EQ(FloatPoint(900, floor(1405 - 140.5f)), pinchViewport.location()); |
+ |
+ // The outer viewport (FrameView) should be affected as well. |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ EXPECT_POINT_EQ( |
+ expectedMaxFrameViewScrollOffset(pinchViewport, frameView), |
+ frameView.scrollPosition()); |
+} |
+ |
+TEST_F(PinchViewportTest, TestTopControlsAdjustmentWithScale) |
+{ |
+ initializeWithAndroidSettings(); |
+ webViewImpl()->resize(IntSize(100, 150)); |
+ |
+ registerMockedHttpURLLoad("content-width-1000.html"); |
+ navigateTo(m_baseURL + "content-width-1000.html"); |
+ |
+ PinchViewport& pinchViewport = frame()->page()->frameHost().pinchViewport(); |
+ FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView(); |
+ |
+ pinchViewport.setScale(2); |
+ EXPECT_SIZE_EQ(IntSize(50, 75), pinchViewport.visibleRect().size()); |
+ EXPECT_SIZE_EQ(IntSize(1000, 1500), frameView.frameRect().size()); |
+ |
+ // Simulate bringing down the top controls by 20px. Since we're zoomed in, |
+ // the top controls take up half as much space (in document-space) than |
+ // they do at an unzoomed level. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 1, 20); |
+ EXPECT_SIZE_EQ(IntSize(50, 65), pinchViewport.visibleRect().size()); |
+ |
+ // Test that the scroll bounds are adjusted appropriately. |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ EXPECT_POINT_EQ(FloatPoint(950, 1300 - 65), pinchViewport.location()); |
+ |
+ // The outer viewport (FrameView) should be affected as well. |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ IntPoint expected = expectedMaxFrameViewScrollOffset(pinchViewport, frameView); |
+ EXPECT_POINT_EQ(expected, frameView.scrollPosition()); |
+ |
+ // Scale back out, FrameView max scroll shouldn't have changed. Pinch |
+ // viewport should be moved up to accomodate larger view. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 0.5f, 0); |
+ EXPECT_EQ(1, pinchViewport.scale()); |
+ EXPECT_POINT_EQ(expected, frameView.scrollPosition()); |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ EXPECT_POINT_EQ(expected, frameView.scrollPosition()); |
+ |
+ EXPECT_POINT_EQ(FloatPoint(900, 1300 - 130), pinchViewport.location()); |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ EXPECT_POINT_EQ(FloatPoint(900, 1300 - 130), pinchViewport.location()); |
+ |
+ // Scale out, use a scale that causes fractional rects. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 0.8f, -20); |
+ EXPECT_SIZE_EQ(FloatSize(125, 187.5), pinchViewport.visibleRect().size()); |
+ |
+ // Bring out the top controls by 11px. |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 1, 11); |
+ EXPECT_SIZE_EQ(FloatSize(125, 173.75), pinchViewport.visibleRect().size()); |
+ |
+ // Ensure max scroll offsets are updated properly. |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ EXPECT_POINT_EQ(FloatPoint(875, floor(1390 - 173.75)), pinchViewport.location()); |
+ |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ EXPECT_POINT_EQ( |
+ expectedMaxFrameViewScrollOffset(pinchViewport, frameView), |
+ frameView.scrollPosition()); |
+ |
+} |
+ |
+TEST_F(PinchViewportTest, TestTopControlsAdjustmentAndResize) |
+{ |
+ initializeWithAndroidSettings(); |
+ webViewImpl()->resize(IntSize(100, 150)); |
+ |
+ registerMockedHttpURLLoad("content-width-1000.html"); |
+ navigateTo(m_baseURL + "content-width-1000.html"); |
+ |
+ PinchViewport& pinchViewport = frame()->page()->frameHost().pinchViewport(); |
+ FrameView& frameView = *webViewImpl()->mainFrameImpl()->frameView(); |
+ |
+ pinchViewport.setScale(2); |
+ EXPECT_SIZE_EQ(IntSize(50, 75), pinchViewport.visibleRect().size()); |
+ EXPECT_SIZE_EQ(IntSize(1000, 1500), frameView.frameRect().size()); |
+ |
+ webViewImpl()->applyViewportDeltas(WebSize(), WebSize(), 1, 20); |
+ EXPECT_SIZE_EQ(IntSize(100, 150), pinchViewport.size()); |
+ EXPECT_SIZE_EQ(IntSize(50, 65), pinchViewport.visibleRect().size()); |
+ |
+ // Scroll all the way to the bottom. |
+ pinchViewport.move(FloatPoint(10000, 10000)); |
+ frameView.scrollBy(IntSize(10000, 10000)); |
+ IntPoint frameViewExpected = expectedMaxFrameViewScrollOffset(pinchViewport, frameView); |
+ FloatPoint pinchViewportExpected = FloatPoint(950, 1300 - 65); |
+ EXPECT_POINT_EQ(pinchViewportExpected, pinchViewport.location()); |
+ EXPECT_POINT_EQ(frameViewExpected, frameView.scrollPosition()); |
+ |
+ // Resize the widget to match the top controls adjustment. Ensure that scroll |
+ // offsets don't get clamped in the the process. |
+ webViewImpl()->setTopControlsLayoutHeight(20); |
+ webViewImpl()->resize(WebSize(100, 130)); |
+ |
+ EXPECT_SIZE_EQ(IntSize(100, 130), pinchViewport.size()); |
+ EXPECT_SIZE_EQ(IntSize(50, 65), pinchViewport.visibleRect().size()); |
+ EXPECT_SIZE_EQ(IntSize(1000, 1300), frameView.frameRect().size()); |
+ |
+ EXPECT_POINT_EQ(frameViewExpected, frameView.scrollPosition()); |
+ EXPECT_POINT_EQ(pinchViewportExpected, pinchViewport.location()); |
+} |
+ |
} // namespace |