From 962f67243db88bf43f149cc3989a40579401d168 Mon Sep 17 00:00:00 2001 From: Raine Makelainen Date: Tue, 10 Sep 2013 22:13:21 +0300 Subject: [PATCH] [qtwebkit] Add experimental header component --- .../UIProcess/API/qt/qquickwebpage.cpp | 16 ++++- .../UIProcess/API/qt/qquickwebpage_p.h | 2 + .../UIProcess/API/qt/qquickwebview.cpp | 72 +++++++++++++++++++ .../UIProcess/API/qt/qquickwebview_p.h | 8 +++ .../UIProcess/API/qt/qquickwebview_p_p.h | 4 ++ .../qt/PageViewportControllerClientQt.cpp | 4 +- qtwebkit/Source/WebKit2/WebKit2.pri | 2 +- 7 files changed, 103 insertions(+), 5 deletions(-) diff --git a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp index a7d74b2e2..80151fc96 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp +++ b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage.cpp @@ -144,6 +144,17 @@ qreal QQuickWebPage::contentsScale() const return d->contentsScale; } +QPointF QQuickWebPage::adjustedPosition() const +{ + qreal xPos = x(); + qreal yPos = y(); + + if (d->viewportItem->experimental()->headerItem()) { + yPos -= d->viewportItem->experimental()->headerItem()->height(); + } + return QPointF(xPos, yPos); +} + QTransform QQuickWebPage::transformFromItem() const { return transformToItem().inverted(); @@ -151,8 +162,9 @@ QTransform QQuickWebPage::transformFromItem() const QTransform QQuickWebPage::transformToItem() const { - qreal xPos = x(); - qreal yPos = y(); + QPointF pos = adjustedPosition(); + qreal xPos = pos.x(); + qreal yPos = pos.y(); if (d->viewportItem->experimental()->flickableViewportEnabled()) { // Flickable moves its contentItem so we need to take that position into diff --git a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h index 3a112d62b..6f8b26b37 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h +++ b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebpage_p.h @@ -25,6 +25,7 @@ #include #include +#include class QQuickWebPagePrivate; class QQuickWebView; @@ -44,6 +45,7 @@ class QWEBKIT_EXPORT QQuickWebPage : public QQuickItem { const QSizeF& contentsSize() const; void setContentsScale(qreal); qreal contentsScale() const; + QPointF adjustedPosition() const; QTransform transformFromItem() const; QTransform transformToItem() const; diff --git a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp index 84757b39d..cf53fac1a 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp +++ b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp @@ -61,6 +61,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -271,6 +274,7 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport) , filePicker(0) , databaseQuotaDialog(0) , colorChooser(0) + , headerComponent(0) , m_firstFrameRendered(false) , m_betweenLoadCommitAndFirstFrame(false) , m_customLayoutWidth(0) @@ -799,6 +803,50 @@ void QQuickWebViewPrivate::setContentPos(const QPointF& pos) q->setContentY(pos.y()); } +void QQuickWebViewPrivate::updateHeader() +{ + Q_Q(QQuickWebView); + if (!q->isComponentComplete()) { + return; + } + + bool headerItemChanged = false; + if (headerItem) { + headerItem->setParentItem(0); + headerItem.reset(); + headerItemChanged = true; + } + + QQuickItem *item = 0; + if (headerComponent) { + QQmlContext *creationContext = headerComponent->creationContext(); + QQmlContext *context = new QQmlContext( + creationContext ? creationContext : qmlContext(q)); + QObject *nobj = headerComponent->beginCreate(context); + if (nobj) { + QQml_setParent_noEvent(context, nobj); + item = qobject_cast(nobj); + if (item) { + headerItem.reset(item); + QQml_setParent_noEvent(item, q->contentItem()); + headerItem->setParentItem(q->contentItem()); + headerItemChanged = true; + } else { + qmlInfo(q) << "Header component must be an Item"; + delete nobj; + } + } else { + qmlInfo(q) << "Creation of the header failed. Error: " << headerComponent->errors(); + delete context; + } + headerComponent->completeCreate(); + } + + if (headerItemChanged) { + emit q->experimental()->headerItemChanged(); + } +} + WebCore::IntSize QQuickWebViewPrivate::viewSize() const { return WebCore::IntSize(pageView->width(), pageView->height()); @@ -1231,6 +1279,29 @@ void QQuickWebViewExperimental::setColorChooser(QQmlComponent* colorChooser) emit colorChooserChanged(); } +QQmlComponent *QQuickWebViewExperimental::header() const +{ + Q_D(const QQuickWebView); + return d->headerComponent; +} + +void QQuickWebViewExperimental::setHeader(QQmlComponent *headerComponent) +{ + Q_Q(QQuickWebView); + Q_D(QQuickWebView); + if (d->headerComponent != headerComponent) { + d->headerComponent = headerComponent; + d->updateHeader(); + emit headerChanged(); + } +} + +QQuickItem *QQuickWebViewExperimental::headerItem() const +{ + Q_D(const QQuickWebView); + return d->headerItem.data(); +} + QString QQuickWebViewExperimental::userAgent() const { Q_D(const QQuickWebView); @@ -1877,6 +1948,7 @@ void QQuickWebView::componentComplete() d->onComponentComplete(); d->updateViewportSize(); + d->updateHeader(); } void QQuickWebView::keyPressEvent(QKeyEvent* event) diff --git a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h index 1a40f1f84..bcf3bada6 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h +++ b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h @@ -273,6 +273,8 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject { Q_PROPERTY(QQmlComponent* filePicker READ filePicker WRITE setFilePicker NOTIFY filePickerChanged) Q_PROPERTY(QQmlComponent* databaseQuotaDialog READ databaseQuotaDialog WRITE setDatabaseQuotaDialog NOTIFY databaseQuotaDialogChanged) Q_PROPERTY(QQmlComponent* colorChooser READ colorChooser WRITE setColorChooser NOTIFY colorChooserChanged) + Q_PROPERTY(QQmlComponent* header READ header WRITE setHeader NOTIFY headerChanged FINAL) + Q_PROPERTY(QQuickItem* headerItem READ headerItem NOTIFY headerItemChanged FINAL) Q_PROPERTY(QWebPreferences* preferences READ preferences CONSTANT FINAL) Q_PROPERTY(QWebKitTest* test READ test CONSTANT FINAL) @@ -309,6 +311,10 @@ class QWEBKIT_EXPORT QQuickWebViewExperimental : public QObject { void setDatabaseQuotaDialog(QQmlComponent*); QQmlComponent* colorChooser() const; void setColorChooser(QQmlComponent*); + QQmlComponent* header() const; + void setHeader(QQmlComponent*); + QQuickItem* headerItem() const; + QString userAgent() const; void setUserAgent(const QString& userAgent); int deviceWidth() const; @@ -378,6 +384,8 @@ public Q_SLOTS: void filePickerChanged(); void databaseQuotaDialogChanged(); void colorChooserChanged(); + void headerChanged(); + void headerItemChanged(); void downloadRequested(QWebDownloadItem* downloadItem); void permissionRequested(QWebPermissionRequest* permission); void messageReceived(const QVariantMap& message); diff --git a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h index 31e031257..236fb0622 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h +++ b/qtwebkit/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h @@ -129,6 +129,8 @@ class QQuickWebViewPrivate { QPointF contentPos() const; void setContentPos(const QPointF&); + void updateHeader(); + void updateIcon(); // PageClient. @@ -175,6 +177,7 @@ class QQuickWebViewPrivate { QScopedPointer pageUIClient; QScopedPointer pageView; + QScopedPointer headerItem; QQuickWebView* q_ptr; QQuickWebViewExperimental* experimental; @@ -190,6 +193,7 @@ class QQuickWebViewPrivate { QQmlComponent* filePicker; QQmlComponent* databaseQuotaDialog; QQmlComponent* colorChooser; + QQmlComponent* headerComponent; QList userScripts; diff --git a/qtwebkit/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp b/qtwebkit/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp index 77c0b7be3..565a86c5b 100644 --- a/qtwebkit/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp +++ b/qtwebkit/Source/WebKit2/UIProcess/qt/PageViewportControllerClientQt.cpp @@ -118,7 +118,7 @@ void PageViewportControllerClientQt::setContentRectVisiblePositionAtScale(const // To animate the position together with the scale we multiply the position with the current scale // and add it to the page position (displacement on the flickable contentItem because of additional items). - QPointF newPosition(m_pageItem->position() + location * itemScale); + QPointF newPosition(m_pageItem->adjustedPosition() + location * itemScale); m_viewportItem->setContentPos(newPosition); } @@ -344,7 +344,7 @@ QRectF PageViewportControllerClientQt::nearestValidVisibleContentsRect() const void PageViewportControllerClientQt::setViewportPosition(const FloatPoint& contentsPoint) { - QPointF newPosition((m_pageItem->position() + QPointF(contentsPoint)) * m_pageItem->contentsScale()); + QPointF newPosition((m_pageItem->adjustedPosition() + QPointF(contentsPoint)) * m_pageItem->contentsScale()); // The contentX and contentY property changes trigger a visible rect update. m_viewportItem->setContentPos(newPosition); } diff --git a/qtwebkit/Source/WebKit2/WebKit2.pri b/qtwebkit/Source/WebKit2/WebKit2.pri index 80cb2fb8e..7069008b6 100644 --- a/qtwebkit/Source/WebKit2/WebKit2.pri +++ b/qtwebkit/Source/WebKit2/WebKit2.pri @@ -76,6 +76,6 @@ linux-*: { LIBS += -lrt } -have?(QTQUICK): QT += qml quick +have?(QTQUICK): QT += qml qml-private quick v8-private enable?(GEOLOCATION): QT += location