Index: Source/web/WebViewImpl.cpp |
diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp |
index 06e1c3efd3a9d6a137123b869811287b1502407b..743982ad6e7dd52141de44a20178acf9df8b8bb2 100644 |
--- a/Source/web/WebViewImpl.cpp |
+++ b/Source/web/WebViewImpl.cpp |
@@ -412,8 +412,10 @@ WebViewImpl::WebViewImpl(WebViewClient* client) |
, m_backgroundColorOverride(Color::transparent) |
, m_zoomFactorOverride(0) |
, m_userGestureObserved(false) |
- , m_topControlsContentOffset(0) |
- , m_topControlsLayoutHeight(0) |
+ , m_topControlsShownRatio(0) |
+ , m_topControlsHeight(0) |
+ , m_topControlsShrinkLayoutSize(true) |
+ , m_topControlsOffsetIsNormalized(true) |
{ |
Page::PageClients pageClients; |
pageClients.chromeClient = &m_chromeClientImpl; |
@@ -1717,16 +1719,27 @@ void WebViewImpl::performResize() |
} |
} |
-void WebViewImpl::setTopControlsContentOffset(float offset) |
+void WebViewImpl::setTopControlsShownRatio(float offset) |
{ |
- m_topControlsContentOffset = offset; |
+ m_topControlsShownRatio = offset; |
+ // TODO(aelias): Rename this to ShownRatio after CC side lands. |
m_layerTreeView->setTopControlsContentOffset(offset); |
didUpdateTopControls(); |
} |
void WebViewImpl::setTopControlsLayoutHeight(float height) |
{ |
- m_topControlsLayoutHeight = height; |
+ m_topControlsOffsetIsNormalized = false; |
+ setTopControlsHeight(height, true); |
+} |
+ |
+void WebViewImpl::setTopControlsHeight(float height, bool topControlsShrinkLayoutSize) |
+{ |
+ if (m_topControlsHeight == height && m_topControlsShrinkLayoutSize == topControlsShrinkLayoutSize) |
+ return; |
+ |
+ m_topControlsHeight = height; |
+ m_topControlsShrinkLayoutSize = topControlsShrinkLayoutSize; |
didUpdateTopControls(); |
} |
@@ -1740,7 +1753,11 @@ void WebViewImpl::didUpdateTopControls() |
if (!view) |
return; |
- float topControlsViewportAdjustment = m_topControlsLayoutHeight - m_topControlsContentOffset; |
+ float topControlsViewportAdjustment = 0; |
+ if (m_topControlsShrinkLayoutSize) |
+ topControlsViewportAdjustment += m_topControlsHeight; |
+ topControlsViewportAdjustment -= m_topControlsShownRatio * (m_topControlsOffsetIsNormalized ? m_topControlsHeight : 1); |
+ |
if (!pinchVirtualViewportEnabled()) { |
// The viewport bounds were adjusted on the compositor by this much due to top controls. Tell |
// the FrameView about it so it can make correct scroll offset clamping decisions during compositor |
@@ -1756,13 +1773,13 @@ void WebViewImpl::didUpdateTopControls() |
// On ChromeOS the pinch viewport can change size independent of the layout viewport due to the |
// on screen keyboard so we should only set the FrameView adjustment on Android. |
-#if OS(ANDROID) |
- // Shrink the FrameView by the amount that will maintain the aspect-ratio with the PinchViewport. |
- float aspectRatio = pinchViewport.visibleRect().width() / pinchViewport.visibleRect().height(); |
- float newHeight = view->unscaledVisibleContentSize(ExcludeScrollbars).width() / aspectRatio; |
- float adjustment = newHeight - view->unscaledVisibleContentSize(ExcludeScrollbars).height(); |
- view->setTopControlsViewportAdjustment(adjustment); |
-#endif |
+ if (settings() && settings()->mainFrameResizesAreOrientationChanges()) { |
+ // Shrink the FrameView by the amount that will maintain the aspect-ratio with the PinchViewport. |
+ float aspectRatio = pinchViewport.visibleRect().width() / pinchViewport.visibleRect().height(); |
+ float newHeight = view->unscaledVisibleContentSize(ExcludeScrollbars).width() / aspectRatio; |
+ float adjustment = newHeight - view->unscaledVisibleContentSize(ExcludeScrollbars).height(); |
+ view->setTopControlsViewportAdjustment(adjustment); |
+ } |
} |
} |
@@ -4388,14 +4405,14 @@ void WebViewImpl::applyViewportDeltas( |
const WebSize& outerViewportDelta, |
const WebFloatSize& elasticOverscrollDelta, |
float pageScaleDelta, |
- float topControlsDelta) |
+ float topControlsShownRatioDelta) |
{ |
applyViewportDeltas( |
WebFloatSize(pinchViewportDelta.width, pinchViewportDelta.height), |
WebFloatSize(outerViewportDelta.width, outerViewportDelta.height), |
elasticOverscrollDelta, |
pageScaleDelta, |
- topControlsDelta); |
+ topControlsShownRatioDelta); |
} |
void WebViewImpl::applyViewportDeltas( |
@@ -4403,7 +4420,7 @@ void WebViewImpl::applyViewportDeltas( |
const WebFloatSize& outerViewportDelta, |
const WebFloatSize& elasticOverscrollDelta, |
float pageScaleDelta, |
- float topControlsDelta) |
+ float topControlsShownRatioDelta) |
{ |
ASSERT(pinchVirtualViewportEnabled()); |
@@ -4413,7 +4430,7 @@ void WebViewImpl::applyViewportDeltas( |
if (!frameView) |
return; |
- setTopControlsContentOffset(m_topControlsContentOffset + topControlsDelta); |
+ setTopControlsShownRatio(m_topControlsShownRatio + topControlsShownRatioDelta); |
FloatPoint pinchViewportOffset = page()->frameHost().pinchViewport().visibleRect().location(); |
pinchViewportOffset.move(pinchViewportDelta.width, pinchViewportDelta.height); |
@@ -4428,12 +4445,12 @@ void WebViewImpl::applyViewportDeltas( |
DoubleSize(outerViewportDelta.width, outerViewportDelta.height), /* programmaticScroll */ false); |
} |
-void WebViewImpl::applyViewportDeltas(const WebSize& scrollDelta, float pageScaleDelta, float topControlsDelta) |
+void WebViewImpl::applyViewportDeltas(const WebSize& scrollDelta, float pageScaleDelta, float topControlsShownRatioDelta) |
{ |
if (!mainFrameImpl() || !mainFrameImpl()->frameView()) |
return; |
- setTopControlsContentOffset(m_topControlsContentOffset + topControlsDelta); |
+ setTopControlsShownRatio(m_topControlsShownRatio + topControlsShownRatioDelta); |
if (pageScaleDelta == 1) { |
TRACE_EVENT_INSTANT2("blink", "WebViewImpl::applyScrollAndScale::scrollBy", "x", scrollDelta.width, "y", scrollDelta.height); |