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 30d37eb148d2eb45eed04007a1f343dbf575a529..61b0ee1ddb9f08e8529487f9877dd22ab1422424 100644 |
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp |
@@ -1837,7 +1837,14 @@ void WebViewImpl::resizeVisualViewport(const WebSize& newSize) |
void WebViewImpl::performResize() |
{ |
- pageScaleConstraintsSet().didChangeViewSize(m_size); |
+ // We'll keep the initial containing block size from changing when the top |
+ // controls hide so that the ICB will always be the same size as the |
+ // viewport with the top controls shown. |
+ IntSize ICBSize = m_size; |
+ if (!topControls().shrinkViewport()) |
aelias_OOO_until_Jul13
2016/01/16 04:17:38
TopControls::layoutHeight() already includes this
bokan
2016/01/19 00:05:31
It's actually the converse. When the top controls
|
+ ICBSize.expand(0, -topControls().height()); |
+ |
+ pageScaleConstraintsSet().didChangeInitialContainingBlockSize(ICBSize); |
updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); |
updateMainFrameLayoutSize(); |
@@ -1918,7 +1925,7 @@ void WebViewImpl::resize(const WebSize& newSize) |
// so that it can be used for initalization if the main frame gets |
// swapped to a LocalFrame at a later time. |
m_size = newSize; |
- pageScaleConstraintsSet().didChangeViewSize(m_size); |
+ pageScaleConstraintsSet().didChangeInitialContainingBlockSize(m_size); |
page()->frameHost().visualViewport().setSize(m_size); |
return; |
} |
@@ -3294,7 +3301,11 @@ void WebViewImpl::setIgnoreViewportTagScaleLimits(bool ignore) |
IntSize WebViewImpl::mainFrameSize() |
{ |
- return pageScaleConstraintsSet().mainFrameSize(); |
+ // The frame size should match the viewport size at minimum scale, since the |
+ // viewport must always be contained by the frame. |
+ FloatSize frameSize(m_size); |
+ frameSize.scale(1 / minimumPageScaleFactor()); |
+ return expandedIntSize(frameSize); |
} |
PageScaleConstraintsSet& WebViewImpl::pageScaleConstraintsSet() const |
@@ -3307,10 +3318,23 @@ void WebViewImpl::refreshPageScaleFactorAfterLayout() |
if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->isLocalFrame() || !page()->deprecatedLocalMainFrame()->view()) |
return; |
FrameView* view = page()->deprecatedLocalMainFrame()->view(); |
+ Document* document = mainFrameImpl()->frame()->document(); |
- updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); |
+ float oldMinimumPSF = minimumPageScaleFactor(); |
+ |
+ updatePageDefinedViewportConstraints(document->viewportDescription()); |
pageScaleConstraintsSet().computeFinalConstraints(); |
+ // If the minimum page scale factor changed, the amount we add to the layout |
+ // size due to top controls for viewport units will also have changed. i.e. |
+ // For 100vh we need to add the top controls to the layout size but the |
+ // top controls height is scaled so that at minimum scale, 100vh covers |
+ // exactly the viewport height with top controls hidden. |
+ if (topControls().height() && oldMinimumPSF != minimumPageScaleFactor()) { |
+ if (document->isActive()) |
+ document->notifyResizeForViewportUnits(); |
aelias_OOO_until_Jul13
2016/01/16 04:17:38
Likewise a test that fails if this isn't called.
bokan
2016/01/19 00:05:31
This is no longer needed now that I use the layout
|
+ } |
+ |
int verticalScrollbarWidth = 0; |
if (view->verticalScrollbar() && !view->verticalScrollbar()->isOverlayScrollbar()) |
verticalScrollbarWidth = view->verticalScrollbar()->width(); |
@@ -4097,7 +4121,7 @@ void WebViewImpl::layoutUpdated(WebLocalFrameImpl* webframe) |
m_size = frameSize; |
page()->frameHost().visualViewport().setSize(m_size); |
- pageScaleConstraintsSet().didChangeViewSize(m_size); |
+ pageScaleConstraintsSet().didChangeInitialContainingBlockSize(m_size); |
m_client->didAutoResize(m_size); |
sendResizeEventAndRepaint(); |