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,