Diff
Modified: trunk/Source/WebKit2/ChangeLog (119209 => 119210)
--- trunk/Source/WebKit2/ChangeLog 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/ChangeLog 2012-06-01 11:12:20 UTC (rev 119210)
@@ -1,3 +1,42 @@
+2012-05-31 Kenneth Rohde Christiansen <[email protected]>
+
+ [Qt] Clean up our viewport handling mess
+ https://bugs.webkit.org/show_bug.cgi?id=87977
+
+ Reviewed by Simon Hausmann.
+
+ Consolidated functionality from QQuickWebViewPrivate* into
+ ViewportInteractionEngine that belongs there, in preparation for
+ renaming ViewportInteractionEngine in the future.
+
+ Remove unneeded methods and move others to private.
+
+ * UIProcess/API/qt/qquickwebview.cpp:
+ (QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate):
+ (QQuickWebViewFlickablePrivate::onComponentComplete):
+ (QQuickWebViewFlickablePrivate::didChangeViewportProperties):
+ (QQuickWebViewFlickablePrivate::updateViewportSize):
+ (QQuickWebViewFlickablePrivate::_q_resume):
+ (QQuickWebViewFlickablePrivate::pageDidRequestScroll):
+ * UIProcess/API/qt/qquickwebview_p.h:
+ * UIProcess/API/qt/qquickwebview_p_p.h:
+ (QQuickWebViewPrivate):
+ (QQuickWebViewFlickablePrivate):
+ * UIProcess/qt/QtViewportInteractionEngine.cpp:
+ (WebKit::ViewportUpdateDeferrer::~ViewportUpdateDeferrer):
+ (WebKit::QtViewportInteractionEngine::QtViewportInteractionEngine):
+ (WebKit::QtViewportInteractionEngine::viewportAttributesChanged):
+ (WebKit::QtViewportInteractionEngine::pageContentsSizeChanged):
+ (WebKit::QtViewportInteractionEngine::pageItemPositionChanged):
+ (WebKit::QtViewportInteractionEngine::pageContentPositionRequested):
+ (WebKit::QtViewportInteractionEngine::visibleContentsRect):
+ (WebKit):
+ (WebKit::QtViewportInteractionEngine::informVisibleContentChange):
+ (WebKit::QtViewportInteractionEngine::viewportItemSizeChanged):
+ * UIProcess/qt/QtViewportInteractionEngine.h:
+ (WebKit):
+ (QtViewportInteractionEngine):
+
2012-05-31 Hajime Morrita <[email protected]>
REGRESSION(r117572): editing/spelling/spellcheck-async-remove-frame.html crashes on Mac
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (119209 => 119210)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-06-01 11:12:20 UTC (rev 119210)
@@ -735,16 +735,6 @@
q->setContentY(pos.y());
}
-QRect QQuickWebViewPrivate::visibleContentsRect() const
-{
- Q_Q(const QQuickWebView);
- const QRectF visibleRect(q->boundingRect().intersected(pageView->boundingRect()));
-
- // We avoid using toAlignedRect() because it produces inconsistent width and height.
- QRectF mappedRect(q->mapRectToWebContent(visibleRect));
- return QRect(floor(mappedRect.x()), floor(mappedRect.y()), floor(mappedRect.width()), floor(mappedRect.height()));
-}
-
WebCore::IntSize QQuickWebViewPrivate::viewSize() const
{
return WebCore::IntSize(pageView->width(), pageView->height());
@@ -820,7 +810,6 @@
QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* viewport)
: QQuickWebViewPrivate(viewport)
, pageIsSuspended(false)
- , lastCommittedScale(-1)
{
// Disable mouse events on the flickable web view so we do not
// select text during pan gestures on platforms which send both
@@ -846,12 +835,11 @@
{
Q_Q(QQuickWebView);
- interactionEngine.reset(new QtViewportInteractionEngine(q, pageView.data()));
+ interactionEngine.reset(new QtViewportInteractionEngine(webPageProxy.get(), q, pageView.data()));
pageView->eventHandler()->setViewportInteractionEngine(interactionEngine.data());
QObject::connect(interactionEngine.data(), SIGNAL(contentSuspendRequested()), q, SLOT(_q_suspend()));
QObject::connect(interactionEngine.data(), SIGNAL(contentResumeRequested()), q, SLOT(_q_resume()));
- QObject::connect(interactionEngine.data(), SIGNAL(informVisibleContentChange(QPointF)), q, SLOT(_q_onInformVisibleContentChange(QPointF)));
_q_resume();
@@ -861,54 +849,17 @@
void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportAttributes& newAttributes)
{
- interactionEngine->viewportAttributesChanged(newAttributes);
+ if (interactionEngine)
+ interactionEngine->viewportAttributesChanged(newAttributes);
}
void QQuickWebViewFlickablePrivate::updateViewportSize()
{
- Q_Q(QQuickWebView);
- QSize viewportSize = q->boundingRect().size().toSize();
-
- if (viewportSize.isEmpty() || !interactionEngine)
- return;
-
- WebPreferences* wkPrefs = webPageProxy->pageGroup()->preferences();
- wkPrefs->setDeviceWidth(viewportSize.width());
- wkPrefs->setDeviceHeight(viewportSize.height());
-
- // Let the WebProcess know about the new viewport size, so that
- // it can resize the content accordingly.
- webPageProxy->setViewportSize(viewportSize);
-
- _q_onInformVisibleContentChange(QPointF());
+ // FIXME: Examine why there is not an interactionEngine here in the beginning.
+ if (interactionEngine)
+ interactionEngine->viewportItemSizeChanged();
}
-void QQuickWebViewFlickablePrivate::_q_onInformVisibleContentChange(const QPointF& trajectoryVector)
-{
- Q_Q(QQuickWebView);
-
- DrawingAreaProxy* drawingArea = webPageProxy->drawingArea();
- if (!drawingArea)
- return;
-
- QRectF accurateVisibleRect(q->boundingRect());
- accurateVisibleRect.translate(contentPos());
-
- if (accurateVisibleRect == drawingArea->contentsRect())
- return;
-
- float scale = pageView->contentsScale();
-
- if (scale != lastCommittedScale)
- emit q->experimental()->test()->contentsScaleCommitted();
- lastCommittedScale = scale;
-
- drawingArea->setVisibleContentsRect(QRect(visibleContentsRect()), scale, trajectoryVector, FloatPoint(accurateVisibleRect.x(), accurateVisibleRect.y()));
-
- // Ensure that updatePaintNode is always called before painting.
- pageView->update();
-}
-
void QQuickWebViewFlickablePrivate::_q_suspend()
{
pageIsSuspended = true;
@@ -922,13 +873,11 @@
pageIsSuspended = false;
webPageProxy->resumeActiveDOMObjectsAndAnimations();
-
- _q_onInformVisibleContentChange(QPointF());
}
void QQuickWebViewFlickablePrivate::pageDidRequestScroll(const QPoint& pos)
{
- interactionEngine->pageContentPositionRequest(pos);
+ interactionEngine->pageContentPositionRequested(pos);
}
void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize)
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (119209 => 119210)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-06-01 11:12:20 UTC (rev 119210)
@@ -207,7 +207,6 @@
Q_PRIVATE_SLOT(d_func(), void _q_suspend());
Q_PRIVATE_SLOT(d_func(), void _q_resume());
- Q_PRIVATE_SLOT(d_func(), void _q_onInformVisibleContentChange(const QPointF&));
Q_PRIVATE_SLOT(d_func(), void _q_onVisibleChanged());
Q_PRIVATE_SLOT(d_func(), void _q_onUrlChanged());
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h (119209 => 119210)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h 2012-06-01 11:12:20 UTC (rev 119210)
@@ -95,7 +95,6 @@
virtual void _q_suspend() { }
virtual void _q_resume() { }
- virtual void _q_onInformVisibleContentChange(const QPointF& trajectory) { };
virtual qreal zoomFactor() const { return 1; }
virtual void setZoomFactor(qreal) { }
@@ -128,8 +127,6 @@
QPointF contentPos() const;
void setContentPos(const QPointF&);
- QRect visibleContentsRect() const;
-
void setDialogActive(bool active) { m_dialogActive = active; }
void updateIcon();
@@ -233,7 +230,6 @@
virtual void _q_suspend();
virtual void _q_resume();
- virtual void _q_onInformVisibleContentChange(const QPointF& trajectory);
virtual void pageDidRequestScroll(const QPoint& pos);
virtual void didChangeContentsSize(const QSize& newSize);
@@ -241,7 +237,6 @@
private:
QScopedPointer<WebKit::QtViewportInteractionEngine> interactionEngine;
bool pageIsSuspended;
- float lastCommittedScale;
};
#endif // qquickwebview_p_p_h
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (119209 => 119210)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2012-06-01 11:12:20 UTC (rev 119210)
@@ -22,6 +22,9 @@
#include "config.h"
#include "QtViewportInteractionEngine.h"
+#include "WebPageGroup.h"
+#include "WebPageProxy.h"
+#include "WebPreferences.h"
#include "qquickwebpage_p.h"
#include "qquickwebview_p.h"
#include "qwebkittest_p.h"
@@ -86,7 +89,7 @@
}
// Make sure that tiles all around the viewport will be requested.
- emit engine->informVisibleContentChange(QPointF());
+ engine->informVisibleContentChange(QPointF());
}
private:
@@ -132,18 +135,22 @@
return itemRect;
}
-QtViewportInteractionEngine::QtViewportInteractionEngine(QQuickWebView* viewportItem, QQuickWebPage* pageItem)
- : m_viewportItem(viewportItem)
+QtViewportInteractionEngine::QtViewportInteractionEngine(WebKit::WebPageProxy* proxy, QQuickWebView* viewportItem, QQuickWebPage* pageItem)
+ : m_webPageProxy(proxy)
+ , m_viewportItem(viewportItem)
, m_pageItem(pageItem)
+ , m_allowsUserScaling(false)
+ , m_minimumScale(1)
+ , m_maximumScale(1)
+ , m_devicePixelRatio(1)
, m_suspendCount(0)
, m_hasSuspendedContent(false)
, m_hadUserInteraction(false)
, m_scaleAnimation(new ScaleAnimation(this))
, m_pinchStartScale(-1)
+ , m_lastCommittedScale(-1)
, m_zoomOutScale(0.0)
{
- reset();
-
connect(m_pageItem, SIGNAL(widthChanged()), SLOT(pageItemSizeChanged()), Qt::DirectConnection);
connect(m_pageItem, SIGNAL(heightChanged()), SLOT(pageItemSizeChanged()), Qt::DirectConnection);
connect(m_viewportItem, SIGNAL(movementStarted()), SLOT(flickMoveStarted()), Qt::DirectConnection);
@@ -180,18 +187,36 @@
m_rawAttributes = newAttributes;
WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(m_rawAttributes);
- // FIXME: Resetting here can reset more than needed. For instance it will end deferrers.
- // This needs to be revised at some point.
- reset();
+ {
+ // FIXME: Resetting here is wrong, it should happen only for the first
+ // viewport change for a given page and first when we paint the page for
+ // the first time.
+ m_hadUserInteraction = false;
- // FIXME: Should get directly from the webPageProxy.
- setDevicePixelRatio(m_rawAttributes.devicePixelRatio);
+ m_zoomOutScale = 0.0;
+ m_scaleStack.clear();
- setAllowsUserScaling(!!m_rawAttributes.userScalable);
- setCSSScaleBounds(m_rawAttributes.minimumScale, m_rawAttributes.maximumScale);
+ // This part below should go fully away when the above plan is implemented.
+ m_viewportItem->cancelFlick();
+ m_scaleAnimation->stop();
+
+ m_scaleUpdateDeferrer.clear();
+ m_scrollUpdateDeferrer.clear();
+ m_touchUpdateDeferrer.clear();
+ m_animationUpdateDeferrer.clear();
+ ASSERT(!m_suspendCount);
+ ASSERT(!m_hasSuspendedContent);
+ }
+
+ m_devicePixelRatio = m_rawAttributes.devicePixelRatio; // Should return value from the webPageProxy.
+ m_allowsUserScaling = !!m_rawAttributes.userScalable;
+ m_minimumScale = m_rawAttributes.minimumScale;
+ m_maximumScale = m_rawAttributes.maximumScale;
+
if (!m_hadUserInteraction && !m_hasSuspendedContent) {
+ ASSERT(m_pinchStartScale == -1);
// Emits contentsScaleChanged();
setCSSScale(m_rawAttributes.initialScale);
}
@@ -209,7 +234,7 @@
float minimumScale = WebCore::computeMinimumScaleFactorForContentContained(m_rawAttributes, viewportSize, newSize);
if (!qFuzzyCompare(minimumScale, m_rawAttributes.minimumScale)) {
- setCSSScaleBounds(minimumScale, m_rawAttributes.maximumScale);
+ m_minimumScale = minimumScale;
emit m_viewportItem->experimental()->test()->viewportChanged();
if (!m_hadUserInteraction && !m_hasSuspendedContent) {
@@ -300,12 +325,12 @@
{
QPointF newPosition = m_viewportItem->contentPos();
- emit informVisibleContentChange(m_lastScrollPosition - newPosition);
+ informVisibleContentChange(m_lastScrollPosition - newPosition);
m_lastScrollPosition = newPosition;
}
-void QtViewportInteractionEngine::pageContentPositionRequest(const QPoint& cssPosition)
+void QtViewportInteractionEngine::pageContentPositionRequested(const QPoint& cssPosition)
{
// Ignore the request if suspended. Can only happen due to delay in event delivery.
if (m_suspendCount)
@@ -506,32 +531,6 @@
return endVisibleContentRect;
}
-void QtViewportInteractionEngine::reset()
-{
- ASSERT(!m_suspendCount);
-
- m_hadUserInteraction = false;
-
- m_allowsUserScaling = false;
- m_minimumScale = 1;
- m_maximumScale = 1;
- m_devicePixelRatio = 1;
- m_pinchStartScale = -1;
- m_zoomOutScale = 0.0;
-
- m_viewportItem->cancelFlick();
- m_scaleAnimation->stop();
- m_scaleUpdateDeferrer.clear();
- m_scrollUpdateDeferrer.clear();
- m_scaleStack.clear();
-}
-
-void QtViewportInteractionEngine::setCSSScaleBounds(qreal minimum, qreal maximum)
-{
- m_minimumScale = minimum;
- m_maximumScale = maximum;
-}
-
void QtViewportInteractionEngine::setCSSScale(qreal scale)
{
ViewportUpdateDeferrer guard(this);
@@ -677,6 +676,52 @@
m_scaleUpdateDeferrer.clear();
}
+QRect QtViewportInteractionEngine::visibleContentsRect() const
+{
+ const QRectF visibleRect(m_viewportItem->boundingRect().intersected(m_pageItem->boundingRect()));
+
+ // We avoid using toAlignedRect() because it produces inconsistent width and height.
+ QRectF mappedRect(m_viewportItem->mapRectToWebContent(visibleRect));
+ return QRect(floor(mappedRect.x()), floor(mappedRect.y()), floor(mappedRect.width()), floor(mappedRect.height()));
+}
+
+void QtViewportInteractionEngine::informVisibleContentChange(const QPointF& trajectoryVector)
+{
+ DrawingAreaProxy* drawingArea = m_webPageProxy->drawingArea();
+ if (!drawingArea)
+ return;
+
+ qreal scale = m_pageItem->contentsScale();
+
+ if (scale != m_lastCommittedScale)
+ emit m_viewportItem->experimental()->test()->contentsScaleCommitted();
+ m_lastCommittedScale = scale;
+
+ drawingArea->setVisibleContentsRect(visibleContentsRect(), scale, trajectoryVector, m_viewportItem->contentPos());
+
+ // Ensure that updatePaintNode is always called before painting.
+ m_pageItem->update();
+}
+
+void QtViewportInteractionEngine::viewportItemSizeChanged()
+{
+ QSize viewportSize = m_viewportItem->boundingRect().size().toSize();
+
+ if (viewportSize.isEmpty())
+ return;
+
+ // FIXME: This is wrong, add QML api!
+ WebPreferences* wkPrefs = m_webPageProxy->pageGroup()->preferences();
+ wkPrefs->setDeviceWidth(viewportSize.width());
+ wkPrefs->setDeviceHeight(viewportSize.height());
+
+ // Let the WebProcess know about the new viewport size, so that
+ // it can resize the content accordingly.
+ m_webPageProxy->setViewportSize(viewportSize);
+
+ informVisibleContentChange(QPointF());
+}
+
/*
* This is called for all changes of item scale, width or height.
* This is called when interacting, ie. during for instance pinch-zooming.
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (119209 => 119210)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2012-06-01 10:50:16 UTC (rev 119209)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2012-06-01 11:12:20 UTC (rev 119210)
@@ -40,34 +40,16 @@
namespace WebKit {
+class WebPageProxy;
class ViewportUpdateDeferrer;
class QtViewportInteractionEngine : public QObject {
Q_OBJECT
public:
- QtViewportInteractionEngine(QQuickWebView*, QQuickWebPage*);
+ QtViewportInteractionEngine(WebPageProxy*, QQuickWebView*, QQuickWebPage*);
~QtViewportInteractionEngine();
- void reset();
-
- bool hadUserInteraction() const { return m_hadUserInteraction; }
-
- void setCSSScaleBounds(qreal minimum, qreal maximum);
- void setCSSScale(qreal);
-
- qreal currentCSSScale() const;
-
- void setAllowsUserScaling(bool allow) { m_allowsUserScaling = allow; }
- void setDevicePixelRatio(qreal ratio) { m_devicePixelRatio = ratio; }
-
- void setPageItemRectVisible(const QRectF&);
- void animatePageItemRectVisible(const QRectF&);
-
- QRectF nearestValidBounds() const;
-
- void pageContentPositionRequest(const QPoint& pos);
-
void touchBegin();
void touchEnd();
@@ -92,15 +74,13 @@
void zoomToAreaGestureEnded(const QPointF& touchPoint, const QRectF& targetArea);
void focusEditableArea(const QRectF& caretArea, const QRectF& targetArea);
+ void pageContentPositionRequested(const QPoint& position);
+
+ void viewportItemSizeChanged();
void viewportAttributesChanged(const WebCore::ViewportAttributes&);
+ void informVisibleContentChange(const QPointF& trajectory = QPointF());
void pageContentsSizeChanged(const QSize& newSize, const QSize& viewportSize);
-Q_SIGNALS:
- void contentSuspendRequested();
- void contentResumeRequested();
-
- void informVisibleContentChange(const QPointF& trajectory = QPointF());
-
private Q_SLOTS:
// Respond to changes of content that are not driven by us, like the page resizing itself.
void pageItemSizeChanged();
@@ -112,10 +92,15 @@
void flickMoveStarted(); // Called when panning starts.
void flickMoveEnded(); // Called when panning (+ kinetic animation) ends.
+Q_SIGNALS:
+ void contentSuspendRequested();
+ void contentResumeRequested();
+
private:
friend class ViewportUpdateDeferrer;
friend class ::QWebKitTest;
+ WebPageProxy* const m_webPageProxy;
QQuickWebView* const m_viewportItem;
QQuickWebPage* const m_pageItem;
@@ -127,6 +112,15 @@
qreal innerBoundedCSSScale(qreal) const;
qreal outerBoundedCSSScale(qreal) const;
+ void setCSSScale(qreal);
+ qreal currentCSSScale() const;
+
+ void setPageItemRectVisible(const QRectF&);
+ void animatePageItemRectVisible(const QRectF&);
+
+ QRect visibleContentsRect() const;
+ QRectF nearestValidBounds() const;
+
QRectF computePosRangeForPageItemAtScale(qreal itemScale) const;
void scaleContent(const QPointF& centerInCSSCoordinates, qreal cssScale);
@@ -172,6 +166,7 @@
QPointF m_lastPinchCenterInViewportCoordinates;
QPointF m_lastScrollPosition;
qreal m_pinchStartScale;
+ qreal m_lastCommittedScale;
qreal m_zoomOutScale;
QList<ScaleStackItem> m_scaleStack;
};