Title: [101380] trunk/Source/WebKit2
Revision
101380
Author
kenn...@webkit.org
Date
2011-11-29 07:56:04 -0800 (Tue, 29 Nov 2011)

Log Message

[Qt] Add the infrastructure for enabling suspend/resume.

Reviewed by Simon Hausmann.

Also, remove the painting optimization as it is broken in some
situations, as there is an assumption in that comparison that
the guards cannot be nested, which goes against the design and
its use.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewPrivate::initializeDesktop):
(QQuickWebViewPrivate::initializeTouch):
(QQuickWebViewPrivate::_q_suspend):
(QQuickWebViewPrivate::_q_resume):
* UIProcess/API/qt/qquickwebview_p.h:
* UIProcess/API/qt/qquickwebview_p_p.h:
* UIProcess/qt/QtViewportInteractionEngine.cpp:
(WebKit::ViewportUpdateGuard::ViewportUpdateGuard):
(WebKit::ViewportUpdateGuard::~ViewportUpdateGuard):
(WebKit::QtViewportInteractionEngine::QtViewportInteractionEngine):
(WebKit::QtViewportInteractionEngine::scaleAnimationStateChanged):
(WebKit::QtViewportInteractionEngine::scrollStateChanged):
(WebKit::QtViewportInteractionEngine::event):
(WebKit::QtViewportInteractionEngine::pagePositionRequest):
(WebKit::QtViewportInteractionEngine::ensureContentWithinViewportBoundary):
(WebKit::QtViewportInteractionEngine::reset):
(WebKit::QtViewportInteractionEngine::applyConstraints):
(WebKit::QtViewportInteractionEngine::panGestureRequestUpdate):
(WebKit::QtViewportInteractionEngine::panGestureEnded):
(WebKit::QtViewportInteractionEngine::pinchGestureActive):
(WebKit::QtViewportInteractionEngine::pinchGestureStarted):
(WebKit::QtViewportInteractionEngine::pinchGestureRequestUpdate):
(WebKit::QtViewportInteractionEngine::pinchGestureEnded):
(WebKit::QtViewportInteractionEngine::itemSizeChanged):
* UIProcess/qt/QtViewportInteractionEngine.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (101379 => 101380)


--- trunk/Source/WebKit2/ChangeLog	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/ChangeLog	2011-11-29 15:56:04 UTC (rev 101380)
@@ -1,3 +1,41 @@
+2011-11-29  Kenneth Rohde Christiansen  <kenn...@webkit.org>
+
+        [Qt] Add the infrastructure for enabling suspend/resume.
+
+        Reviewed by Simon Hausmann.
+
+        Also, remove the painting optimization as it is broken in some
+        situations, as there is an assumption in that comparison that
+        the guards cannot be nested, which goes against the design and
+        its use.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewPrivate::initializeDesktop):
+        (QQuickWebViewPrivate::initializeTouch):
+        (QQuickWebViewPrivate::_q_suspend):
+        (QQuickWebViewPrivate::_q_resume):
+        * UIProcess/API/qt/qquickwebview_p.h:
+        * UIProcess/API/qt/qquickwebview_p_p.h:
+        * UIProcess/qt/QtViewportInteractionEngine.cpp:
+        (WebKit::ViewportUpdateGuard::ViewportUpdateGuard):
+        (WebKit::ViewportUpdateGuard::~ViewportUpdateGuard):
+        (WebKit::QtViewportInteractionEngine::QtViewportInteractionEngine):
+        (WebKit::QtViewportInteractionEngine::scaleAnimationStateChanged):
+        (WebKit::QtViewportInteractionEngine::scrollStateChanged):
+        (WebKit::QtViewportInteractionEngine::event):
+        (WebKit::QtViewportInteractionEngine::pagePositionRequest):
+        (WebKit::QtViewportInteractionEngine::ensureContentWithinViewportBoundary):
+        (WebKit::QtViewportInteractionEngine::reset):
+        (WebKit::QtViewportInteractionEngine::applyConstraints):
+        (WebKit::QtViewportInteractionEngine::panGestureRequestUpdate):
+        (WebKit::QtViewportInteractionEngine::panGestureEnded):
+        (WebKit::QtViewportInteractionEngine::pinchGestureActive):
+        (WebKit::QtViewportInteractionEngine::pinchGestureStarted):
+        (WebKit::QtViewportInteractionEngine::pinchGestureRequestUpdate):
+        (WebKit::QtViewportInteractionEngine::pinchGestureEnded):
+        (WebKit::QtViewportInteractionEngine::itemSizeChanged):
+        * UIProcess/qt/QtViewportInteractionEngine.h:
+
 2011-11-29  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Add WebKitURIResponse to WebKit2 GTK+ API

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


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2011-11-29 15:56:04 UTC (rev 101380)
@@ -87,7 +87,8 @@
 void QQuickWebViewPrivate::initializeDesktop(QQuickWebView* viewport)
 {
     if (interactionEngine) {
-        QObject::disconnect(interactionEngine.data(), SIGNAL(viewportUpdateRequested()), viewport, SLOT(_q_viewportUpdated()));
+        QObject::disconnect(interactionEngine.data(), SIGNAL(contentSuspendRequested()), viewport, SLOT(_q_suspend()));
+        QObject::disconnect(interactionEngine.data(), SIGNAL(contentResumeRequested()), viewport, SLOT(_q_resume()));
         QObject::disconnect(interactionEngine.data(), SIGNAL(viewportTrajectoryVectorChanged(const QPointF&)), viewport, SLOT(_q_viewportTrajectoryVectorChanged(const QPointF&)));
     }
     interactionEngine.reset(0);
@@ -100,7 +101,8 @@
     interactionEngine.reset(new QtViewportInteractionEngine(viewport, pageView.data()));
     eventHandler->setViewportInteractionEngine(interactionEngine.data());
     disableMouseEvents();
-    QObject::connect(interactionEngine.data(), SIGNAL(viewportUpdateRequested()), viewport, SLOT(_q_viewportUpdated()));
+    QObject::connect(interactionEngine.data(), SIGNAL(contentSuspendRequested()), viewport, SLOT(_q_suspend()));
+    QObject::connect(interactionEngine.data(), SIGNAL(contentResumeRequested()), viewport, SLOT(_q_resume()));
     QObject::connect(interactionEngine.data(), SIGNAL(viewportTrajectoryVectorChanged(const QPointF&)), viewport, SLOT(_q_viewportTrajectoryVectorChanged(const QPointF&)));
     updateViewportSize();
 }
@@ -153,8 +155,17 @@
         interactionEngine->pagePositionRequest(pos);
 }
 
-void QQuickWebViewPrivate::_q_viewportUpdated()
+void QQuickWebViewPrivate::_q_suspend()
 {
+}
+
+void QQuickWebViewPrivate::_q_resume()
+{
+    updateVisibleContentRect();
+}
+
+void QQuickWebViewPrivate::updateVisibleContentRect()
+{
     Q_Q(QQuickWebView);
     const QRectF visibleRectInPageViewCoordinates = q->mapRectToItem(pageView.data(), q->boundingRect()).intersected(pageView->boundingRect());
     float scale = pageView->scale();
@@ -187,7 +198,7 @@
     wkPage->setViewportSize(viewportSize);
 
     interactionEngine->applyConstraints(computeViewportConstraints());
-    _q_viewportUpdated();
+    updateVisibleContentRect();
 }
 
 QtViewportInteractionEngine::Constraints QQuickWebViewPrivate::computeViewportConstraints()

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (101379 => 101380)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h	2011-11-29 15:56:04 UTC (rev 101380)
@@ -126,7 +126,8 @@
     QQuickWebView(WKContextRef, WKPageGroupRef, QQuickItem* parent = 0);
     WKPageRef pageRef() const;
 
-    Q_PRIVATE_SLOT(d_func(), void _q_viewportUpdated());
+    Q_PRIVATE_SLOT(d_func(), void _q_suspend());
+    Q_PRIVATE_SLOT(d_func(), void _q_resume());
     Q_PRIVATE_SLOT(d_func(), void _q_viewportTrajectoryVectorChanged(const QPointF&));
     Q_PRIVATE_SLOT(d_func(), void _q_onOpenPanelFilesSelected());
     Q_PRIVATE_SLOT(d_func(), void _q_onOpenPanelFinished(int result));

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h (101379 => 101380)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2011-11-29 15:56:04 UTC (rev 101380)
@@ -65,7 +65,10 @@
     void updateViewportSize();
     QtViewportInteractionEngine::Constraints computeViewportConstraints();
 
-    void _q_viewportUpdated();
+    void updateVisibleContentRect();
+
+    void _q_suspend();
+    void _q_resume();
     void _q_viewportTrajectoryVectorChanged(const QPointF&);
     void _q_onOpenPanelFilesSelected();
     void _q_onOpenPanelFinished(int result);

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (101379 => 101380)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2011-11-29 15:56:04 UTC (rev 101380)
@@ -37,8 +37,6 @@
 // Updating content properties cause the notify signals to be sent by the content item itself.
 // We manage these differently, as we do not want to act on them when we are the ones changing the content.
 //
-// This guard makes sure that the signal viewportUpdateRequested() is sent only when necessary.
-//
 // When multiple guards are alive, their lifetime must be perfectly imbricated (e.g. if used ouside stack
 // frames). We rely on the first one to trigger the update at the end.
 //
@@ -48,39 +46,26 @@
 public:
     ViewportUpdateGuard(QtViewportInteractionEngine* engine)
         : engine(engine)
-        , startPosition(engine->m_content->pos())
-        , startScale(engine->m_content->scale())
-        , startWidth(engine->m_content->width())
-        , startHeight(engine->m_content->height())
+    {
+        if (engine->m_suspendCount++)
+            return;
 
-    {
-        ++(engine->m_pendingUpdates);
+        engine->contentSuspendRequested();
     }
 
     ~ViewportUpdateGuard()
     {
-        if (--(engine->m_pendingUpdates))
+        if (--(engine->m_suspendCount))
             return;
 
+        emit engine->contentResumeRequested();
+
         // Make sure that tiles all around the viewport will be requested.
         emit engine->viewportTrajectoryVectorChanged(QPointF());
-
-        QQuickItem* item = engine->m_content;
-        bool needsRepaint = startPosition != item->pos() || startScale != item->scale()
-            || startWidth != item->width() || startHeight != item->height();
-
-        // We must notify the change so the client can rely on us for all changes of geometry.
-        if (needsRepaint)
-            emit engine->viewportUpdateRequested();
     }
 
 private:
     QtViewportInteractionEngine* const engine;
-
-    const QPointF startPosition;
-    const qreal startScale;
-    const qreal startWidth;
-    const qreal startHeight;
 };
 
 inline qreal QtViewportInteractionEngine::cssScaleFromItem(qreal itemScale)
@@ -96,7 +81,7 @@
 QtViewportInteractionEngine::QtViewportInteractionEngine(const QQuickItem* viewport, QQuickItem* content)
     : m_viewport(viewport)
     , m_content(content)
-    , m_pendingUpdates(0)
+    , m_suspendCount(0)
     , m_scaleAnimation(new ScaleAnimation(this))
     , m_pinchStartScale(1.f)
 {
@@ -125,6 +110,9 @@
             SLOT(scaleAnimationValueChanged(QVariant)), Qt::DirectConnection);
     connect(m_scaleAnimation, SIGNAL(stateChanged(QAbstractAnimation::State, QAbstractAnimation::State)),
             SLOT(scaleAnimationStateChanged(QAbstractAnimation::State, QAbstractAnimation::State)), Qt::DirectConnection);
+
+    connect(scroller(), SIGNAL(stateChanged(QScroller::State)),
+            SLOT(scrollStateChanged(QScroller::State)), Qt::DirectConnection);
 }
 
 QtViewportInteractionEngine::~QtViewportInteractionEngine()
@@ -179,16 +167,35 @@
 {
     switch (newState) {
     case QAbstractAnimation::Running:
-        m_pinchViewportUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
+        m_scaleUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
         break;
     case QAbstractAnimation::Stopped:
-        m_pinchViewportUpdateDeferrer.clear();
+        m_scaleUpdateDeferrer.clear();
         break;
     default:
         break;
     }
 }
 
+void QtViewportInteractionEngine::scrollStateChanged(QScroller::State newState)
+{
+    switch (newState) {
+    case QScroller::Inactive:
+        // FIXME: QScroller gets when even when tapping while it is scrolling.
+        m_scrollUpdateDeferrer.clear();
+        break;
+    case QScroller::Pressed:
+    case QScroller::Dragging:
+    case QScroller::Scrolling:
+        if (m_scrollUpdateDeferrer)
+            break;
+        m_scrollUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
+        break;
+    default:
+        break;
+    }
+}
+
 bool QtViewportInteractionEngine::event(QEvent* event)
 {
     switch (event->type()) {
@@ -209,8 +216,6 @@
         QScrollEvent* scrollEvent = static_cast<QScrollEvent*>(event);
         QPointF newPos = -scrollEvent->contentPos() - scrollEvent->overshootDistance();
         if (m_content->pos() != newPos) {
-            ViewportUpdateGuard guard(this);
-
             QPointF currentPosInContentCoordinates = m_content->mapToItem(m_content->parentItem(), m_content->pos());
             QPointF newPosInContentCoordinates = m_content->mapToItem(m_content->parentItem(), newPos);
 
@@ -263,9 +268,9 @@
 
 void QtViewportInteractionEngine::pagePositionRequest(const QPoint& pagePosition)
 {
-    // FIXME: Assert when we are suspending properly.
-    if (scrollAnimationActive() || scaleAnimationActive() || pinchGestureActive())
-        return; // Ignore.
+    // Ignore the request if suspended. Can only happen due to delay in event delivery.
+    if (m_suspendCount)
+        return;
 
     qreal endItemScale = m_content->scale(); // Stay at same scale.
 
@@ -326,6 +331,8 @@
 
 void QtViewportInteractionEngine::ensureContentWithinViewportBoundary(bool immediate)
 {
+    ASSERT(m_suspendCount);
+
     if (scrollAnimationActive() || scaleAnimationActive())
         return;
 
@@ -351,8 +358,6 @@
 
 void QtViewportInteractionEngine::reset()
 {
-    ViewportUpdateGuard guard(this);
-
     m_userInteractionFlags = UserHasNotInteractedWithContent;
 
     scroller()->stop();
@@ -365,6 +370,7 @@
         return;
 
     ViewportUpdateGuard guard(this);
+
     m_constraints = constraints;
 
     bool userHasScaledContent = m_userInteractionFlags & UserHasScaledContent;
@@ -406,7 +412,6 @@
 
 void QtViewportInteractionEngine::panGestureRequestUpdate(const QPointF& touchPoint, qint64 eventTimestampMillis)
 {
-    ViewportUpdateGuard guard(this);
     scroller()->handleInput(QScroller::InputMove, m_viewport->mapFromItem(m_content, touchPoint), eventTimestampMillis);
 }
 
@@ -419,7 +424,6 @@
 
 void QtViewportInteractionEngine::panGestureEnded(const QPointF& touchPoint, qint64 eventTimestampMillis)
 {
-    ViewportUpdateGuard guard(this);
     scroller()->handleInput(QScroller::InputRelease, m_viewport->mapFromItem(m_content, touchPoint), eventTimestampMillis);
 }
 
@@ -436,15 +440,18 @@
 
 bool QtViewportInteractionEngine::pinchGestureActive() const
 {
-    return !!m_pinchViewportUpdateDeferrer;
+    return !!m_scaleUpdateDeferrer;
 }
 
 void QtViewportInteractionEngine::pinchGestureStarted(const QPointF& pinchCenterInContentCoordinates)
 {
+    ASSERT(m_suspendCount);
+
     if (!m_constraints.isUserScalable)
         return;
 
-    m_pinchViewportUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
+    m_scaleUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
+
     m_lastPinchCenterInViewportCoordinates = m_viewport->mapFromItem(m_content, pinchCenterInContentCoordinates);
     m_userInteractionFlags |= UserHasScaledContent;
     m_userInteractionFlags |= UserHasMovedContent;
@@ -456,11 +463,11 @@
 
 void QtViewportInteractionEngine::pinchGestureRequestUpdate(const QPointF& pinchCenterInContentCoordinates, qreal totalScaleFactor)
 {
+    ASSERT(m_suspendCount);
+
     if (!m_constraints.isUserScalable)
         return;
 
-    ViewportUpdateGuard guard(this);
-
     //  Changes of the center position should move the page even if the zoom factor
     //  does not change.
     const qreal cssScale = cssScaleFromItem(m_pinchStartScale * totalScaleFactor);
@@ -479,21 +486,20 @@
 
 void QtViewportInteractionEngine::pinchGestureEnded()
 {
+    ASSERT(m_suspendCount);
+
     if (!m_constraints.isUserScalable)
         return;
 
-    m_pinchViewportUpdateDeferrer.clear();
-    // FIXME: resume the engine after the animation.
     ensureContentWithinViewportBoundary();
 }
 
 void QtViewportInteractionEngine::itemSizeChanged()
 {
     // FIXME: This needs to be done smarter. What happens if it resizes when we were interacting?
-    if (m_pendingUpdates)
+    if (m_suspendCount)
         return;
 
-    ViewportUpdateGuard guard(this);
     ensureContentWithinViewportBoundary();
 }
 

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (101379 => 101380)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2011-11-29 15:49:58 UTC (rev 101379)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2011-11-29 15:56:04 UTC (rev 101380)
@@ -94,13 +94,16 @@
     void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& endArea);
 
 Q_SIGNALS:
-    void viewportUpdateRequested();
+    void contentSuspendRequested();
+    void contentResumeRequested();
+
     void viewportTrajectoryVectorChanged(const QPointF&);
 
 private Q_SLOTS:
     // Respond to changes of content that are not driven by us, like the page resizing itself.
     void itemSizeChanged();
 
+    void scrollStateChanged(QScroller::State);
     void scaleAnimationStateChanged(QAbstractAnimation::State, QAbstractAnimation::State);
     void scaleAnimationValueChanged(QVariant value) { setItemRectVisible(value.toRectF()); }
 
@@ -124,8 +127,9 @@
     QQuickItem* const m_content;
 
     Constraints m_constraints;
-    int m_pendingUpdates;
-    OwnPtr<ViewportUpdateGuard> m_pinchViewportUpdateDeferrer;
+    int m_suspendCount;
+    OwnPtr<ViewportUpdateGuard> m_scaleUpdateDeferrer;
+    OwnPtr<ViewportUpdateGuard> m_scrollUpdateDeferrer;
     enum UserInteractionFlag {
         UserHasNotInteractedWithContent = 0,
         UserHasMovedContent = 1,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to