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;