Title: [99273] trunk/Source/WebKit2
Revision
99273
Author
[email protected]
Date
2011-11-04 05:28:18 -0700 (Fri, 04 Nov 2011)

Log Message

[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:

Modified Paths

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&);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to