Diff
Modified: trunk/Source/WebKit2/ChangeLog (100589 => 100590)
--- trunk/Source/WebKit2/ChangeLog 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/ChangeLog 2011-11-17 10:56:26 UTC (rev 100590)
@@ -1,3 +1,43 @@
+2011-11-17 Zalan Bujtas <zbuj...@gmail.com>
+
+ [Qt][WK2] Do not apply new viewport properties until after the first visually non-empty layout.
+ https://bugs.webkit.org/show_bug.cgi?id=72508
+
+ Delay applying viewport properties on the viewport item until after the first visually non-empty
+ layout finished. It enables the viewport to be intact until the new page is ready to be rendered.
+
+ Reviewed by Kenneth Rohde Christiansen.
+
+ * UIProcess/API/qt/qquickwebview.cpp:
+ (QQuickWebViewPrivate::QQuickWebViewPrivate):
+ (QQuickWebViewPrivate::loadDidCommit):
+ (QQuickWebViewPrivate::didFinishFirstNonEmptyLayout):
+ (QQuickWebViewPrivate::didChangeContentsSize):
+ (QQuickWebViewPrivate::didChangeViewportProperties):
+ (QQuickWebViewPrivate::updateViewportSize):
+ (QQuickWebViewPrivate::computeViewportConstraints):
+ * UIProcess/API/qt/qquickwebview_p.h:
+ (PostTransitionState::isTransitioningToNewPage):
+ * UIProcess/qt/ClientImpl.cpp:
+ (qt_wk_didFirstVisuallyNonEmptyLayoutForFrame):
+ (setupPageLoaderClient):
+ * UIProcess/qt/QtViewInterface.cpp:
+ (WebKit::QtViewInterface::didFinishFirstNonEmptyLayout):
+ (WebKit::QtViewInterface::didChangeContentsSize):
+ (WebKit::QtViewInterface::didChangeViewportProperties):
+ (WebKit::QtViewInterface::startDrag):
+ * UIProcess/qt/QtViewInterface.h:
+ * UIProcess/qt/QtViewportInteractionEngine.cpp:
+ (WebKit::QtViewportInteractionEngine::reset):
+ (WebKit::QtViewportInteractionEngine::applyConstraints):
+ * UIProcess/qt/QtViewportInteractionEngine.h:
+ * UIProcess/qt/QtWebPageProxy.cpp:
+ (QtWebPageProxy::didFinishFirstNonEmptyLayout):
+ (QtWebPageProxy::didChangeContentsSize):
+ (QtWebPageProxy::didChangeViewportProperties):
+ (QtWebPageProxy::startDrag):
+ * UIProcess/qt/QtWebPageProxy.h:
+
2011-11-17 Eunmi Lee <eunmi15....@samsung.com>
Reviewed by Martin Robinson.
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2011-11-17 10:56:26 UTC (rev 100590)
@@ -39,6 +39,8 @@
QQuickWebViewPrivate::QQuickWebViewPrivate()
: q_ptr(0)
+ , postTransitionState(adoptPtr(new PostTransitionState(this)))
+ , transitioningToNewPage(false)
, useTraditionalDesktopBehaviour(false)
{
}
@@ -103,19 +105,46 @@
void QQuickWebViewPrivate::loadDidCommit()
{
- if (!useTraditionalDesktopBehaviour)
- interactionEngine->reset();
+ transitioningToNewPage = true;
}
-void QQuickWebViewPrivate::contentSizeChanged(const QSize& newSize)
+void QQuickWebViewPrivate::didFinishFirstNonEmptyLayout()
{
+ transitioningToNewPage = false;
+
if (useTraditionalDesktopBehaviour)
return;
+ postTransitionState->apply();
+}
+
+void QQuickWebViewPrivate::didChangeContentsSize(const QSize& newSize)
+{
+ if (useTraditionalDesktopBehaviour)
+ return;
+
+ if (isTransitioningToNewPage()) {
+ postTransitionState->contentsSize = newSize;
+ return;
+ }
+
pageView->setWidth(newSize.width());
pageView->setHeight(newSize.height());
}
+void QQuickWebViewPrivate::didChangeViewportProperties(const WebCore::ViewportArguments& args)
+{
+ if (useTraditionalDesktopBehaviour)
+ return;
+
+ viewportArguments = args;
+
+ if (isTransitioningToNewPage())
+ return;
+
+ interactionEngine->applyConstraints(computeViewportConstraints());
+}
+
void QQuickWebViewPrivate::scrollPositionRequested(const QPoint& pos)
{
if (!useTraditionalDesktopBehaviour)
@@ -142,7 +171,6 @@
wkPage->viewStateDidChange(WebPageProxy::ViewIsVisible);
}
-
void QQuickWebViewPrivate::updateViewportSize()
{
Q_Q(QQuickWebView);
@@ -155,17 +183,18 @@
// Let the WebProcess know about the new viewport size, so that
// it can resize the content accordingly.
wkPage->setViewportSize(viewportSize);
- updateViewportConstraints();
+
+ interactionEngine->applyConstraints(computeViewportConstraints());
_q_viewportUpdated();
}
-void QQuickWebViewPrivate::updateViewportConstraints()
+QtViewportInteractionEngine::Constraints QQuickWebViewPrivate::computeViewportConstraints()
{
Q_Q(QQuickWebView);
+
QSize availableSize = q->boundingRect().size().toSize();
- if (availableSize.isEmpty())
- return;
+ Q_ASSERT(!availableSize.isEmpty());
WebPageProxy* wkPage = toImpl(pageProxy->pageRef());
WebPreferences* wkPrefs = wkPage->pageGroup()->preferences();
@@ -182,27 +211,16 @@
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;
- interactionEngine->setConstraints(newConstraints);
- // Overwrite minimum scale value with fit-to-view value, unless the the content author
- // explicitly says no. NB: We can only do this when we know we have a valid size, ie.
- // after initial layout has completed.
+ return newConstraints;
}
-void QQuickWebViewPrivate::didChangeViewportProperties(const WebCore::ViewportArguments& args)
-{
- if (useTraditionalDesktopBehaviour)
- return;
- viewportArguments = args;
- updateViewportConstraints();
-}
-
-
void QQuickWebViewPrivate::runJavaScriptAlert(const QString& alertText)
{
#ifndef QT_NO_MESSAGEBOX
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2011-11-17 10:56:26 UTC (rev 100590)
@@ -30,6 +30,7 @@
#include <QtCore/QObject>
#include <QtCore/QScopedPointer>
+#include <wtf/OwnPtr.h>
class QtWebPageProxy;
@@ -51,10 +52,14 @@
void disableMouseEvents();
void loadDidCommit();
- void contentSizeChanged(const QSize& newSize);
+
+ void didFinishFirstNonEmptyLayout();
+ void didChangeContentsSize(const QSize& newSize);
+ void didChangeViewportProperties(const WebCore::ViewportArguments& args);
+
void scrollPositionRequested(const QPoint& pos);
void updateViewportSize();
- void updateViewportConstraints();
+ QtViewportInteractionEngine::Constraints computeViewportConstraints();
static QQuickWebViewPrivate* get(QQuickWebView* view)
{
@@ -74,21 +79,51 @@
void runJavaScriptAlert(const QString&);
bool runJavaScriptConfirm(const QString&);
QString runJavaScriptPrompt(const QString&, const QString& defaultValue, bool& ok);
- void didChangeViewportProperties(const WebCore::ViewportArguments& args);
public slots:
void setUseTraditionalDesktopBehaviour(bool enable);
private:
+
+ // This class is responsible for collecting and applying all properties
+ // on the viewport item, when transitioning from page A to page B is finished.
+ // See more at https://trac.webkit.org/wiki/QtWebKitLayoutInteraction
+ class PostTransitionState {
+ public:
+ PostTransitionState(QQuickWebViewPrivate* parent)
+ : p(parent)
+ { }
+
+ void apply()
+ {
+ p->interactionEngine->reset();
+ p->interactionEngine->applyConstraints(p->computeViewportConstraints());
+
+ if (contentsSize.isValid()) {
+ p->pageView->setWidth(contentsSize.width());
+ p->pageView->setHeight(contentsSize.height());
+ }
+
+ contentsSize = QSize();
+ }
+
+ QQuickWebViewPrivate* p;
+ QSize contentsSize;
+ };
+
+ bool isTransitioningToNewPage() const { return transitioningToNewPage; }
+
QScopedPointer<QQuickWebPage> pageView;
QScopedPointer<WebKit::QtViewInterface> viewInterface;
QScopedPointer<QtViewportInteractionEngine> interactionEngine;
- WebCore::ViewportArguments viewportArguments;
-
QQuickWebView* q_ptr;
QScopedPointer<QtWebPageProxy> pageProxy;
+ WebCore::ViewportArguments viewportArguments;
+ OwnPtr<PostTransitionState> postTransitionState;
+ bool transitioningToNewPage;
+
bool useTraditionalDesktopBehaviour;
QFileDialog* fileDialog;
WKOpenPanelResultListenerRef openPanelResultListener;
Modified: trunk/Source/WebKit2/UIProcess/qt/ClientImpl.cpp (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/ClientImpl.cpp 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/ClientImpl.cpp 2011-11-17 10:56:26 UTC (rev 100590)
@@ -151,6 +151,14 @@
toQtWebPageProxy(clientInfo)->didChangeLoadProgress(100);
}
+static void qt_wk_didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo)
+{
+ if (!WKFrameIsMainFrame(frame))
+ return;
+
+ toQtWebPageProxy(clientInfo)->didFinishFirstNonEmptyLayout();
+}
+
static void qt_wk_runJavaScriptAlert(WKPageRef page, WKStringRef alertText, WKFrameRef frame, const void* clientInfo)
{
QString qAlertText = WKStringCopyQString(alertText);
@@ -316,6 +324,7 @@
loadClient.didStartProgress = qt_wk_didStartProgress;
loadClient.didChangeProgress = qt_wk_didChangeProgress;
loadClient.didFinishProgress = qt_wk_didFinishProgress;
+ loadClient.didFirstVisuallyNonEmptyLayoutForFrame = qt_wk_didFirstVisuallyNonEmptyLayoutForFrame;
WKPageSetPageLoaderClient(qtWebPageProxy->pageRef(), &loadClient);
}
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.cpp (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.cpp 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.cpp 2011-11-17 10:56:26 UTC (rev 100590)
@@ -57,11 +57,21 @@
return QSize(m_pageView->width(), m_pageView->height());
}
-void QtViewInterface::contentSizeChanged(const QSize& newSize)
+void QtViewInterface::didFinishFirstNonEmptyLayout()
{
- m_viewportView->d_func()->contentSizeChanged(newSize);
+ m_viewportView->d_func()->didFinishFirstNonEmptyLayout();
}
+void QtViewInterface::didChangeContentsSize(const QSize& newSize)
+{
+ m_viewportView->d_func()->didChangeContentsSize(newSize);
+}
+
+void QtViewInterface::didChangeViewportProperties(const WebCore::ViewportArguments& args)
+{
+ m_viewportView->d_func()->didChangeViewportProperties(args);
+}
+
void QtViewInterface::scrollPositionRequested(const QPoint& pos)
{
m_viewportView->d_func()->scrollPositionRequested(pos);
@@ -97,12 +107,6 @@
*clientPosition = window->mapFromGlobal(*globalPosition);
}
-
-void QtViewInterface::didChangeViewportProperties(const WebCore::ViewportArguments& args)
-{
- m_viewportView->d_func()->didChangeViewportProperties(args);
-}
-
void QtViewInterface::didChangeUrl(const QUrl& url)
{
emit m_viewportView->urlChanged(url);
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewInterface.h 2011-11-17 10:56:26 UTC (rev 100590)
@@ -65,7 +65,6 @@
virtual void setViewNeedsDisplay(const QRect&);
virtual QSize drawingAreaSize();
- virtual void contentSizeChanged(const QSize&);
virtual void scrollPositionRequested(const QPoint& pos);
virtual bool isActive();
@@ -73,6 +72,9 @@
virtual bool isVisible();
virtual void startDrag(Qt::DropActions supportedDropActions, const QImage& dragImage, QMimeData*, QPoint* clientPosition, QPoint* globalPosition, Qt::DropAction*);
+
+ virtual void didFinishFirstNonEmptyLayout();
+ virtual void didChangeContentsSize(const QSize&);
virtual void didChangeViewportProperties(const WebCore::ViewportArguments&);
virtual void didChangeUrl(const QUrl&);
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp 2011-11-17 10:56:26 UTC (rev 100590)
@@ -330,10 +330,9 @@
properties.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0.33);
scroller()->setScrollerProperties(properties);
- setConstraints(Constraints());
}
-void QtViewportInteractionEngine::setConstraints(const Constraints& constraints)
+void QtViewportInteractionEngine::applyConstraints(const Constraints& constraints)
{
if (m_constraints == constraints)
return;
Modified: trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h 2011-11-17 10:56:26 UTC (rev 100590)
@@ -65,7 +65,7 @@
bool event(QEvent*);
void reset();
- void setConstraints(const Constraints&);
+ void applyConstraints(const Constraints&);
void setItemRectVisible(const QRectF&);
void animateItemRectVisible(const QRectF&);
Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp 2011-11-17 10:56:26 UTC (rev 100590)
@@ -446,11 +446,21 @@
m_viewInterface->scrollPositionRequested(pos);
}
+void QtWebPageProxy::didFinishFirstNonEmptyLayout()
+{
+ m_viewInterface->didFinishFirstNonEmptyLayout();
+}
+
void QtWebPageProxy::didChangeContentsSize(const IntSize& newSize)
{
- m_viewInterface->contentSizeChanged(QSize(newSize));
+ m_viewInterface->didChangeContentsSize(QSize(newSize));
}
+void QtWebPageProxy::didChangeViewportProperties(const WebCore::ViewportArguments& args)
+{
+ m_viewInterface->didChangeViewportProperties(args);
+}
+
void QtWebPageProxy::toolTipChanged(const String&, const String& newTooltip)
{
m_viewInterface->didChangeToolTip(QString(newTooltip));
@@ -792,11 +802,6 @@
m_webPageProxy->dragEnded(clientPosition, globalPosition, dropActionToDragOperation(actualDropAction));
}
-void QtWebPageProxy::didChangeViewportProperties(const WebCore::ViewportArguments& args)
-{
- m_viewInterface->didChangeViewportProperties(args);
-}
-
void QtWebPageProxy::handleDownloadRequest(DownloadProxy* download)
{
// This function is responsible for hooking up a DownloadProxy to our API layer
Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h (100589 => 100590)
--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h 2011-11-17 10:12:11 UTC (rev 100589)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h 2011-11-17 10:56:26 UTC (rev 100590)
@@ -99,10 +99,12 @@
virtual void processDidCrash();
virtual void pageClosed() { }
virtual void didRelaunchProcess();
+
+ virtual void didFinishFirstNonEmptyLayout();
virtual void didChangeContentsSize(const WebCore::IntSize&);
+ virtual void didChangeViewportProperties(const WebCore::ViewportArguments&);
virtual void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
- virtual void didChangeViewportProperties(const WebCore::ViewportArguments&);
virtual void setCursor(const WebCore::Cursor&);
virtual void setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves);
virtual void toolTipChanged(const WTF::String&, const WTF::String&);