Title: [117968] trunk/Source/WebKit2
Revision
117968
Author
[email protected]
Date
2012-05-22 07:04:23 -0700 (Tue, 22 May 2012)

Log Message

[Qt] Clean up internal viewport animation API
https://bugs.webkit.org/show_bug.cgi?id=87130

Reviewed by Simon Hausmann.

const'ify classes which should be const.

There is now only one method which can animate, animateItemRectVisible
which is used for also animating the contents back into valid bounds.
The valid bounds are computed using a separate method. It is now more
clear when an animation is used or not and asserts are added for
ensuring no concurrent animations as well as proper update deferring.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewFlickablePrivate::didChangeViewportProperties):
* UIProcess/qt/QtViewportInteractionEngine.cpp:
(WebKit::QtViewportInteractionEngine::cssScaleFromItem):
(WebKit::QtViewportInteractionEngine::itemScaleFromCSS):
(WebKit::QtViewportInteractionEngine::itemCoordFromCSS):
(WebKit::QtViewportInteractionEngine::itemRectFromCSS):
(WebKit::QtViewportInteractionEngine::innerBoundedCSSScale):
(WebKit::QtViewportInteractionEngine::outerBoundedCSSScale):
(WebKit::QtViewportInteractionEngine::setItemRectVisible):
(WebKit::QtViewportInteractionEngine::animateItemRectVisible):
(WebKit::QtViewportInteractionEngine::scaleAnimationStateChanged):
(WebKit::QtViewportInteractionEngine::nearestValidBounds):
(WebKit::QtViewportInteractionEngine::currentCSSScale):
(WebKit::QtViewportInteractionEngine::cancelScrollAnimation):
(WebKit::QtViewportInteractionEngine::pinchGestureEnded):
(WebKit::QtViewportInteractionEngine::itemSizeChanged):
* UIProcess/qt/QtViewportInteractionEngine.h:
(QtViewportInteractionEngine):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (117967 => 117968)


--- trunk/Source/WebKit2/ChangeLog	2012-05-22 14:02:09 UTC (rev 117967)
+++ trunk/Source/WebKit2/ChangeLog	2012-05-22 14:04:23 UTC (rev 117968)
@@ -1,3 +1,38 @@
+2012-05-22  Kenneth Rohde Christiansen  <[email protected]>
+
+        [Qt] Clean up internal viewport animation API
+        https://bugs.webkit.org/show_bug.cgi?id=87130
+
+        Reviewed by Simon Hausmann.
+
+        const'ify classes which should be const.
+
+        There is now only one method which can animate, animateItemRectVisible
+        which is used for also animating the contents back into valid bounds.
+        The valid bounds are computed using a separate method. It is now more
+        clear when an animation is used or not and asserts are added for
+        ensuring no concurrent animations as well as proper update deferring.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewFlickablePrivate::didChangeViewportProperties):
+        * UIProcess/qt/QtViewportInteractionEngine.cpp:
+        (WebKit::QtViewportInteractionEngine::cssScaleFromItem):
+        (WebKit::QtViewportInteractionEngine::itemScaleFromCSS):
+        (WebKit::QtViewportInteractionEngine::itemCoordFromCSS):
+        (WebKit::QtViewportInteractionEngine::itemRectFromCSS):
+        (WebKit::QtViewportInteractionEngine::innerBoundedCSSScale):
+        (WebKit::QtViewportInteractionEngine::outerBoundedCSSScale):
+        (WebKit::QtViewportInteractionEngine::setItemRectVisible):
+        (WebKit::QtViewportInteractionEngine::animateItemRectVisible):
+        (WebKit::QtViewportInteractionEngine::scaleAnimationStateChanged):
+        (WebKit::QtViewportInteractionEngine::nearestValidBounds):
+        (WebKit::QtViewportInteractionEngine::currentCSSScale):
+        (WebKit::QtViewportInteractionEngine::cancelScrollAnimation):
+        (WebKit::QtViewportInteractionEngine::pinchGestureEnded):
+        (WebKit::QtViewportInteractionEngine::itemSizeChanged):
+        * UIProcess/qt/QtViewportInteractionEngine.h:
+        (QtViewportInteractionEngine):
+
 2012-05-21  Kenneth Rohde Christiansen  <[email protected]>
 
         [Qt] Mini clean ups in the interaction engine

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (117967 => 117968)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-05-22 14:02:09 UTC (rev 117967)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-05-22 14:04:23 UTC (rev 117968)
@@ -834,7 +834,7 @@
 
     // If the web app successively changes the viewport on purpose
     // it wants to be in control and we should disable animations.
-    interactionEngine->ensureContentWithinViewportBoundary(/*immediate*/ true);
+    interactionEngine->setItemRectVisible(interactionEngine->nearestValidBounds());
 }
 
 void QQuickWebViewFlickablePrivate::updateViewportSize()

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (117967 => 117968)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2012-05-22 14:02:09 UTC (rev 117967)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2012-05-22 14:04:23 UTC (rev 117968)
@@ -98,22 +98,22 @@
     return qAbs(a - b) < epsilon;
 }
 
-inline qreal QtViewportInteractionEngine::cssScaleFromItem(qreal itemScale)
+inline qreal QtViewportInteractionEngine::cssScaleFromItem(qreal itemScale) const
 {
     return itemScale / m_devicePixelRatio;
 }
 
-inline qreal QtViewportInteractionEngine::itemScaleFromCSS(qreal cssScale)
+inline qreal QtViewportInteractionEngine::itemScaleFromCSS(qreal cssScale) const
 {
     return cssScale * m_devicePixelRatio;
 }
 
-inline qreal QtViewportInteractionEngine::itemCoordFromCSS(qreal value)
+inline qreal QtViewportInteractionEngine::itemCoordFromCSS(qreal value) const
 {
     return value * m_devicePixelRatio;
 }
 
-inline QRectF QtViewportInteractionEngine::itemRectFromCSS(const QRectF& cssRect)
+inline QRectF QtViewportInteractionEngine::itemRectFromCSS(const QRectF& cssRect) const
 {
     QRectF itemRect;
 
@@ -152,12 +152,12 @@
 {
 }
 
-qreal QtViewportInteractionEngine::innerBoundedCSSScale(qreal cssScale)
+qreal QtViewportInteractionEngine::innerBoundedCSSScale(qreal cssScale) const
 {
     return qBound(m_minimumScale, cssScale, m_maximumScale);
 }
 
-qreal QtViewportInteractionEngine::outerBoundedCSSScale(qreal cssScale)
+qreal QtViewportInteractionEngine::outerBoundedCSSScale(qreal cssScale) const
 {
     if (m_allowsUserScaling) {
         // Bounded by [0.1, 10.0] like the viewport meta code in WebCore.
@@ -173,8 +173,6 @@
     if (itemRect.isEmpty())
         return;
 
-    ViewportUpdateDeferrer guard(this);
-
     qreal itemScale = m_viewport->width() / itemRect.width();
 
     m_content->setContentsScale(itemScale);
@@ -192,20 +190,25 @@
     return (-t * (t - 2)) * 1.25 - (t * t) * 0.25;
 }
 
-bool QtViewportInteractionEngine::animateItemRectVisible(const QRectF& itemRect)
+void QtViewportInteractionEngine::animateItemRectVisible(const QRectF& itemRect)
 {
-    ASSERT(m_suspended);
+    ASSERT(m_scaleAnimation->state() == QAbstractAnimation::Stopped);
 
+    ASSERT(!scrollAnimationActive());
+    if (scrollAnimationActive())
+        return;
+
     QRectF currentItemRectVisible = m_viewport->mapRectToWebContent(m_viewport->boundingRect());
     if (itemRect == currentItemRectVisible)
-        return false;
+        return;
 
     // FIXME: Investigate why that animation doesn't run when we are unfocused.
     if (!m_viewport->isVisible() || !m_viewport->hasFocus()) {
         // Apply the end result immediately when we are non-visible.
         setItemRectVisible(itemRect);
-        return true;
+        return;
     }
+
     QEasingCurve easingCurve;
     easingCurve.setCustomType(physicalOvershoot);
 
@@ -216,7 +219,6 @@
     m_scaleAnimation->setEndValue(itemRect);
 
     m_scaleAnimation->start();
-    return true;
 }
 
 void QtViewportInteractionEngine::flickableMoveStarted()
@@ -254,11 +256,11 @@
     switch (newState) {
     case QAbstractAnimation::Running:
         m_viewport->cancelFlick();
-        if (!m_scaleUpdateDeferrer)
-            m_scaleUpdateDeferrer = adoptPtr(new ViewportUpdateDeferrer(this, ViewportUpdateDeferrer::DeferUpdateAndSuspendContent));
+        ASSERT(!m_animationUpdateDeferrer);
+        m_animationUpdateDeferrer = adoptPtr(new ViewportUpdateDeferrer(this, ViewportUpdateDeferrer::DeferUpdateAndSuspendContent));
         break;
     case QAbstractAnimation::Stopped:
-        m_scaleUpdateDeferrer.clear();
+        m_animationUpdateDeferrer.clear();
         break;
     default:
         break;
@@ -427,11 +429,8 @@
     animateItemRectVisible(endVisibleContentRect);
 }
 
-bool QtViewportInteractionEngine::ensureContentWithinViewportBoundary(bool immediate)
+QRectF QtViewportInteractionEngine::nearestValidBounds() const
 {
-    if (!immediate && (scrollAnimationActive() || scaleAnimationActive()))
-        return false;
-
     qreal endItemScale = itemScaleFromCSS(innerBoundedCSSScale(currentCSSScale()));
 
     const QRectF viewportRect = m_viewport->boundingRect();
@@ -444,11 +443,7 @@
 
     QRectF endVisibleContentRect(endPosition / endItemScale, viewportRect.size() / endItemScale);
 
-    if (immediate) {
-        setItemRectVisible(endVisibleContentRect);
-        return true;
-    }
-    return !animateItemRectVisible(endVisibleContentRect);
+    return endVisibleContentRect;
 }
 
 void QtViewportInteractionEngine::reset()
@@ -485,7 +480,7 @@
     m_content->setContentsScale(itemScaleFromCSS(newScale));
 }
 
-qreal QtViewportInteractionEngine::currentCSSScale()
+qreal QtViewportInteractionEngine::currentCSSScale() const
 {
     return cssScaleFromItem(m_content->contentsScale());
 }
@@ -538,15 +533,13 @@
 
 void QtViewportInteractionEngine::cancelScrollAnimation()
 {
-    ViewportUpdateDeferrer guard(this);
-
     // If the pan gesture recognizer receives a touch begin event
     // during an ongoing kinetic scroll animation of a previous
     // pan gesture, the animation is stopped and the content is
     // immediately positioned back to valid boundaries.
 
     m_viewport->cancelFlick();
-    ensureContentWithinViewportBoundary(/*immediate*/ true);
+    setItemRectVisible(nearestValidBounds());
 }
 
 void QtViewportInteractionEngine::interruptScaleAnimation()
@@ -608,9 +601,9 @@
         return;
 
     m_pinchStartScale = -1;
-    // Clear the update deferrer now if we're in our final position and there won't be any animation to clear it later.
-    if (ensureContentWithinViewportBoundary())
-        m_scaleUpdateDeferrer.clear();
+
+    animateItemRectVisible(nearestValidBounds());
+    m_scaleUpdateDeferrer.clear(); // Clear after starting potential animation, which takes over deferring.
 }
 
 void QtViewportInteractionEngine::pinchGestureCancelled()
@@ -630,8 +623,7 @@
     if (m_suspendCount)
         return;
 
-    ViewportUpdateDeferrer guard(this);
-    ensureContentWithinViewportBoundary(true);
+    setItemRectVisible(nearestValidBounds());
 }
 
 void QtViewportInteractionEngine::scaleContent(const QPointF& centerInCSSCoordinates, qreal cssScale)

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (117967 => 117968)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2012-05-22 14:02:09 UTC (rev 117967)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2012-05-22 14:04:23 UTC (rev 117968)
@@ -55,16 +55,16 @@
     void setCSSScaleBounds(qreal minimum, qreal maximum);
     void setCSSScale(qreal);
 
-    qreal currentCSSScale();
+    qreal currentCSSScale() const;
 
-    bool ensureContentWithinViewportBoundary(bool immediate = false);
-
     void setAllowsUserScaling(bool allow) { m_allowsUserScaling = allow; }
     void setContentToDevicePixelRatio(qreal ratio) {m_devicePixelRatio = ratio; }
 
     void setItemRectVisible(const QRectF&);
-    bool animateItemRectVisible(const QRectF&);
+    void animateItemRectVisible(const QRectF&);
 
+    QRectF nearestValidBounds() const;
+
     void pagePositionRequest(const QPoint& pos);
     void touchBegin();
     void touchEnd();
@@ -120,13 +120,13 @@
     QQuickWebView* const m_viewport;
     QQuickWebPage* const m_content;
 
-    qreal cssScaleFromItem(qreal);
-    qreal itemScaleFromCSS(qreal);
-    qreal itemCoordFromCSS(qreal);
-    QRectF itemRectFromCSS(const QRectF&);
+    qreal cssScaleFromItem(qreal) const;
+    qreal itemScaleFromCSS(qreal) const;
+    qreal itemCoordFromCSS(qreal) const;
+    QRectF itemRectFromCSS(const QRectF&) const;
 
-    qreal innerBoundedCSSScale(qreal);
-    qreal outerBoundedCSSScale(qreal);
+    qreal innerBoundedCSSScale(qreal) const;
+    qreal outerBoundedCSSScale(qreal) const;
 
     bool m_allowsUserScaling;
     qreal m_minimumScale;
@@ -144,6 +144,7 @@
     OwnPtr<ViewportUpdateDeferrer> m_scaleUpdateDeferrer;
     OwnPtr<ViewportUpdateDeferrer> m_scrollUpdateDeferrer;
     OwnPtr<ViewportUpdateDeferrer> m_touchUpdateDeferrer;
+    OwnPtr<ViewportUpdateDeferrer> m_animationUpdateDeferrer;
 
     bool m_hadUserInteraction;
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to