Title: [114247] trunk/Source/WebKit2
Revision
114247
Author
kenn...@webkit.org
Date
2012-04-16 06:38:27 -0700 (Mon, 16 Apr 2012)

Log Message

[Qt] Clean up how the interaction engine is making use of ViewportAttributes
https://bugs.webkit.org/show_bug.cgi?id=83895

Reviewed by Simon Hausmann.

Refactor how the interaction engine is using the ViewportAttributes
and get rid of the Contraints subclass.

Push the ViewportAttributes through to the QQuickWebViewPrivate class
and add some default values in the case the Legacy view is used.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate):
(QQuickWebViewFlickablePrivate::didChangeViewportProperties):
* UIProcess/API/qt/qquickwebview_p_p.h:
(QQuickWebViewPrivate):
* UIProcess/API/qt/qwebviewportinfo.cpp:
(QWebViewportInfo::QWebViewportInfo):
(QWebViewportInfo::~QWebViewportInfo):
(QWebViewportInfo::currentScale):
(QWebViewportInfo::devicePixelRatio):
(QWebViewportInfo::initialScale):
(QWebViewportInfo::minimumScale):
(QWebViewportInfo::maximumScale):
(QWebViewportInfo::isScalable):
(QWebViewportInfo::layoutSize):
* UIProcess/qt/QtViewportInteractionEngine.cpp:
(WebKit::QtViewportInteractionEngine::cssScaleFromItem):
(WebKit::QtViewportInteractionEngine::itemScaleFromCSS):
(WebKit::QtViewportInteractionEngine::itemCoordFromCSS):
(WebKit::QtViewportInteractionEngine::innerBoundedCSSScale):
(WebKit::QtViewportInteractionEngine::outerBoundedCSSScale):
(WebKit::QtViewportInteractionEngine::zoomToAreaGestureEnded):
(WebKit::QtViewportInteractionEngine::setCSSScaleBounds):
(WebKit::QtViewportInteractionEngine::setCSSScale):
(WebKit::QtViewportInteractionEngine::pinchGestureStarted):
(WebKit::QtViewportInteractionEngine::pinchGestureRequestUpdate):
(WebKit::QtViewportInteractionEngine::pinchGestureEnded):
* UIProcess/qt/QtViewportInteractionEngine.h:
(QtViewportInteractionEngine):
(WebKit::QtViewportInteractionEngine::hadUserInteraction):
(WebKit::QtViewportInteractionEngine::setAllowsUserScaling):
(WebKit::QtViewportInteractionEngine::setContentToDevicePixelRatio):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (114246 => 114247)


--- trunk/Source/WebKit2/ChangeLog	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/ChangeLog	2012-04-16 13:38:27 UTC (rev 114247)
@@ -1,3 +1,49 @@
+2012-04-16  Kenneth Rohde Christiansen  <kenn...@webkit.org>
+
+        [Qt] Clean up how the interaction engine is making use of ViewportAttributes
+        https://bugs.webkit.org/show_bug.cgi?id=83895
+
+        Reviewed by Simon Hausmann.
+
+        Refactor how the interaction engine is using the ViewportAttributes
+        and get rid of the Contraints subclass.
+
+        Push the ViewportAttributes through to the QQuickWebViewPrivate class
+        and add some default values in the case the Legacy view is used.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate):
+        (QQuickWebViewFlickablePrivate::didChangeViewportProperties):
+        * UIProcess/API/qt/qquickwebview_p_p.h:
+        (QQuickWebViewPrivate):
+        * UIProcess/API/qt/qwebviewportinfo.cpp:
+        (QWebViewportInfo::QWebViewportInfo):
+        (QWebViewportInfo::~QWebViewportInfo):
+        (QWebViewportInfo::currentScale):
+        (QWebViewportInfo::devicePixelRatio):
+        (QWebViewportInfo::initialScale):
+        (QWebViewportInfo::minimumScale):
+        (QWebViewportInfo::maximumScale):
+        (QWebViewportInfo::isScalable):
+        (QWebViewportInfo::layoutSize):
+        * UIProcess/qt/QtViewportInteractionEngine.cpp:
+        (WebKit::QtViewportInteractionEngine::cssScaleFromItem):
+        (WebKit::QtViewportInteractionEngine::itemScaleFromCSS):
+        (WebKit::QtViewportInteractionEngine::itemCoordFromCSS):
+        (WebKit::QtViewportInteractionEngine::innerBoundedCSSScale):
+        (WebKit::QtViewportInteractionEngine::outerBoundedCSSScale):
+        (WebKit::QtViewportInteractionEngine::zoomToAreaGestureEnded):
+        (WebKit::QtViewportInteractionEngine::setCSSScaleBounds):
+        (WebKit::QtViewportInteractionEngine::setCSSScale):
+        (WebKit::QtViewportInteractionEngine::pinchGestureStarted):
+        (WebKit::QtViewportInteractionEngine::pinchGestureRequestUpdate):
+        (WebKit::QtViewportInteractionEngine::pinchGestureEnded):
+        * UIProcess/qt/QtViewportInteractionEngine.h:
+        (QtViewportInteractionEngine):
+        (WebKit::QtViewportInteractionEngine::hadUserInteraction):
+        (WebKit::QtViewportInteractionEngine::setAllowsUserScaling):
+        (WebKit::QtViewportInteractionEngine::setContentToDevicePixelRatio):
+
 2012-04-15  Carlos Garcia Campos  <cgar...@igalia.com>
 
         [GTK] Use GRefPtr to delete the default web context in WebKit2 GTK+

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


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-04-16 13:38:27 UTC (rev 114247)
@@ -481,6 +481,12 @@
 QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate(QQuickWebView* viewport)
     : QQuickWebViewPrivate(viewport)
 {
+    // Default values for the Legacy view.
+    attributes.devicePixelRatio = 1;
+    attributes.initialScale = 1;
+    attributes.minimumScale = 1;
+    attributes.maximumScale = 1;
+    attributes.userScalable = 0;
 }
 
 void QQuickWebViewLegacyPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
@@ -614,29 +620,35 @@
 {
 }
 
-void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& attributes)
+void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& newAttributes)
 {
     Q_Q(QQuickWebView);
 
     QSize viewportSize = q->boundingRect().size().toSize();
 
     // FIXME: Revise these when implementing fit-to-width.
-    WebCore::ViewportAttributes attr = attributes;
+    WebCore::ViewportAttributes attr = newAttributes;
     WebCore::restrictMinimumScaleFactorToViewportSize(attr, viewportSize);
     WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr);
 
-    QtViewportInteractionEngine::Constraints newConstraints;
-    newConstraints.initialScale = attr.initialScale;
-    newConstraints.minimumScale = attr.minimumScale;
-    newConstraints.maximumScale = attr.maximumScale;
-    newConstraints.devicePixelRatio = attr.devicePixelRatio;
-    newConstraints.isUserScalable = !!attr.userScalable;
-    newConstraints.layoutSize = attr.layoutSize;
+    // FIXME: Resetting here can reset more than needed. For instance it will end deferrers.
+    // This needs to be revised at some point.
+    interactionEngine->reset();
 
+    interactionEngine->setContentToDevicePixelRatio(attr.devicePixelRatio);
+
+    interactionEngine->setAllowsUserScaling(!!attr.userScalable);
+    interactionEngine->setCSSScaleBounds(attr.minimumScale, attr.maximumScale);
+
+    if (!interactionEngine->hadUserInteraction() && !pageIsSuspended)
+        interactionEngine->setCSSScale(attr.initialScale);
+
+    this->attributes = attr;
     q->experimental()->viewportInfo()->didUpdateViewportConstraints();
 
-    // FIXME: If suspended we should do this on resume.
-    interactionEngine->applyConstraints(newConstraints);
+    // 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);
 }
 
 void QQuickWebViewFlickablePrivate::updateViewportSize()

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


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-04-16 13:38:27 UTC (rev 114247)
@@ -36,6 +36,7 @@
 
 #include <QtCore/QObject>
 #include <QtCore/QScopedPointer>
+#include <WebCore/ViewportArguments.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/RefPtr.h>
 
@@ -160,6 +161,8 @@
     QDeclarativeComponent* filePicker;
     QDeclarativeComponent* databaseQuotaDialog;
 
+    WebCore::ViewportAttributes attributes;
+
     bool m_useDefaultContentItemSize;
     bool m_navigatorQtObjectEnabled;
     bool m_renderToOffscreenBuffer;

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp (114246 => 114247)


--- trunk/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp	2012-04-16 13:38:27 UTC (rev 114247)
@@ -28,12 +28,10 @@
     : QObject(parent)
     , m_webViewPrivate(webViewPrivate)
 {
-
 }
 
 QWebViewportInfo::~QWebViewportInfo()
 {
-
 }
 
 QSize QWebViewportInfo::contentsSize() const
@@ -46,55 +44,37 @@
     if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
         return interactionEngine->currentCSSScale();
 
-    return QtViewportInteractionEngine::Constraints().initialScale;
+    return m_webViewPrivate->attributes.initialScale;
 }
 
 QVariant QWebViewportInfo::devicePixelRatio() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().devicePixelRatio;
-
-    return QtViewportInteractionEngine::Constraints().devicePixelRatio;
+    return m_webViewPrivate->attributes.devicePixelRatio;
 }
 
 QVariant QWebViewportInfo::initialScale() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().initialScale;
-
-    return QtViewportInteractionEngine::Constraints().initialScale;
+    return m_webViewPrivate->attributes.initialScale;
 }
 
 QVariant QWebViewportInfo::minimumScale() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().minimumScale;
-
-    return QtViewportInteractionEngine::Constraints().minimumScale;
+    return m_webViewPrivate->attributes.minimumScale;
 }
 
 QVariant QWebViewportInfo::maximumScale() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().maximumScale;
-
-    return QtViewportInteractionEngine::Constraints().maximumScale;
+    return m_webViewPrivate->attributes.maximumScale;
 }
 
 QVariant QWebViewportInfo::isScalable() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().isUserScalable;
-
-    return QtViewportInteractionEngine::Constraints().isUserScalable;
+    return !!m_webViewPrivate->attributes.userScalable;
 }
 
 QVariant QWebViewportInfo::layoutSize() const
 {
-    if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
-        return interactionEngine->constraints().layoutSize;
-
-    return QVariant(QSize());
+    return QSize(m_webViewPrivate->attributes.layoutSize);
 }
 
 void QWebViewportInfo::didUpdateContentsSize()

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (114246 => 114247)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp	2012-04-16 13:38:27 UTC (rev 114247)
@@ -94,17 +94,17 @@
 
 inline qreal QtViewportInteractionEngine::cssScaleFromItem(qreal itemScale)
 {
-    return itemScale / m_constraints.devicePixelRatio;
+    return itemScale / m_devicePixelRatio;
 }
 
 inline qreal QtViewportInteractionEngine::itemScaleFromCSS(qreal cssScale)
 {
-    return cssScale * m_constraints.devicePixelRatio;
+    return cssScale * m_devicePixelRatio;
 }
 
 inline qreal QtViewportInteractionEngine::itemCoordFromCSS(qreal value)
 {
-    return value * m_constraints.devicePixelRatio;
+    return value * m_devicePixelRatio;
 }
 
 inline QRectF QtViewportInteractionEngine::itemRectFromCSS(const QRectF& cssRect)
@@ -147,15 +147,15 @@
 
 qreal QtViewportInteractionEngine::innerBoundedCSSScale(qreal cssScale)
 {
-    return qBound(m_constraints.minimumScale, cssScale, m_constraints.maximumScale);
+    return qBound(m_minimumScale, cssScale, m_maximumScale);
 }
 
 qreal QtViewportInteractionEngine::outerBoundedCSSScale(qreal cssScale)
 {
-    if (m_constraints.isUserScalable) {
+    if (m_allowsUserScaling) {
         // Bounded by [0.1, 10.0] like the viewport meta code in WebCore.
-        qreal hardMin = qMax<qreal>(0.1, qreal(0.5) * m_constraints.minimumScale);
-        qreal hardMax = qMin<qreal>(10, qreal(2.0) * m_constraints.maximumScale);
+        qreal hardMin = qMax<qreal>(0.1, qreal(0.5) * m_minimumScale);
+        qreal hardMax = qMin<qreal>(10, qreal(2.0) * m_maximumScale);
         return qBound(hardMin, cssScale, hardMax);
     }
     return innerBoundedCSSScale(cssScale);
@@ -374,7 +374,7 @@
     // We want to end up with the target area filling the whole width of the viewport (if possible),
     // and centralized vertically where the user requested zoom. Thus our hotspot is the center of
     // the targetArea x-wise and the requested zoom position, y-wise.
-    const QPointF hotspot = QPointF(endArea.center().x(), touchPoint.y() * m_constraints.devicePixelRatio);
+    const QPointF hotspot = QPointF(endArea.center().x(), touchPoint.y() * m_devicePixelRatio);
     const QPointF viewportHotspot = viewportRect.center();
 
     QPointF endPosition = hotspot * endItemScale - viewportHotspot;
@@ -419,31 +419,29 @@
 
     m_hadUserInteraction = false;
 
+    m_allowsUserScaling = false;
+    m_minimumScale = 1;
+    m_maximumScale = 1;
+    m_devicePixelRatio = 1;
+
     m_viewport->cancelFlick();
     m_scaleAnimation->stop();
     m_scaleUpdateDeferrer.clear();
     m_scrollUpdateDeferrer.clear();
 }
 
-void QtViewportInteractionEngine::applyConstraints(const Constraints& constraints)
+void QtViewportInteractionEngine::setCSSScaleBounds(qreal minimum, qreal maximum)
 {
-    // We always have to apply the constrains even if they didn't change, as
-    // the initial scale might need to be applied.
+    m_minimumScale = minimum;
+    m_maximumScale = maximum;
+}
 
-    reset();
-
+void QtViewportInteractionEngine::setCSSScale(qreal scale)
+{
     ViewportUpdateDeferrer guard(this);
 
-    m_constraints = constraints;
-
-    if (!m_hadUserInteraction) {
-        qreal initialScale = innerBoundedCSSScale(m_constraints.initialScale);
-        m_content->setContentsScale(itemScaleFromCSS(initialScale));
-    }
-
-    // If the web app successively changes the viewport on purpose
-    // it wants to be in control and we should disable animations.
-    ensureContentWithinViewportBoundary(/* immediate */ true);
+    qreal newScale = innerBoundedCSSScale(scale);
+    m_content->setContentsScale(itemScaleFromCSS(newScale));
 }
 
 qreal QtViewportInteractionEngine::currentCSSScale()
@@ -523,7 +521,7 @@
 
 void QtViewportInteractionEngine::pinchGestureStarted(const QPointF& pinchCenterInViewportCoordinates)
 {
-    if (!m_constraints.isUserScalable)
+    if (!m_allowsUserScaling)
         return;
 
     m_hadUserInteraction = true;
@@ -541,7 +539,7 @@
 {
     ASSERT(m_suspendCount);
 
-    if (!m_constraints.isUserScalable)
+    if (!m_allowsUserScaling)
         return;
 
     //  Changes of the center position should move the page even if the zoom factor
@@ -563,7 +561,7 @@
 {
     ASSERT(m_suspendCount);
 
-    if (!m_constraints.isUserScalable)
+    if (!m_allowsUserScaling)
         return;
 
     m_pinchStartScale = -1;

Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (114246 => 114247)


--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2012-04-16 13:19:41 UTC (rev 114246)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h	2012-04-16 13:38:27 UTC (rev 114247)
@@ -49,27 +49,20 @@
     QtViewportInteractionEngine(QQuickWebView*, QQuickWebPage*);
     ~QtViewportInteractionEngine();
 
-    struct Constraints {
-        Constraints()
-            : initialScale(1.0)
-            , minimumScale(0.25)
-            , maximumScale(1.8)
-            , devicePixelRatio(1.0)
-            , isUserScalable(true)
-            , layoutSize(QSize())
-        { }
+    void reset();
 
-        qreal initialScale;
-        qreal minimumScale;
-        qreal maximumScale;
-        qreal devicePixelRatio;
-        bool isUserScalable;
-        QSize layoutSize;
-    };
+    bool hadUserInteraction() const { return m_hadUserInteraction; }
 
-    void reset();
-    void applyConstraints(const Constraints&);
+    void setCSSScaleBounds(qreal minimum, qreal maximum);
+    void setCSSScale(qreal);
 
+    qreal currentCSSScale();
+
+    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&);
 
@@ -98,9 +91,6 @@
     void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& targetArea);
     void focusEditableArea(const QRectF& caretArea, const QRectF& targetArea);
 
-    const Constraints& constraints() const { return m_constraints; }
-    qreal currentCSSScale();
-
 Q_SIGNALS:
     void contentSuspendRequested();
     void contentResumeRequested();
@@ -124,7 +114,11 @@
 
 private:
     friend class ViewportUpdateDeferrer;
+    friend class QWebViewportInfo;
 
+    QQuickWebView* const m_viewport;
+    QQuickWebPage* const m_content;
+
     qreal cssScaleFromItem(qreal);
     qreal itemScaleFromCSS(qreal);
     qreal itemCoordFromCSS(qreal);
@@ -133,16 +127,17 @@
     qreal innerBoundedCSSScale(qreal);
     qreal outerBoundedCSSScale(qreal);
 
+    bool m_allowsUserScaling;
+    qreal m_minimumScale;
+    qreal m_maximumScale;
+    qreal m_devicePixelRatio;
+
+    QSize m_layoutSize;
+
     QRectF computePosRangeForItemAtScale(qreal itemScale) const;
-    bool ensureContentWithinViewportBoundary(bool immediate = false);
 
     void scaleContent(const QPointF& centerInCSSCoordinates, qreal cssScale);
 
-    QQuickWebView* const m_viewport;
-    QQuickWebPage* const m_content;
-
-    Constraints m_constraints;
-
     int m_suspendCount;
     bool m_hasSuspendedContent;
     OwnPtr<ViewportUpdateDeferrer> m_scaleUpdateDeferrer;
@@ -166,14 +161,6 @@
     qreal m_pinchStartScale;
 };
 
-inline bool operator==(const QtViewportInteractionEngine::Constraints& a, const QtViewportInteractionEngine::Constraints& b)
-{
-    return a.initialScale == b.initialScale
-            && a.minimumScale == b.minimumScale
-            && a.maximumScale == b.maximumScale
-            && a.isUserScalable == b.isUserScalable;
 }
 
-}
-
 #endif // QtViewportInteractionEngine_h
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to