diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt')
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 |