summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/qt
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt')
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp58
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h19
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h7
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp516
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h11
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h110
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp44
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h3
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/publicapi/publicapi.pro1
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro22
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/DesktopWebView.qml9
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml (renamed from Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml)8
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_linkHovered.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_loadHtml.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml8
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_navigationRequested.qml6
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro30
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_applicationScheme.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_download.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_geopermission.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_javaScriptDialogs.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_navigationHistory.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_preferences.qml2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/qmltests.pro33
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qmltests/tst_qmltests.cpp5
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/qquickwebview.pro2
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp38
-rw-r--r--Source/WebKit2/UIProcess/API/qt/tests/tests.pri3
28 files changed, 500 insertions, 449 deletions
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
index 206ba2522..22c6703c4 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp
@@ -46,31 +46,13 @@ QQuickWebPage::~QQuickWebPage()
delete d;
}
-QtSGUpdateQueue *QQuickWebPage::sceneGraphUpdateQueue() const
-{
- return &d->sgUpdateQueue;
-}
-
-void QQuickWebPage::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
-{
- QQuickItem::geometryChanged(newGeometry, oldGeometry);
-
- if (!d->useTraditionalDesktopBehaviour)
- return;
-
- if (newGeometry.size() != oldGeometry.size())
- d->setDrawingAreaSize(newGeometry.size().toSize());
-}
-
QQuickWebPagePrivate::QQuickWebPagePrivate(QQuickWebPage* q, QQuickWebView* viewportItem)
: q(q)
, viewportItem(viewportItem)
, webPageProxy(0)
- , sgUpdateQueue(q)
, paintingIsInitialized(false)
, m_paintNode(0)
- , contentScale(1)
- , useTraditionalDesktopBehaviour(false)
+ , contentsScale(1)
{
}
@@ -112,7 +94,7 @@ void QQuickWebPagePrivate::paintToCurrentGLContext()
return;
QTransform transform = q->itemTransform(0, 0);
- transform.scale(contentScale, contentScale);
+ transform.scale(contentsScale, contentsScale);
float opacity = computeEffectiveOpacity(q);
QRectF clipRect = q->parentItem()->mapRectToScene(q->parentItem()->boundingRect());
@@ -220,47 +202,37 @@ QSGNode* QQuickWebPage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*)
return proxyNode;
}
-bool QQuickWebPage::usesTraditionalDesktopBehaviour() const
-{
- return d->useTraditionalDesktopBehaviour;
-}
-
-void QQuickWebPage::setUsesTraditionalDesktopBehaviour(bool enable)
-{
- d->useTraditionalDesktopBehaviour = enable;
-}
-
QtWebPageEventHandler* QQuickWebPage::eventHandler() const
{
return d->eventHandler.data();
}
-void QQuickWebPage::setContentSize(const QSizeF& size)
+void QQuickWebPage::setContentsSize(const QSizeF& size)
{
- if (size.isEmpty() || d->contentSize == size)
+ if (size.isEmpty() || d->contentsSize == size)
return;
- d->contentSize = size;
+ d->contentsSize = size;
d->updateSize();
- d->setDrawingAreaSize(d->contentSize.toSize());
+ d->setDrawingAreaSize(d->contentsSize.toSize());
}
-const QSizeF& QQuickWebPage::contentSize() const
+const QSizeF& QQuickWebPage::contentsSize() const
{
- return d->contentSize;
+ return d->contentsSize;
}
-void QQuickWebPage::setContentScale(qreal scale)
+void QQuickWebPage::setContentsScale(qreal scale)
{
ASSERT(scale > 0);
- d->contentScale = scale;
+ d->contentsScale = scale;
d->updateSize();
}
-qreal QQuickWebPage::contentScale() const
+qreal QQuickWebPage::contentsScale() const
{
- ASSERT(d->contentScale > 0);
- return d->contentScale;
+ ASSERT(d->contentsScale > 0);
+ return d->contentsScale;
}
QTransform QQuickWebPage::transformFromItem() const
@@ -270,12 +242,12 @@ QTransform QQuickWebPage::transformFromItem() const
QTransform QQuickWebPage::transformToItem() const
{
- return QTransform(d->contentScale, 0, 0, 0, d->contentScale, 0, x(), y(), 1);
+ return QTransform(d->contentsScale, 0, 0, 0, d->contentsScale, 0, x(), y(), 1);
}
void QQuickWebPagePrivate::updateSize()
{
- QSizeF scaledSize = contentSize * contentScale;
+ QSizeF scaledSize = contentsSize * contentsScale;
q->setSize(scaledSize);
}
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h
index bf44b9dc7..9d791ac25 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h
@@ -31,34 +31,23 @@ class QQuickWebView;
class QtWebPageEventHandler;
class QWebPreferences;
-namespace WebKit {
-class QtSGUpdateQueue;
-}
-
class QWEBKIT_EXPORT QQuickWebPage : public QQuickItem {
Q_OBJECT
public:
QQuickWebPage(QQuickWebView* view = 0);
virtual ~QQuickWebPage();
- void setContentSize(const QSizeF& size);
- const QSizeF& contentSize() const;
- void setContentScale(qreal);
- qreal contentScale() const;
+ void setContentsSize(const QSizeF& size);
+ const QSizeF& contentsSize() const;
+ void setContentsScale(qreal);
+ qreal contentsScale() const;
QTransform transformFromItem() const;
QTransform transformToItem() const;
- bool usesTraditionalDesktopBehaviour() const;
- void setUsesTraditionalDesktopBehaviour(bool enable);
-
QtWebPageEventHandler* eventHandler() const;
- // Internal. To be removed soon.
- WebKit::QtSGUpdateQueue* sceneGraphUpdateQueue() const;
-
protected:
- virtual void geometryChanged(const QRectF&, const QRectF&);
virtual QSGNode* updatePaintNode(QSGNode*, UpdatePaintNodeData*);
private:
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h
index 0c17aa5b5..dfd223dbe 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p_p.h
@@ -21,7 +21,6 @@
#ifndef qquickwebpage_p_p_h
#define qquickwebpage_p_p_h
-#include "QtSGUpdateQueue.h"
#include "qquickwebpage_p.h"
#include <QTransform>
@@ -50,13 +49,11 @@ public:
QQuickWebPage* const q;
QQuickWebView* const viewportItem;
WebKit::WebPageProxy* webPageProxy;
- WebKit::QtSGUpdateQueue sgUpdateQueue;
bool paintingIsInitialized;
QSGNode* m_paintNode;
- QSizeF contentSize;
- qreal contentScale;
- bool useTraditionalDesktopBehaviour;
+ QSizeF contentsSize;
+ qreal contentsScale;
};
#endif // qquickwebpage_p_p_h
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
index 5712ca593..7ea6d347c 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
@@ -55,6 +55,15 @@
using namespace WebCore;
+static bool s_flickableViewportEnabled = true;
+
+static QQuickWebViewPrivate* createPrivateObject(QQuickWebView* publicObject)
+{
+ if (s_flickableViewportEnabled)
+ return new QQuickWebViewFlickablePrivate(publicObject);
+ return new QQuickWebViewLegacyPrivate(publicObject);
+}
+
QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport)
: q_ptr(viewport)
, alertDialog(0)
@@ -63,9 +72,6 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport)
, authenticationDialog(0)
, certificateVerificationDialog(0)
, itemSelector(0)
- , postTransitionState(adoptPtr(new PostTransitionState(this)))
- , isTransitioningToNewPage(false)
- , pageIsSuspended(false)
, m_navigatorQtObjectEnabled(false)
, m_renderToOffscreenBuffer(false)
{
@@ -76,8 +82,6 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport)
QQuickWebViewPrivate::~QQuickWebViewPrivate()
{
- if (interactionEngine)
- interactionEngine->disconnect();
webPageProxy->close();
}
@@ -106,15 +110,11 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa
QObject::connect(q_ptr, SIGNAL(urlChanged(QUrl)), iconDatabase, SLOT(requestIconForPageURL(QUrl)));
// Any page setting should preferrable be set before creating the page.
- setUseTraditionalDesktopBehaviour(false);
webPageProxy->pageGroup()->preferences()->setAcceleratedCompositingEnabled(true);
webPageProxy->pageGroup()->preferences()->setForceCompositingMode(true);
pageClient.initialize(q_ptr, pageViewPrivate->eventHandler.data(), &undoController);
webPageProxy->initializeWebPage();
-
- // Trigger setting of correct visibility flags after everything was allocated and initialized.
- _q_onVisibleChanged();
}
void QQuickWebViewPrivate::enableMouseEvents()
@@ -131,30 +131,11 @@ void QQuickWebViewPrivate::disableMouseEvents()
q->setAcceptHoverEvents(false);
}
-void QQuickWebViewPrivate::initializeDesktop(QQuickWebView* viewport)
-{
- if (interactionEngine) {
- QObject::disconnect(interactionEngine.data(), SIGNAL(contentSuspendRequested()), viewport, SLOT(_q_suspend()));
- QObject::disconnect(interactionEngine.data(), SIGNAL(contentResumeRequested()), viewport, SLOT(_q_resume()));
- QObject::disconnect(interactionEngine.data(), SIGNAL(viewportTrajectoryVectorChanged(const QPointF&)), viewport, SLOT(_q_viewportTrajectoryVectorChanged(const QPointF&)));
- QObject::disconnect(interactionEngine.data(), SIGNAL(visibleContentRectAndScaleChanged()), viewport, SLOT(_q_updateVisibleContentRectAndScale()));
- }
- interactionEngine.reset(0);
- pageView->d->eventHandler->setViewportInteractionEngine(0);
- enableMouseEvents();
- updateDesktopViewportSize();
-}
-
-void QQuickWebViewPrivate::initializeTouch(QQuickWebView* viewport)
+void QQuickWebViewPrivate::loadDidSucceed()
{
- interactionEngine.reset(new QtViewportInteractionEngine(viewport, pageView.data()));
- pageView->d->eventHandler->setViewportInteractionEngine(interactionEngine.data());
- disableMouseEvents();
- QObject::connect(interactionEngine.data(), SIGNAL(contentSuspendRequested()), viewport, SLOT(_q_suspend()));
- QObject::connect(interactionEngine.data(), SIGNAL(contentResumeRequested()), viewport, SLOT(_q_resume()));
- QObject::connect(interactionEngine.data(), SIGNAL(viewportTrajectoryVectorChanged(const QPointF&)), viewport, SLOT(_q_viewportTrajectoryVectorChanged(const QPointF&)));
- QObject::connect(interactionEngine.data(), SIGNAL(visibleContentRectAndScaleChanged()), viewport, SLOT(_q_updateVisibleContentRectAndScale()));
- updateTouchViewportSize();
+ Q_Q(QQuickWebView);
+ emit q->navigationStateChanged();
+ emit q->loadSucceeded();
}
void QQuickWebViewPrivate::setNeedsDisplay()
@@ -171,28 +152,6 @@ void QQuickWebViewPrivate::setNeedsDisplay()
q->page()->update();
}
-void QQuickWebViewPrivate::loadDidCommit()
-{
- // Due to entering provisional load before committing, we
- // might actually be suspended here.
-
- if (pageView->usesTraditionalDesktopBehaviour())
- return;
-
- isTransitioningToNewPage = true;
-}
-
-void QQuickWebViewPrivate::didFinishFirstNonEmptyLayout()
-{
- if (pageView->usesTraditionalDesktopBehaviour())
- return;
-
- if (!pageIsSuspended) {
- isTransitioningToNewPage = false;
- postTransitionState->apply();
- }
-}
-
void QQuickWebViewPrivate::_q_onIconChangedForPageURL(const QUrl& pageURL, const QUrl& iconURL)
{
Q_Q(QQuickWebView);
@@ -202,74 +161,15 @@ void QQuickWebViewPrivate::_q_onIconChangedForPageURL(const QUrl& pageURL, const
setIcon(iconURL);
}
-void QQuickWebViewPrivate::_q_suspend()
-{
- pageIsSuspended = true;
-}
-
-void QQuickWebViewPrivate::_q_resume()
-{
- pageIsSuspended = false;
-
- if (isTransitioningToNewPage) {
- isTransitioningToNewPage = false;
- postTransitionState->apply();
- }
-
- _q_updateVisibleContentRectAndScale();
-}
-
-void QQuickWebViewPrivate::didChangeContentsSize(const QSize& newSize)
-{
- Q_Q(QQuickWebView);
- if (pageView->usesTraditionalDesktopBehaviour())
- return;
-
- // FIXME: We probably want to handle suspend here as well
- if (isTransitioningToNewPage) {
- postTransitionState->contentsSize = newSize;
- return;
- }
-
- pageView->setContentSize(newSize);
- q->m_experimental->viewportInfo()->didUpdateContentsSize();
-}
-
-void QQuickWebViewPrivate::didChangeViewportProperties(const WebCore::ViewportArguments& args)
-{
- if (pageView->usesTraditionalDesktopBehaviour())
- return;
-
- viewportArguments = args;
-
- if (isTransitioningToNewPage)
- return;
-
- interactionEngine->applyConstraints(computeViewportConstraints());
-}
-
void QQuickWebViewPrivate::didChangeBackForwardList()
{
navigationHistory->d->reset();
}
-void QQuickWebViewPrivate::pageDidRequestScroll(const QPoint& pos)
-{
- if (pageView->usesTraditionalDesktopBehaviour())
- return;
-
- if (isTransitioningToNewPage) {
- postTransitionState->position = pos;
- return;
- }
-
- interactionEngine->pagePositionRequest(pos);
-}
-
void QQuickWebViewPrivate::processDidCrash()
{
emit q_ptr->navigationStateChanged();
- pageView->d->eventHandler->resetGestureRecognizers();
+ pageView->eventHandler()->resetGestureRecognizers();
WebCore::KURL url(WebCore::ParsedURLString, webPageProxy->urlAtProcessExit());
qWarning("WARNING: The web process experienced a crash on '%s'.", qPrintable(QUrl(url).toString(QUrl::RemoveUserInfo)));
}
@@ -300,24 +200,6 @@ void QQuickWebViewPrivate::handleDownloadRequest(DownloadProxy* download)
context->downloadManager()->addDownload(download, downloadItem);
}
-void QQuickWebViewPrivate::_q_updateVisibleContentRectAndScale()
-{
- DrawingAreaProxy* drawingArea = webPageProxy->drawingArea();
- if (!drawingArea)
- return;
-
- Q_Q(QQuickWebView);
- const QRectF visibleRectInCSSCoordinates = q->mapRectToWebContent(q->boundingRect()).intersected(pageView->boundingRect());
- float scale = pageView->contentScale();
-
- QRect alignedVisibleContentRect = visibleRectInCSSCoordinates.toAlignedRect();
- drawingArea->setVisibleContentsRectAndScale(alignedVisibleContentRect, scale);
-
- // FIXME: Once we support suspend and resume, this should be delayed until the page is active if the page is suspended.
- webPageProxy->setFixedVisibleContentRect(alignedVisibleContentRect);
- q->m_experimental->viewportInfo()->didUpdateCurrentScale();
-}
-
void QQuickWebViewPrivate::_q_viewportTrajectoryVectorChanged(const QPointF& trajectoryVector)
{
DrawingAreaProxy* drawingArea = webPageProxy->drawingArea();
@@ -342,85 +224,6 @@ void QQuickWebViewPrivate::_q_onReceivedResponseFromDownload(QWebDownloadItem* d
emit q->experimental()->downloadRequested(downloadItem);
}
-void QQuickWebViewPrivate::updateDesktopViewportSize()
-{
- Q_Q(QQuickWebView);
- QSize viewportSize = q->boundingRect().size().toSize();
- pageView->setWidth(viewportSize.width());
- pageView->setHeight(viewportSize.height());
- // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently
- // wether its fixed or not. We still need to tell the drawing area which part of it
- // has to be rendered on tiles, and in desktop mode it's all of it.
- webPageProxy->drawingArea()->setVisibleContentsRectAndScale(IntRect(IntPoint(), viewportSize), 1);
-}
-
-void QQuickWebViewPrivate::updateTouchViewportSize()
-{
- Q_Q(QQuickWebView);
- QSize viewportSize = q->boundingRect().size().toSize();
-
- if (viewportSize.isEmpty())
- return;
-
- // Let the WebProcess know about the new viewport size, so that
- // it can resize the content accordingly.
- webPageProxy->setViewportSize(viewportSize);
-
- interactionEngine->applyConstraints(computeViewportConstraints());
- _q_updateVisibleContentRectAndScale();
-}
-
-void QQuickWebViewPrivate::PostTransitionState::apply()
-{
- p->interactionEngine->reset();
- p->interactionEngine->applyConstraints(p->computeViewportConstraints());
- p->interactionEngine->pagePositionRequest(position);
-
- if (contentsSize.isValid()) {
- p->pageView->setContentSize(contentsSize);
- p->q_ptr->experimental()->viewportInfo()->didUpdateContentsSize();
- }
-
- position = QPoint();
- contentsSize = QSize();
-}
-
-QtViewportInteractionEngine::Constraints QQuickWebViewPrivate::computeViewportConstraints()
-{
- Q_Q(QQuickWebView);
-
- QtViewportInteractionEngine::Constraints newConstraints;
- QSize availableSize = q->boundingRect().size().toSize();
-
- // Return default values for zero sized viewport.
- if (availableSize.isEmpty())
- return newConstraints;
-
- WebPreferences* wkPrefs = webPageProxy->pageGroup()->preferences();
-
- // FIXME: Remove later; Hardcode some values for now to make sure the DPI adjustment is being tested.
- wkPrefs->setDeviceDPI(240);
- wkPrefs->setDeviceWidth(480);
- wkPrefs->setDeviceHeight(720);
-
- int minimumLayoutFallbackWidth = qMax<int>(wkPrefs->layoutFallbackWidth(), availableSize.width());
-
- WebCore::ViewportAttributes attr = WebCore::computeViewportAttributes(viewportArguments, minimumLayoutFallbackWidth, wkPrefs->deviceWidth(), wkPrefs->deviceHeight(), wkPrefs->deviceDPI(), availableSize);
- WebCore::restrictMinimumScaleFactorToViewportSize(attr, availableSize);
- WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr);
-
- newConstraints.initialScale = attr.initialScale;
- newConstraints.minimumScale = attr.minimumScale;
- newConstraints.maximumScale = attr.maximumScale;
- newConstraints.devicePixelRatio = attr.devicePixelRatio;
- newConstraints.isUserScalable = !!attr.userScalable;
- newConstraints.layoutSize = attr.layoutSize;
-
- q->m_experimental->viewportInfo()->didUpdateViewportConstraints();
-
- return newConstraints;
-}
-
void QQuickWebViewPrivate::runJavaScriptAlert(const QString& alertText)
{
if (!alertDialog)
@@ -565,20 +368,6 @@ void QQuickWebViewPrivate::_q_onOpenPanelFinished(int result)
fileDialog = 0;
}
-void QQuickWebViewPrivate::setUseTraditionalDesktopBehaviour(bool enable)
-{
- Q_Q(QQuickWebView);
-
- // Do not guard, testing for the same value, as we call this from the constructor.
-
- webPageProxy->setUseFixedLayout(!enable);
- pageView->setUsesTraditionalDesktopBehaviour(enable);
- if (enable)
- initializeDesktop(q);
- else
- initializeTouch(q);
-}
-
void QQuickWebViewPrivate::setViewInAttachedProperties(QObject* object)
{
Q_Q(QQuickWebView);
@@ -634,6 +423,236 @@ void QQuickWebViewPrivate::didReceiveMessageFromNavigatorQtObject(const String&
emit q_ptr->experimental()->messageReceived(variantMap);
}
+QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate(QQuickWebView* viewport)
+ : QQuickWebViewPrivate(viewport)
+{
+}
+
+void QQuickWebViewLegacyPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
+{
+ QQuickWebViewPrivate::initialize(contextRef, pageGroupRef);
+ enableMouseEvents();
+
+ // Trigger setting of correct visibility flags after everything was allocated and initialized.
+ _q_onVisibleChanged();
+}
+
+void QQuickWebViewLegacyPrivate::updateViewportSize()
+{
+ Q_Q(QQuickWebView);
+ QSize viewportSize = q->boundingRect().size().toSize();
+ pageView->setContentsSize(viewportSize);
+ // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently
+ // whether its fixed or not. We still need to tell the drawing area which part of it
+ // has to be rendered on tiles, and in desktop mode it's all of it.
+ webPageProxy->drawingArea()->setVisibleContentsRectAndScale(IntRect(IntPoint(), viewportSize), 1);
+}
+
+QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* viewport)
+ : QQuickWebViewPrivate(viewport)
+ , postTransitionState(adoptPtr(new PostTransitionState(this)))
+ , isTransitioningToNewPage(false)
+ , pageIsSuspended(true)
+ , loadSuccessDispatchIsPending(false)
+{
+}
+
+QQuickWebViewFlickablePrivate::~QQuickWebViewFlickablePrivate()
+{
+ interactionEngine->disconnect();
+}
+
+void QQuickWebViewFlickablePrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef)
+{
+ QQuickWebViewPrivate::initialize(contextRef, pageGroupRef);
+ webPageProxy->setUseFixedLayout(true);
+}
+
+void QQuickWebViewFlickablePrivate::onComponentComplete()
+{
+ Q_Q(QQuickWebView);
+ interactionEngine.reset(new QtViewportInteractionEngine(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(viewportTrajectoryVectorChanged(const QPointF&)), q, SLOT(_q_viewportTrajectoryVectorChanged(const QPointF&)));
+ QObject::connect(interactionEngine.data(), SIGNAL(visibleContentRectAndScaleChanged()), q, SLOT(_q_updateVisibleContentRectAndScale()));
+
+ _q_resume();
+
+ if (loadSuccessDispatchIsPending) {
+ QQuickWebViewPrivate::loadDidSucceed();
+ loadSuccessDispatchIsPending = false;
+ }
+
+ // Trigger setting of correct visibility flags after everything was allocated and initialized.
+ _q_onVisibleChanged();
+}
+
+void QQuickWebViewFlickablePrivate::loadDidSucceed()
+{
+ if (interactionEngine)
+ QQuickWebViewPrivate::loadDidSucceed();
+ else
+ loadSuccessDispatchIsPending = true;
+
+}
+
+void QQuickWebViewFlickablePrivate::loadDidCommit()
+{
+ // Due to entering provisional load before committing, we
+ // might actually be suspended here.
+
+ isTransitioningToNewPage = true;
+}
+
+void QQuickWebViewFlickablePrivate::didFinishFirstNonEmptyLayout()
+{
+ if (!pageIsSuspended) {
+ isTransitioningToNewPage = false;
+ postTransitionState->apply();
+ }
+}
+
+void QQuickWebViewFlickablePrivate::didChangeViewportProperties(const WebCore::ViewportArguments& args)
+{
+ viewportArguments = args;
+
+ if (isTransitioningToNewPage)
+ return;
+
+ interactionEngine->applyConstraints(computeViewportConstraints());
+}
+
+void QQuickWebViewFlickablePrivate::updateViewportSize()
+{
+ Q_Q(QQuickWebView);
+ QSize viewportSize = q->boundingRect().size().toSize();
+
+ if (viewportSize.isEmpty() || !interactionEngine)
+ return;
+
+ // Let the WebProcess know about the new viewport size, so that
+ // it can resize the content accordingly.
+ webPageProxy->setViewportSize(viewportSize);
+
+ interactionEngine->applyConstraints(computeViewportConstraints());
+ _q_updateVisibleContentRectAndScale();
+}
+
+void QQuickWebViewFlickablePrivate::_q_updateVisibleContentRectAndScale()
+{
+ DrawingAreaProxy* drawingArea = webPageProxy->drawingArea();
+ if (!drawingArea)
+ return;
+
+ Q_Q(QQuickWebView);
+ const QRectF visibleRectInCSSCoordinates = q->mapRectToWebContent(q->boundingRect()).intersected(pageView->boundingRect());
+ float scale = pageView->contentsScale();
+
+ QRect alignedVisibleContentRect = visibleRectInCSSCoordinates.toAlignedRect();
+ drawingArea->setVisibleContentsRectAndScale(alignedVisibleContentRect, scale);
+
+ // FIXME: Once we support suspend and resume, this should be delayed until the page is active if the page is suspended.
+ webPageProxy->setFixedVisibleContentRect(alignedVisibleContentRect);
+ q->experimental()->viewportInfo()->didUpdateCurrentScale();
+}
+
+void QQuickWebViewFlickablePrivate::_q_suspend()
+{
+ pageIsSuspended = true;
+}
+
+void QQuickWebViewFlickablePrivate::_q_resume()
+{
+ if (!interactionEngine)
+ return;
+
+ pageIsSuspended = false;
+
+ if (isTransitioningToNewPage) {
+ isTransitioningToNewPage = false;
+ postTransitionState->apply();
+ }
+
+ _q_updateVisibleContentRectAndScale();
+}
+
+void QQuickWebViewFlickablePrivate::pageDidRequestScroll(const QPoint& pos)
+{
+ if (isTransitioningToNewPage) {
+ postTransitionState->position = pos;
+ return;
+ }
+
+ interactionEngine->pagePositionRequest(pos);
+}
+
+void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize)
+{
+ Q_Q(QQuickWebView);
+ // FIXME: We probably want to handle suspend here as well
+ if (isTransitioningToNewPage) {
+ postTransitionState->contentsSize = newSize;
+ return;
+ }
+
+ pageView->setContentsSize(newSize);
+ q->experimental()->viewportInfo()->didUpdateContentsSize();
+}
+
+QtViewportInteractionEngine::Constraints QQuickWebViewFlickablePrivate::computeViewportConstraints()
+{
+ Q_Q(QQuickWebView);
+
+ QtViewportInteractionEngine::Constraints newConstraints;
+ QSize availableSize = q->boundingRect().size().toSize();
+
+ // Return default values for zero sized viewport.
+ if (availableSize.isEmpty())
+ return newConstraints;
+
+ WebPreferences* wkPrefs = webPageProxy->pageGroup()->preferences();
+
+ // FIXME: Remove later; Hardcode some values for now to make sure the DPI adjustment is being tested.
+ wkPrefs->setDeviceDPI(240);
+ wkPrefs->setDeviceWidth(480);
+ wkPrefs->setDeviceHeight(720);
+
+ int minimumLayoutFallbackWidth = qMax<int>(wkPrefs->layoutFallbackWidth(), availableSize.width());
+
+ WebCore::ViewportAttributes attr = WebCore::computeViewportAttributes(viewportArguments, minimumLayoutFallbackWidth, wkPrefs->deviceWidth(), wkPrefs->deviceHeight(), wkPrefs->deviceDPI(), availableSize);
+ WebCore::restrictMinimumScaleFactorToViewportSize(attr, availableSize);
+ WebCore::restrictScaleFactorToInitialScaleIfNotUserScalable(attr);
+
+ newConstraints.initialScale = attr.initialScale;
+ newConstraints.minimumScale = attr.minimumScale;
+ newConstraints.maximumScale = attr.maximumScale;
+ newConstraints.devicePixelRatio = attr.devicePixelRatio;
+ newConstraints.isUserScalable = !!attr.userScalable;
+ newConstraints.layoutSize = attr.layoutSize;
+
+ q->experimental()->viewportInfo()->didUpdateViewportConstraints();
+
+ return newConstraints;
+}
+
+void QQuickWebViewFlickablePrivate::PostTransitionState::apply()
+{
+ p->interactionEngine->reset();
+ p->interactionEngine->applyConstraints(p->computeViewportConstraints());
+ p->interactionEngine->pagePositionRequest(position);
+
+ if (contentsSize.isValid()) {
+ p->pageView->setContentsSize(contentsSize);
+ p->q_ptr->experimental()->viewportInfo()->didUpdateContentsSize();
+ }
+
+ position = QPoint();
+ contentsSize = QSize();
+}
+
/*!
\qmlsignal WebView::onNavigationRequested(request)
@@ -674,16 +693,6 @@ QQuickWebViewExperimental::~QQuickWebViewExperimental()
{
}
-void QQuickWebViewExperimental::setUseTraditionalDesktopBehaviour(bool enable)
-{
- Q_D(QQuickWebView);
-
- if (enable == d->pageView->usesTraditionalDesktopBehaviour())
- return;
-
- d->setUseTraditionalDesktopBehaviour(enable);
-}
-
void QQuickWebViewExperimental::setRenderToOffscreenBuffer(bool enable)
{
Q_D(QQuickWebView);
@@ -696,6 +705,16 @@ bool QQuickWebViewExperimental::renderToOffscreenBuffer() const
return d->renderToOffscreenBuffer();
}
+void QQuickWebViewExperimental::setFlickableViewportEnabled(bool enable)
+{
+ s_flickableViewportEnabled = enable;
+}
+
+bool QQuickWebViewExperimental::flickableViewportEnabled()
+{
+ return s_flickableViewportEnabled;
+}
+
void QQuickWebViewExperimental::postMessage(const QString& message)
{
Q_D(QQuickWebView);
@@ -805,12 +824,6 @@ void QQuickWebViewExperimental::setItemSelector(QDeclarativeComponent* itemSelec
emit itemSelectorChanged();
}
-bool QQuickWebViewExperimental::useTraditionalDesktopBehaviour() const
-{
- Q_D(const QQuickWebView);
- return d->pageView->usesTraditionalDesktopBehaviour();
-}
-
QQuickUrlSchemeDelegate* QQuickWebViewExperimental::schemeDelegates_At(QDeclarativeListProperty<QQuickUrlSchemeDelegate>* property, int index)
{
const QObjectList children = property->object->children();
@@ -899,7 +912,7 @@ QQuickWebPage* QQuickWebViewExperimental::page()
QQuickWebView::QQuickWebView(QQuickItem* parent)
: QQuickItem(parent)
- , d_ptr(new QQuickWebViewPrivate(this))
+ , d_ptr(createPrivateObject(this))
, m_experimental(new QQuickWebViewExperimental(this))
{
Q_D(QQuickWebView);
@@ -908,7 +921,7 @@ QQuickWebView::QQuickWebView(QQuickItem* parent)
QQuickWebView::QQuickWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef, QQuickItem* parent)
: QQuickItem(parent)
- , d_ptr(new QQuickWebViewPrivate(this))
+ , d_ptr(createPrivateObject(this))
, m_experimental(new QQuickWebViewExperimental(this))
{
Q_D(QQuickWebView);
@@ -1084,12 +1097,17 @@ void QQuickWebView::geometryChanged(const QRectF& newGeometry, const QRectF& old
{
Q_D(QQuickWebView);
QQuickItem::geometryChanged(newGeometry, oldGeometry);
- if (newGeometry.size() != oldGeometry.size()) {
- if (d->pageView->usesTraditionalDesktopBehaviour())
- d->updateDesktopViewportSize();
- else
- d->updateTouchViewportSize();
- }
+ if (newGeometry.size() != oldGeometry.size())
+ d->updateViewportSize();
+}
+
+void QQuickWebView::componentComplete()
+{
+ Q_D(QQuickWebView);
+ QQuickItem::componentComplete();
+
+ d->onComponentComplete();
+ d->updateViewportSize();
}
void QQuickWebView::keyPressEvent(QKeyEvent* event)
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
index 7a713d133..69f1cd81b 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h
@@ -60,6 +60,10 @@ class QPainter;
class QUrl;
QT_END_NAMESPACE
+
+// Instantiating the WebView in C++ is only possible by creating
+// a QDeclarativeComponent as the initialization depends on the
+// componentComplete method being called.
class QWEBKIT_EXPORT QQuickWebView : public QQuickItem {
Q_OBJECT
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
@@ -135,7 +139,7 @@ Q_SIGNALS:
protected:
virtual void geometryChanged(const QRectF&, const QRectF&);
-
+ virtual void componentComplete();
virtual void keyPressEvent(QKeyEvent*);
virtual void keyReleaseEvent(QKeyEvent*);
virtual void inputMethodEvent(QInputMethodEvent*);
@@ -213,7 +217,6 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject {
Q_PROPERTY(QDeclarativeComponent* certificateVerificationDialog READ certificateVerificationDialog WRITE setCertificateVerificationDialog NOTIFY certificateVerificationDialogChanged)
Q_PROPERTY(QDeclarativeComponent* itemSelector READ itemSelector WRITE setItemSelector NOTIFY itemSelectorChanged)
Q_PROPERTY(QWebPreferences* preferences READ preferences CONSTANT FINAL)
- Q_PROPERTY(bool useTraditionalDesktopBehaviour READ useTraditionalDesktopBehaviour WRITE setUseTraditionalDesktopBehaviour)
Q_PROPERTY(QWebViewportInfo* viewportInfo READ viewportInfo CONSTANT FINAL)
Q_PROPERTY(QDeclarativeListProperty<QQuickUrlSchemeDelegate> urlSchemeDelegates READ schemeDelegates)
Q_ENUMS(NavigationRequestAction)
@@ -238,8 +241,6 @@ public:
void setCertificateVerificationDialog(QDeclarativeComponent*);
QDeclarativeComponent* itemSelector() const;
void setItemSelector(QDeclarativeComponent*);
- bool useTraditionalDesktopBehaviour() const;
- void setUseTraditionalDesktopBehaviour(bool enable);
QWebViewportInfo* viewportInfo();
@@ -258,6 +259,8 @@ public:
// C++ only
bool renderToOffscreenBuffer() const;
void setRenderToOffscreenBuffer(bool enable);
+ static void setFlickableViewportEnabled(bool enable);
+ static bool flickableViewportEnabled();
public Q_SLOTS:
void goBackTo(int index);
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
index 17a5cf82a..9e27ce322 100644
--- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h
@@ -61,32 +61,29 @@ class QQuickWebViewPrivate {
public:
static QQuickWebViewPrivate* get(QQuickWebView* q) { return q->d_ptr.data(); }
- QQuickWebViewPrivate(QQuickWebView* viewport);
virtual ~QQuickWebViewPrivate();
- void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
+ virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
- void initializeTouch(QQuickWebView* viewport);
- void initializeDesktop(QQuickWebView* viewport);
void enableMouseEvents();
void disableMouseEvents();
- void loadDidCommit();
-
- void didFinishFirstNonEmptyLayout();
- void didChangeViewportProperties(const WebCore::ViewportArguments& args);
+ virtual void loadDidSucceed();
+ virtual void onComponentComplete() { }
+ virtual void loadDidCommit() { }
+ virtual void didFinishFirstNonEmptyLayout() { }
+ virtual void didChangeViewportProperties(const WebCore::ViewportArguments& args) { }
void didChangeBackForwardList();
void setNeedsDisplay();
- void updateDesktopViewportSize();
+ virtual QtViewportInteractionEngine* viewportInteractionEngine() { return 0; }
+ virtual void updateViewportSize() { }
void updateTouchViewportSize();
- QtViewportInteractionEngine::Constraints computeViewportConstraints();
-
- void _q_updateVisibleContentRectAndScale();
+ virtual void _q_updateVisibleContentRectAndScale() { }
- void _q_suspend();
- void _q_resume();
+ virtual void _q_suspend() { }
+ virtual void _q_resume() { }
void _q_viewportTrajectoryVectorChanged(const QPointF&);
void _q_onOpenPanelFilesSelected();
void _q_onOpenPanelFinished(int result);
@@ -102,7 +99,6 @@ public:
void handleAuthenticationRequiredRequest(const QString& hostname, const QString& realm, const QString& prefilledUsername, QString& username, QString& password);
bool handleCertificateVerificationRequest(const QString& hostname);
- void setUseTraditionalDesktopBehaviour(bool enable);
void setRenderToOffscreenBuffer(bool enable) { m_renderToOffscreenBuffer = enable; }
void setViewInAttachedProperties(QObject*);
void setIcon(const QUrl&);
@@ -114,30 +110,15 @@ public:
// PageClient.
WebCore::IntSize viewSize() const;
void didReceiveMessageFromNavigatorQtObject(const String& message);
- void pageDidRequestScroll(const QPoint& pos);
- void didChangeContentsSize(const QSize& newSize);
+ virtual void pageDidRequestScroll(const QPoint& pos) { }
+ virtual void didChangeContentsSize(const QSize& newSize) { }
void processDidCrash();
void didRelaunchProcess();
PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
void handleDownloadRequest(DownloadProxy*);
-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();
-
- QQuickWebViewPrivate* p;
- QSize contentsSize;
- QPoint position;
- };
-
+protected:
+ QQuickWebViewPrivate(QQuickWebView* viewport);
RefPtr<QtWebContext> context;
RefPtr<WebKit::WebPageProxy> webPageProxy;
@@ -151,8 +132,6 @@ private:
QScopedPointer<QtWebPageUIClient> pageUIClient;
QScopedPointer<QQuickWebPage> pageView;
- QScopedPointer<QtViewportInteractionEngine> interactionEngine;
-
QQuickWebView* q_ptr;
QDeclarativeComponent* alertDialog;
@@ -163,15 +142,68 @@ private:
QDeclarativeComponent* itemSelector;
WebCore::ViewportArguments viewportArguments;
- OwnPtr<PostTransitionState> postTransitionState;
QFileDialog* fileDialog;
WKOpenPanelResultListenerRef openPanelResultListener;
- bool isTransitioningToNewPage;
- bool pageIsSuspended;
bool m_navigatorQtObjectEnabled;
bool m_renderToOffscreenBuffer;
QUrl m_iconURL;
};
+class QQuickWebViewLegacyPrivate : public QQuickWebViewPrivate {
+ Q_DECLARE_PUBLIC(QQuickWebView)
+public:
+ QQuickWebViewLegacyPrivate(QQuickWebView* viewport);
+ virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
+
+ virtual void updateViewportSize();
+};
+
+class QQuickWebViewFlickablePrivate : public QQuickWebViewPrivate {
+ Q_DECLARE_PUBLIC(QQuickWebView)
+public:
+ QQuickWebViewFlickablePrivate(QQuickWebView* viewport);
+ virtual ~QQuickWebViewFlickablePrivate();
+ virtual void initialize(WKContextRef contextRef = 0, WKPageGroupRef pageGroupRef = 0);
+
+ virtual void loadDidSucceed();
+ virtual void onComponentComplete();
+ virtual void loadDidCommit();
+ virtual void didFinishFirstNonEmptyLayout();
+ virtual void didChangeViewportProperties(const WebCore::ViewportArguments& args);
+ virtual QtViewportInteractionEngine* viewportInteractionEngine() { return interactionEngine.data(); }
+ virtual void updateViewportSize();
+ virtual void _q_updateVisibleContentRectAndScale();
+ virtual void _q_suspend();
+ virtual void _q_resume();
+
+ virtual void pageDidRequestScroll(const QPoint& pos);
+ virtual void didChangeContentsSize(const QSize& newSize);
+
+ QtViewportInteractionEngine::Constraints computeViewportConstraints();
+
+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(QQuickWebViewFlickablePrivate* parent)
+ : p(parent)
+ { }
+
+ void apply();
+
+ QQuickWebViewFlickablePrivate* p;
+ QSize contentsSize;
+ QPoint position;
+ };
+
+ QScopedPointer<QtViewportInteractionEngine> interactionEngine;
+ OwnPtr<PostTransitionState> postTransitionState;
+ bool isTransitioningToNewPage;
+ bool pageIsSuspended;
+ bool loadSuccessDispatchIsPending;
+};
+
#endif // qquickwebview_p_p_h
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
index 735196f86..22863be29 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo.cpp
@@ -38,63 +38,63 @@ QWebViewportInfo::~QWebViewportInfo()
QSize QWebViewportInfo::contentsSize() const
{
- return QSize(m_webViewPrivate->pageView->contentSize().toSize());
+ return QSize(m_webViewPrivate->pageView->contentsSize().toSize());
}
QVariant QWebViewportInfo::currentScale() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->currentCSSScale();
- return m_webViewPrivate->interactionEngine->currentCSSScale();
+ return QtViewportInteractionEngine::Constraints().initialScale;
}
QVariant QWebViewportInfo::devicePixelRatio() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().devicePixelRatio;
- return m_webViewPrivate->interactionEngine->constraints().devicePixelRatio;
+ return QtViewportInteractionEngine::Constraints().devicePixelRatio;
}
QVariant QWebViewportInfo::initialScale() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().initialScale;
- return m_webViewPrivate->interactionEngine->constraints().initialScale;
+ return QtViewportInteractionEngine::Constraints().initialScale;
}
QVariant QWebViewportInfo::minimumScale() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().minimumScale;
- return m_webViewPrivate->interactionEngine->constraints().minimumScale;
+ return QtViewportInteractionEngine::Constraints().minimumScale;
}
QVariant QWebViewportInfo::maximumScale() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().maximumScale;
- return m_webViewPrivate->interactionEngine->constraints().maximumScale;
+ return QtViewportInteractionEngine::Constraints().maximumScale;
}
QVariant QWebViewportInfo::isScalable() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().isUserScalable;
- return m_webViewPrivate->interactionEngine->constraints().isUserScalable;
+ return QtViewportInteractionEngine::Constraints().isUserScalable;
}
QVariant QWebViewportInfo::layoutSize() const
{
- if (!m_webViewPrivate->interactionEngine)
- return QVariant();
+ if (QtViewportInteractionEngine* interactionEngine = m_webViewPrivate->viewportInteractionEngine())
+ return interactionEngine->constraints().layoutSize;
- return m_webViewPrivate->interactionEngine->constraints().layoutSize;
+ return QVariant(QSize());
}
void QWebViewportInfo::didUpdateContentsSize()
diff --git a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
index e1dea6575..653018221 100644
--- a/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
+++ b/Source/WebKit2/UIProcess/API/qt/qwebviewportinfo_p.h
@@ -29,9 +29,6 @@
#include <QtCore/QVariant>
#include <QtDeclarative/QtDeclarative>
-namespace WebCore {
-class ViewportAttributes;
-}
class QQuickWebViewPrivate;
class QWEBKIT_EXPORT QWebViewportInfo : public QObject {
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/publicapi.pro b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/publicapi.pro
index 728521f8a..0f0d4f52c 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/publicapi.pro
+++ b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/publicapi.pro
@@ -1,2 +1,3 @@
include(../tests.pri)
+SOURCES += $${TARGET}.cpp
CONFIG += qtwebkit-private
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro
new file mode 100644
index 000000000..8b5b3cbb8
--- /dev/null
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior.pro
@@ -0,0 +1,22 @@
+include(../tests.pri)
+SOURCES += tst_qmltests.cpp
+TARGET = tst_qmltests_DesktopBehavior
+OBJECTS_DIR = obj_DesktopBehavior/$$activeBuildConfig()
+
+CONFIG += qtwebkit-private
+CONFIG += warn_on testcase
+
+QT -= testlib
+QT += qmltest
+
+DEFINES += DISABLE_FLICKABLE_VIEWPORT=1
+# Test the QML files under DesktopBehavior in the source repository.
+DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"$$PWD$${QMAKE_DIR_SEP}DesktopBehavior\\\"\"
+DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\"
+
+OTHER_FILES += \
+ DesktopBehavior/DesktopWebView.qml \
+ DesktopBehavior/tst_linkHovered.qml \
+ DesktopBehavior/tst_loadHtml.qml \
+ DesktopBehavior/tst_messaging.qml \
+ DesktopBehavior/tst_navigationRequested.qml
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/DesktopWebView.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/DesktopWebView.qml
deleted file mode 100644
index 4dce0918b..000000000
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/DesktopWebView.qml
+++ /dev/null
@@ -1,9 +0,0 @@
-import QtQuick 2.0
-import QtWebKit 3.0
-import QtWebKit.experimental 3.0
-
-WebView {
- id: component
- experimental.useTraditionalDesktopBehaviour: true
-}
-
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml
index 03d68be5b..432416a63 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_itemSelector.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_itemSelector.qml
@@ -1,13 +1,11 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
-// FIXME: used because we want to have mouseClick() to open the <select> tag. We can remove this
+// FIXME: Moved to Desktop tests because we want to have mouseClick() to open the <select> tag. We can move it back
// when TestCase starts supporting touch events, see https://bugreports.qt.nokia.com/browse/QTBUG-23083.
-import "../DesktopBehavior"
-
-DesktopWebView {
+WebView {
id: webView
width: 400
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_linkHovered.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_linkHovered.qml
index c98958319..b8ab29496 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_linkHovered.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_linkHovered.qml
@@ -2,7 +2,7 @@ import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-DesktopWebView {
+WebView {
id: webView
width: 200
height: 400
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_loadHtml.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_loadHtml.qml
index b45b01ac8..9e173d56a 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_loadHtml.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_loadHtml.qml
@@ -2,7 +2,7 @@ import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-DesktopWebView {
+WebView {
id: webView
width: 200
height: 400
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml
index 7fcc91a64..eb18a8216 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_messaging.qml
@@ -1,10 +1,10 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
Item {
- DesktopWebView {
+ WebView {
id: webView
property variant lastMessage
experimental.preferences.navigatorQtObjectEnabled: true
@@ -13,7 +13,7 @@ Item {
}
}
- DesktopWebView {
+ WebView {
id: otherWebView
property variant lastMessage
experimental.preferences.navigatorQtObjectEnabled: true
@@ -22,7 +22,7 @@ Item {
}
}
- DesktopWebView {
+ WebView {
id: disabledWebView
property bool receivedMessage
experimental.preferences.navigatorQtObjectEnabled: false
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_navigationRequested.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_navigationRequested.qml
index 3ef7d5516..169a0273e 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_navigationRequested.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/DesktopBehavior/tst_navigationRequested.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
Item {
property int expectedLength: 0
@@ -11,7 +11,7 @@ Item {
property url beginUrl: Qt.resolvedUrl("../common/test2.html")
property url endUrl: Qt.resolvedUrl("../common/test1.html")
- DesktopWebView {
+ WebView {
id: webView
width: 200
height: 200
@@ -51,7 +51,7 @@ Item {
signalName: "loadSucceeded"
}
- DesktopWebView {
+ WebView {
id: otherWebView
}
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro
new file mode 100644
index 000000000..8cd15ff4d
--- /dev/null
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView.pro
@@ -0,0 +1,30 @@
+include(../tests.pri)
+SOURCES += tst_qmltests.cpp
+TARGET = tst_qmltests_WebView
+OBJECTS_DIR = obj_WebView/$$activeBuildConfig()
+
+CONFIG += qtwebkit-private
+CONFIG += warn_on testcase
+
+QT -= testlib
+QT += qmltest
+
+# Test the QML files under WebView in the source repository.
+DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"$$PWD$${QMAKE_DIR_SEP}WebView\\\"\"
+DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\"
+
+OTHER_FILES += \
+ WebView/tst_favIconLoad.qml \
+ WebView/tst_download.qml \
+ WebView/tst_geopermission.qml \
+ WebView/tst_itemSelector.qml \
+ WebView/tst_javaScriptDialogs.qml \
+ WebView/tst_loadFail.qml \
+ WebView/tst_loadIgnore.qml \
+ WebView/tst_loadHtml.qml \
+ WebView/tst_loadProgress.qml \
+ WebView/tst_loadProgressSignal.qml \
+ WebView/tst_preferences.qml \
+ WebView/tst_properties.qml \
+ WebView/tst_titleChanged.qml \
+ WebView/tst_applicationScheme.qml
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_applicationScheme.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_applicationScheme.qml
index 239483c5b..8bcb5eccb 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_applicationScheme.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_applicationScheme.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
import Test 1.0
WebView {
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_download.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_download.qml
index 6c25af3bc..f8324a606 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_download.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_download.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
WebView {
id: webView
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_geopermission.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_geopermission.qml
index 697ab085a..fd898a78e 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_geopermission.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_geopermission.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
WebView {
id: webView
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_javaScriptDialogs.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_javaScriptDialogs.qml
index 56c34abcd..13adb3b2d 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_javaScriptDialogs.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_javaScriptDialogs.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
WebView {
id: webView
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_navigationHistory.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_navigationHistory.qml
index 68aeeb556..b886e48f3 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_navigationHistory.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_navigationHistory.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
WebView {
id: webView
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_preferences.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_preferences.qml
index 8bec01418..917b689e6 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_preferences.qml
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_preferences.qml
@@ -1,7 +1,7 @@
import QtQuick 2.0
import QtTest 1.0
import QtWebKit 3.0
-import QtWebKit.experimental 3.0
+import QtWebKit.experimental 1.0
Item {
WebView {
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/qmltests.pro b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/qmltests.pro
index c8ce87a7f..8ddc4484e 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/qmltests.pro
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/qmltests.pro
@@ -1,32 +1,3 @@
-include(../tests.pri)
+TEMPLATE = subdirs
-CONFIG += qtwebkit-private
-CONFIG += warn_on testcase
-
-QT -= testlib
-QT += qmltest
-
-# QML files tested are the ones in WebKit source repository.
-DEFINES += QUICK_TEST_SOURCE_DIR=\"\\\"$$PWD\\\"\"
-DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\"
-
-OTHER_FILES += \
- DesktopBehavior/DesktopWebView.qml \
- DesktopBehavior/tst_linkHovered.qml \
- DesktopBehavior/tst_loadHtml.qml \
- DesktopBehavior/tst_messaging.qml \
- DesktopBehavior/tst_navigationRequested.qml \
- WebView/tst_favIconLoad.qml \
- WebView/tst_download.qml \
- WebView/tst_geopermission.qml \
- WebView/tst_itemSelector.qml \
- WebView/tst_javaScriptDialogs.qml \
- WebView/tst_loadFail.qml \
- WebView/tst_loadIgnore.qml \
- WebView/tst_loadHtml.qml \
- WebView/tst_loadProgress.qml \
- WebView/tst_loadProgressSignal.qml \
- WebView/tst_preferences.qml \
- WebView/tst_properties.qml \
- WebView/tst_titleChanged.qml \
- WebView/tst_applicationScheme.qml
+SUBDIRS += DesktopBehavior.pro WebView.pro
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/tst_qmltests.cpp b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/tst_qmltests.cpp
index 8c8c4b3e6..a80c5c389 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/tst_qmltests.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/tst_qmltests.cpp
@@ -20,6 +20,7 @@
#include "../bytearraytestdata.h"
#include "../util.h"
+#include "qquickwebview_p.h"
#include <QVarLengthArray>
#include <QtQuickTest/quicktest.h>
#include <QtWidgets/QApplication>
@@ -43,5 +44,9 @@ int main(int argc, char** argv)
// This can be removed as soon as we do not use QtWidgets any more.
QApplication app(argc, argv);
qmlRegisterType<ByteArrayTestData>("Test", 1, 0, "ByteArrayTestData");
+
+#ifdef DISABLE_FLICKABLE_VIEWPORT
+ QQuickWebViewExperimental::setFlickableViewportEnabled(false);
+#endif
return quick_test_main(argc, argv, "qmltests", 0, QUICK_TEST_SOURCE_DIR);
}
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/qquickwebview.pro b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/qquickwebview.pro
index 728521f8a..25cd8324f 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/qquickwebview.pro
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/qquickwebview.pro
@@ -1,2 +1,4 @@
include(../tests.pri)
+SOURCES += $${TARGET}.cpp
CONFIG += qtwebkit-private
+DEFINES += IMPORT_DIR=\"\\\"$${ROOT_BUILD_DIR}$${QMAKE_DIR_SEP}imports\\\"\"
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp
index 1d14d1844..db3f9c977 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp
+++ b/Source/WebKit2/UIProcess/API/qt/tests/qquickwebview/tst_qquickwebview.cpp
@@ -20,6 +20,7 @@
#include "../testwindow.h"
#include "../util.h"
+#include <QDeclarativeEngine>
#include <QScopedPointer>
#include <QtTest/QtTest>
#include <qquickwebpage_p.h>
@@ -55,19 +56,42 @@ private slots:
void multipleWebViews();
private:
+ void prepareWebViewComponent();
+ inline QQuickWebView* newWebView();
inline QQuickWebView* webView() const;
QScopedPointer<TestWindow> m_window;
+ QScopedPointer<QDeclarativeComponent> m_component;
};
tst_QQuickWebView::tst_QQuickWebView()
{
addQtWebProcessToPath();
- qRegisterMetaType<QQuickWebPage*>("QQuickWebPage*");
+ prepareWebViewComponent();
+}
+
+void tst_QQuickWebView::prepareWebViewComponent()
+{
+ static QDeclarativeEngine* engine = new QDeclarativeEngine(this);
+ engine->addImportPath(QString::fromUtf8(IMPORT_DIR));
+
+ m_component.reset(new QDeclarativeComponent(engine, this));
+
+ m_component->setData(QByteArrayLiteral("import QtQuick 2.0\n"
+ "import QtWebKit 3.0\n"
+ "WebView {}")
+ , QUrl());
+}
+
+QQuickWebView* tst_QQuickWebView::newWebView()
+{
+ QObject* viewInstance = m_component->create();
+
+ return qobject_cast<QQuickWebView*>(viewInstance);
}
void tst_QQuickWebView::init()
{
- m_window.reset(new TestWindow(new QQuickWebView()));
+ m_window.reset(new TestWindow(newWebView()));
}
void tst_QQuickWebView::cleanup()
@@ -277,9 +301,9 @@ void tst_QQuickWebView::multipleWebViewWindows()
showWebView();
// This should not crash.
- QQuickWebView* webView1 = new QQuickWebView();
+ QQuickWebView* webView1 = newWebView();
QScopedPointer<TestWindow> window1(new TestWindow(webView1));
- QQuickWebView* webView2 = new QQuickWebView();
+ QQuickWebView* webView2 = newWebView();
QScopedPointer<TestWindow> window2(new TestWindow(webView2));
webView1->setSize(QSizeF(300, 400));
@@ -301,9 +325,9 @@ void tst_QQuickWebView::multipleWebViews()
showWebView();
// This should not crash.
- QScopedPointer<QQuickWebView> webView1(new QQuickWebView());
+ QScopedPointer<QQuickWebView> webView1(newWebView());
webView1->setParentItem(m_window->rootItem());
- QScopedPointer<QQuickWebView> webView2(new QQuickWebView());
+ QScopedPointer<QQuickWebView> webView2(newWebView());
webView2->setParentItem(m_window->rootItem());
webView1->setSize(QSizeF(300, 400));
@@ -328,7 +352,7 @@ void tst_QQuickWebView::scrollRequest()
// COMPARE with the position requested in the html
// Use qRound as that is also used when calculating the position
// in WebKit.
- int y = -qRound(50 * webView()->page()->contentScale());
+ int y = -qRound(50 * webView()->page()->contentsScale());
QVERIFY(webView()->page()->pos().y() == y);
}
diff --git a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
index 06ff1a0a3..ed91d3942 100644
--- a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
+++ b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri
@@ -5,8 +5,7 @@ TARGET = tst_$$TARGET
HEADERS += ../bytearraytestdata.h
-SOURCES += $${TARGET}.cpp \
- ../util.cpp \
+SOURCES += ../util.cpp \
../bytearraytestdata.cpp
INCLUDEPATH += $$PWD