Diff
Modified: trunk/Source/WebKit2/ChangeLog (99272 => 99273)
--- trunk/Source/WebKit2/ChangeLog 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/ChangeLog 2011-11-04 12:28:18 UTC (rev 99273)
@@ -1,3 +1,36 @@
+2011-11-04 Kenneth Rohde Christiansen <[email protected]>
+
+ [Qt] Support programmatic scrolling with the QTouchWebView
+
+ Reviewed by Simon Hausmann.
+
+ As more code can be shared between the programmatic scrolling and the
+ method for ensuring that the contents are within valid bounds, this
+ patch includes a bit of refactoring as well.
+
+ * UIProcess/API/qt/qdesktopwebview_p.h:
+ (QDesktopWebViewPrivate::scrollPositionRequested):
+ * UIProcess/API/qt/qtouchwebview.cpp:
+ (QTouchWebViewPrivate::scrollPositionRequested):
+ * UIProcess/API/qt/qtouchwebview_p.h:
+ * UIProcess/qt/QtTouchViewInterface.cpp:
+ (WebKit::QtTouchViewInterface::scrollPositionRequested):
+ * UIProcess/qt/QtTouchViewInterface.h:
+ * UIProcess/qt/QtViewInterface.h:
+ * UIProcess/qt/QtViewportInteractionEngine.cpp:
+ (WebKit::QtViewportInteractionEngine::event):
+ (WebKit::boundPosition):
+ (WebKit::QtViewportInteractionEngine::pagePositionRequest):
+ (WebKit::QtViewportInteractionEngine::computePosRangeForItemAtScale):
+ (WebKit::QtViewportInteractionEngine::ensureContentWithinViewportBoundary):
+ (WebKit::QtViewportInteractionEngine::setConstraints):
+ (WebKit::QtViewportInteractionEngine::pinchGestureEnded):
+ (WebKit::QtViewportInteractionEngine::contentViewportChanged):
+ * UIProcess/qt/QtViewportInteractionEngine.h:
+ * UIProcess/qt/QtWebPageProxy.cpp:
+ (QtWebPageProxy::pageDidRequestScroll):
+ * UIProcess/qt/QtWebPageProxy.h:
+
2011-11-03 Mark Hahnenberg <[email protected]>
De-virtualize JSObject::getPropertyNames
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qdesktopwebview_p.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/API/qt/qdesktopwebview_p.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qdesktopwebview_p.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -51,6 +51,7 @@
virtual QSize drawingAreaSize();
virtual void contentSizeChanged(const QSize&);
+ virtual void scrollPositionRequested(const QPoint& pos) { }
virtual bool isActive();
virtual bool hasFocus();
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview.cpp (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview.cpp 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview.cpp 2011-11-04 12:28:18 UTC (rev 99273)
@@ -46,6 +46,11 @@
interactionEngine->reset();
}
+void QTouchWebViewPrivate::scrollPositionRequested(const QPoint& pos)
+{
+ interactionEngine->pagePositionRequest(pos);
+}
+
void QTouchWebViewPrivate::_q_viewportUpdated()
{
Q_Q(QTouchWebView);
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview_p.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview_p.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qtouchwebview_p.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -37,6 +37,7 @@
void init(QTouchWebView* viewport);
void loadDidCommit();
+ void scrollPositionRequested(const QPoint& pos);
void _q_viewportUpdated();
void _q_viewportTrajectoryVectorChanged(const QPointF&);
void updateViewportSize();
Modified: trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.cpp (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.cpp 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.cpp 2011-11-04 12:28:18 UTC (rev 99273)
@@ -65,6 +65,11 @@
m_pageView->setHeight(newSize.height());
}
+void QtTouchViewInterface::scrollPositionRequested(const QPoint& pos)
+{
+ m_viewportView->d_func()->scrollPositionRequested(pos);
+}
+
bool QtTouchViewInterface::isActive()
{
// FIXME: The scene graph does not have the concept of being active or not when this was written.
Modified: trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtTouchViewInterface.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -47,6 +47,7 @@
virtual QSize drawingAreaSize();
virtual void contentSizeChanged(const QSize&);
+ virtual void scrollPositionRequested(const QPoint& pos);
virtual bool isActive();
virtual bool hasFocus();
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -58,6 +58,7 @@
virtual QSize drawingAreaSize() = 0;
virtual void contentSizeChanged(const QSize&) = 0;
+ virtual void scrollPositionRequested(const QPoint& pos) = 0;
virtual bool isActive() = 0;
virtual bool hasFocus() = 0;
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2011-11-04 12:28:18 UTC (rev 99273)
@@ -165,7 +165,7 @@
QScrollPrepareEvent* prepareEvent = static_cast<QScrollPrepareEvent*>(event);
const QRectF viewportRect = m_viewport->boundingRect();
const QRectF contentRect = m_viewport->mapRectFromItem(m_content, m_content->boundingRect());
- const QRectF posRange = computePosRangeForItemScale(m_content->scale());
+ const QRectF posRange = computePosRangeForItemAtScale(m_content->scale());
prepareEvent->setContentPosRange(posRange);
prepareEvent->setViewportSize(viewportRect.size());
@@ -195,8 +195,30 @@
return QObject::event(event);
}
-QRectF QtViewportInteractionEngine::computePosRangeForItemScale(qreal itemScale) const
+static inline QPointF boundPosition(const QPointF minPosition, const QPointF& position, const QPointF& maxPosition)
{
+ return QPointF(qBound(minPosition.x(), position.x(), maxPosition.x()),
+ qBound(minPosition.y(), position.y(), maxPosition.y()));
+}
+
+void QtViewportInteractionEngine::pagePositionRequest(const QPoint& pagePosition)
+{
+ // FIXME: Assert when we are suspending properly.
+ if (panAnimationActive() || pinchAnimationActive() || m_pinchViewportUpdateDeferrer)
+ return; // Ignore.
+
+ qreal endItemScale = m_content->scale(); // Stay at same scale.
+
+ QRectF endPosRange = computePosRangeForItemAtScale(endItemScale);
+ QPointF endPosition = boundPosition(endPosRange.topLeft(), pagePosition * endItemScale, endPosRange.bottomRight());
+
+ QRectF endVisibleContentRect(endPosition / endItemScale, m_viewport->boundingRect().size() / endItemScale);
+
+ updateVisibleRect(endVisibleContentRect);
+}
+
+QRectF QtViewportInteractionEngine::computePosRangeForItemAtScale(qreal itemScale) const
+{
const QSizeF contentItemSize = m_content->boundingRect().size() * itemScale;
const QSizeF viewportItemSize = m_viewport->boundingRect().size();
@@ -206,7 +228,7 @@
return QRectF(QPointF(0, 0), QSizeF(horizontalRange, verticalRange));
}
-void QtViewportInteractionEngine::animateContentIntoBoundariesIfNeeded()
+void QtViewportInteractionEngine::ensureContentWithinViewportBoundary()
{
if (panAnimationActive() || pinchAnimationActive())
return;
@@ -222,20 +244,13 @@
const QRectF viewportRect = m_viewport->boundingRect();
const QPointF viewportHotspot = viewportRect.center();
- QPointF endPosition = m_content->mapFromItem(m_viewport, viewportHotspot) - viewportHotspot / endItemScale;
+ QPointF endPosition = m_content->mapFromItem(m_viewport, viewportHotspot) * endItemScale - viewportHotspot;
- QRectF endPosRange = computePosRangeForItemScale(endItemScale);
- // Map from valid bounds in viewport coords to end contents coords.
- endPosRange.setSize(endPosRange.size() / endItemScale);
+ QRectF endPosRange = computePosRangeForItemAtScale(endItemScale);
+ endPosition = boundPosition(endPosRange.topLeft(), endPosition, endPosRange.bottomRight());
- QPointF minValue = endPosRange.topLeft();
- QPointF maxValue = endPosRange.bottomRight();
-
- endPosition.setX(qBound(minValue.x(), endPosition.x(), maxValue.x()));
- endPosition.setY(qBound(minValue.y(), endPosition.y(), maxValue.y()));
-
QRectF startVisibleContentRect = m_content->mapRectFromItem(m_viewport, viewportRect);
- QRectF endVisibleContentRect(endPosition, viewportRect.size() / endItemScale);
+ QRectF endVisibleContentRect(endPosition / endItemScale, viewportRect.size() / endItemScale);
if (endVisibleContentRect == startVisibleContentRect)
return;
@@ -284,7 +299,7 @@
ViewportUpdateGuard guard(this);
m_constraints = constraints;
- animateContentIntoBoundariesIfNeeded();
+ ensureContentWithinViewportBoundary();
}
bool QtViewportInteractionEngine::panAnimationActive() const
@@ -370,7 +385,7 @@
m_pinchViewportUpdateDeferrer.clear();
// FIXME: resume the engine after the animation.
- animateContentIntoBoundariesIfNeeded();
+ ensureContentWithinViewportBoundary();
}
void QtViewportInteractionEngine::contentViewportChanged()
@@ -379,8 +394,7 @@
return;
ViewportUpdateGuard guard(this);
-
- animateContentIntoBoundariesIfNeeded();
+ ensureContentWithinViewportBoundary();
}
void QtViewportInteractionEngine::scaleContent(const QPointF& centerInContentCoordinates, qreal cssScale)
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -66,6 +66,8 @@
void reset();
void setConstraints(const Constraints&);
+ void pagePositionRequest(const QPoint& pos);
+
bool panAnimationActive() const;
void panGestureStarted(const QPointF& touchPoint, qint64 eventTimestampMillis);
void panGestureRequestUpdate(const QPointF& touchPoint, qint64 eventTimestampMillis);
@@ -93,8 +95,8 @@
qreal innerBoundedCSSScale(qreal);
qreal outerBoundedCSSScale(qreal);
- QRectF computePosRangeForItemScale(qreal itemScale) const;
- void animateContentIntoBoundariesIfNeeded();
+ QRectF computePosRangeForItemAtScale(qreal itemScale) const;
+ void ensureContentWithinViewportBoundary();
void scaleContent(const QPointF& centerInContentCoordinates, qreal scale);
Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp 2011-11-04 12:28:18 UTC (rev 99273)
@@ -251,9 +251,9 @@
// FIXME: Implement.
}
-void QtWebPageProxy::pageDidRequestScroll(const IntPoint& point)
+void QtWebPageProxy::pageDidRequestScroll(const IntPoint& pos)
{
- emit scrollRequested(point.x(), point.y());
+ m_viewInterface->scrollPositionRequested(pos);
}
void QtWebPageProxy::didChangeContentsSize(const IntSize& newSize)
Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h (99272 => 99273)
--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h 2011-11-04 11:23:18 UTC (rev 99272)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h 2011-11-04 12:28:18 UTC (rev 99273)
@@ -186,7 +186,6 @@
void didReceiveDownloadResponse(QWebDownloadItem*);
public:
- Q_SIGNAL void scrollRequested(int dx, int dy);
Q_SIGNAL void zoomableAreaFound(const QRect&);
Q_SIGNAL void updateNavigationState();
Q_SIGNAL void receivedMessageFromNavigatorQtObject(const QVariantMap&);