diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-22 09:09:45 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-22 09:10:13 +0100 |
commit | 470286ecfe79d59df14944e5b5d34630fc739391 (patch) | |
tree | 43983212872e06cebefd2ae474418fa2908ca54c /Source/WebKit2/UIProcess/PageViewportController.cpp | |
parent | 23037105e948c2065da5a937d3a2396b0ff45c1e (diff) | |
download | qtwebkit-470286ecfe79d59df14944e5b5d34630fc739391.tar.gz |
Imported WebKit commit e89504fa9195b2063b2530961d4b73dd08de3242 (http://svn.webkit.org/repository/webkit/trunk@135485)
Change-Id: I03774e5ac79721c13ffa30d152537a74d0b12e66
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'Source/WebKit2/UIProcess/PageViewportController.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/PageViewportController.cpp | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/Source/WebKit2/UIProcess/PageViewportController.cpp b/Source/WebKit2/UIProcess/PageViewportController.cpp index 92091632f..35f361cad 100644 --- a/Source/WebKit2/UIProcess/PageViewportController.cpp +++ b/Source/WebKit2/UIProcess/PageViewportController.cpp @@ -52,11 +52,14 @@ PageViewportController::PageViewportController(WebKit::WebPageProxy* proxy, Page { // Initializing Viewport Raw Attributes to avoid random negative or infinity scale factors // if there is a race condition between the first layout and setting the viewport attributes for the first time. - m_rawAttributes.initialScale = 1; m_rawAttributes.minimumScale = 1; m_rawAttributes.maximumScale = 1; m_rawAttributes.userScalable = m_allowsUserScaling; - m_rawAttributes.initiallyFitToViewport = true; + + // The initial scale might be implicit and set to -1, in this case we have to infer it + // using the viewport size and the final layout size. + // To be able to assert for valid scale we initialize it to -1. + m_rawAttributes.initialScale = -1; ASSERT(m_client); m_client->setController(this); @@ -106,7 +109,8 @@ void PageViewportController::didCommitLoad() void PageViewportController::didChangeContentsSize(const IntSize& newSize) { m_contentsSize = newSize; - updateMinimumScaleToFit(); + if (updateMinimumScaleToFit()) + m_client->didChangeViewportAttributes(); } void PageViewportController::didRenderFrame(const IntSize& contentsSize, const IntRect& coveredRect) @@ -145,8 +149,8 @@ void PageViewportController::pageTransitionViewportReady() { if (!m_rawAttributes.layoutSize.isEmpty()) { m_hadUserInteraction = false; - float initialScale = m_rawAttributes.initiallyFitToViewport ? m_minimumScaleToFit : m_rawAttributes.initialScale; - applyScaleAfterRenderingContents(innerBoundedViewportScale(toViewportScale(initialScale))); + ASSERT(m_rawAttributes.initialScale > 0); + applyScaleAfterRenderingContents(innerBoundedViewportScale(toViewportScale(m_rawAttributes.initialScale))); } // At this point we should already have received the first viewport arguments and the requested scroll @@ -213,10 +217,18 @@ void PageViewportController::didChangeViewportAttributes(const WebCore::Viewport return; m_rawAttributes = newAttributes; - WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(m_rawAttributes); - m_allowsUserScaling = !!m_rawAttributes.userScalable; - updateMinimumScaleToFit(); + + if (!updateMinimumScaleToFit()) + return; + + ASSERT(m_minimumScaleToFit > 0); + + // Set the initial scale if it was not specified in the viewport meta tag. + if (m_rawAttributes.initialScale < 0) + m_rawAttributes.initialScale = m_minimumScaleToFit; + + WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(m_rawAttributes); m_client->didChangeViewportAttributes(); } @@ -260,21 +272,25 @@ void PageViewportController::applyPositionAfterRenderingContents(const FloatPoin syncVisibleContents(); } -void PageViewportController::updateMinimumScaleToFit() +bool PageViewportController::updateMinimumScaleToFit() { - if (m_viewportSize.isEmpty()) - return; + if (m_viewportSize.isEmpty() || m_contentsSize.isEmpty()) + return false; float minimumScale = WebCore::computeMinimumScaleFactorForContentContained(m_rawAttributes, WebCore::roundedIntSize(m_viewportSize), WebCore::roundedIntSize(m_contentsSize), devicePixelRatio()); + if (minimumScale <= 0) + return false; + if (!fuzzyCompare(minimumScale, m_minimumScaleToFit, 0.001)) { m_minimumScaleToFit = minimumScale; if (!m_hadUserInteraction && !hasSuspendedContent()) applyScaleAfterRenderingContents(toViewportScale(minimumScale)); - m_client->didChangeViewportAttributes(); + return true; } + return false; } } // namespace WebKit |