Index: third_party/WebKit/Source/web/WebViewImpl.cpp |
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp |
index d4e83cf4b79025d5be58783ddfc9fcaa81b71d16..107878abf2a9750ffbc8f1fbdcf4cac5e29e5b78 100644 |
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp |
@@ -1817,11 +1817,6 @@ void WebViewImpl::performResize() |
} |
} |
-void WebViewImpl::setTopControlsHeight(float height, bool topControlsShrinkLayoutSize) |
-{ |
- topControls().setHeight(height, topControlsShrinkLayoutSize); |
-} |
- |
void WebViewImpl::updateTopControlsState(WebTopControlsState constraint, WebTopControlsState current, bool animate) |
{ |
topControls().updateConstraints(constraint); |
@@ -1845,11 +1840,24 @@ void WebViewImpl::didUpdateTopControls() |
return; |
VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
- float topControlsViewportAdjustment = topControls().layoutHeight() - topControls().contentOffset(); |
- visualViewport.setTopControlsAdjustment(topControlsViewportAdjustment); |
- // Shrink the FrameView by the amount that will maintain the aspect-ratio with the VisualViewport. |
- view->setTopControlsViewportAdjustment(topControlsViewportAdjustment / minimumPageScaleFactor()); |
+ { |
+ // This object will save the current visual viewport offset w.r.t. the |
+ // document and restore it when the object goes out of scope. It's |
+ // needed since the top controls adjustment will change the maximum |
+ // scroll offset and we may need to reposition them to keep the user's |
+ // apparent position unchanged. |
+ ResizeViewportAnchor anchor(*view, visualViewport); |
+ |
+ float topControlsViewportAdjustment = |
+ topControls().layoutHeight() - topControls().contentOffset(); |
+ visualViewport.setTopControlsAdjustment(topControlsViewportAdjustment); |
+ |
+ // Since the FrameView is sized to be the visual viewport at minimum |
+ // scale, its adjustment must also be scaled by the minimum scale. |
+ view->setTopControlsViewportAdjustment( |
+ topControlsViewportAdjustment / minimumPageScaleFactor()); |
+ } |
} |
TopControls& WebViewImpl::topControls() |
@@ -1857,11 +1865,14 @@ TopControls& WebViewImpl::topControls() |
return page()->frameHost().topControls(); |
} |
-void WebViewImpl::resizeViewWhileAnchored(FrameView* view) |
+void WebViewImpl::resizeViewWhileAnchored( |
+ FrameView* view, float topControlsHeight, bool topControlsShrinkLayout) |
{ |
DCHECK(mainFrameImpl()); |
DCHECK(mainFrameImpl()->frame()->isLocalFrame()); |
+ topControls().setHeight(topControlsHeight, topControlsShrinkLayout); |
+ |
{ |
// Avoids unnecessary invalidations while various bits of state in TextAutosizer are updated. |
TextAutosizer::DeferUpdatePageInfo deferUpdatePageInfo(page()); |
@@ -1875,9 +1886,14 @@ void WebViewImpl::resizeViewWhileAnchored(FrameView* view) |
updateAllLifecyclePhases(); |
} |
-void WebViewImpl::resize(const WebSize& newSize) |
+void WebViewImpl::resizeWithTopControls(const WebSize& newSize, float topControlsHeight, bool topControlsShrinkLayout) |
{ |
- if (m_shouldAutoResize || m_size == newSize) |
+ if (m_shouldAutoResize) |
+ return; |
+ |
+ if (m_size == newSize |
+ && topControls().height() == topControlsHeight |
+ && topControls().shrinkViewport() == topControlsShrinkLayout) |
return; |
if (page()->mainFrame() && !page()->mainFrame()->isLocalFrame()) { |
@@ -1908,14 +1924,23 @@ void WebViewImpl::resize(const WebSize& newSize) |
FloatSize viewportAnchorCoords(viewportAnchorCoordX, viewportAnchorCoordY); |
if (isRotation) { |
RotationViewportAnchor anchor(*view, visualViewport, viewportAnchorCoords, pageScaleConstraintsSet()); |
- resizeViewWhileAnchored(view); |
+ resizeViewWhileAnchored(view, topControlsHeight, topControlsShrinkLayout); |
} else { |
ResizeViewportAnchor anchor(*view, visualViewport); |
- resizeViewWhileAnchored(view); |
+ resizeViewWhileAnchored(view, topControlsHeight, topControlsShrinkLayout); |
} |
sendResizeEventAndRepaint(); |
} |
+void WebViewImpl::resize(const WebSize& newSize) |
+{ |
+ if (m_shouldAutoResize || m_size == newSize) |
+ return; |
+ |
+ resizeWithTopControls( |
+ newSize, topControls().height(), topControls().shrinkViewport()); |
+} |
+ |
void WebViewImpl::didEnterFullScreen() |
{ |
m_fullscreenController->didEnterFullScreen(); |
@@ -4016,9 +4041,6 @@ void WebViewImpl::layoutUpdated(WebLocalFrameImpl* webframe) |
if (view->needsLayout()) |
view->layout(); |
- // In case we didn't have a size when the top controls were updated. |
- didUpdateTopControls(); |
- |
m_client->didUpdateLayout(); |
} |
@@ -4276,25 +4298,32 @@ void WebViewImpl::applyViewportDeltas( |
if (!frameView) |
return; |
+ ScrollableArea* layoutViewport = frameView->layoutViewportScrollableArea(); |
+ VisualViewport& visualViewport = page()->frameHost().visualViewport(); |
+ |
+ // Store the desired offsets for visual and layout viewports before setting |
+ // the top controls ratio since doing so will change the bounds and move the |
+ // viewports to keep the offsets valid. The compositor may have already done |
+ // that so we don't want to double apply the deltas here. |
+ FloatPoint visualViewportOffset = visualViewport.visibleRect().location(); |
+ visualViewportOffset.move( |
+ visualViewportDelta.width, |
+ visualViewportDelta.height); |
+ DoublePoint layoutViewportPosition = layoutViewport->scrollPositionDouble() |
+ + DoubleSize(layoutViewportDelta.width, layoutViewportDelta.height); |
+ |
topControls().setShownRatio(topControls().shownRatio() + topControlsShownRatioDelta); |
- FloatPoint visualViewportOffset = page()->frameHost().visualViewport().visibleRect().location(); |
- visualViewportOffset.move(visualViewportDelta.width, visualViewportDelta.height); |
setPageScaleFactorAndLocation(pageScaleFactor() * pageScaleDelta, visualViewportOffset); |
if (pageScaleDelta != 1) { |
m_doubleTapZoomPending = false; |
- page()->frameHost().visualViewport().userDidChangeScale(); |
+ visualViewport.userDidChangeScale(); |
} |
m_elasticOverscroll += elasticOverscrollDelta; |
frameView->didUpdateElasticOverscroll(); |
- ScrollableArea* layoutViewport = frameView->layoutViewportScrollableArea(); |
- |
- DoublePoint layoutViewportPosition = layoutViewport->scrollPositionDouble() |
- + DoubleSize(layoutViewportDelta.width, layoutViewportDelta.height); |
- |
if (layoutViewport->scrollPositionDouble() != layoutViewportPosition) { |
layoutViewport->setScrollPosition(layoutViewportPosition, CompositorScroll); |
if (DocumentLoader* documentLoader = mainFrameImpl()->frame()->loader().documentLoader()) |