diff options
Diffstat (limited to 'src/webengine/api')
-rw-r--r-- | src/webengine/api/qquickwebenginedialogrequests.cpp | 110 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginedialogrequests_p.h | 33 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginedownloaditem.cpp | 29 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginedownloaditem_p.h | 5 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginedownloaditem_p_p.h | 4 | ||||
-rw-r--r-- | src/webengine/api/qquickwebenginenavigationrequest.cpp | 2 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineprofile.cpp | 3 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 57 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p.h | 26 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 3 |
10 files changed, 259 insertions, 13 deletions
diff --git a/src/webengine/api/qquickwebenginedialogrequests.cpp b/src/webengine/api/qquickwebenginedialogrequests.cpp index d6bba9a98..da1aecaf6 100644 --- a/src/webengine/api/qquickwebenginedialogrequests.cpp +++ b/src/webengine/api/qquickwebenginedialogrequests.cpp @@ -44,6 +44,9 @@ #include "file_picker_controller.h" #include "web_contents_adapter_client.h" +#include <QCursor> +#include <QQuickItem> + QT_BEGIN_NAMESPACE using namespace QtWebEngineCore; @@ -823,4 +826,111 @@ void QQuickWebEngineFormValidationMessageRequest::setAccepted(bool accepted) m_accepted = accepted; } +/////////////////////////////////////////////////////////////////////////////// + +/*! + \qmltype TooltipRequest + \instantiates QQuickWebEngineTooltipRequest + \inqmlmodule QtWebEngine + \since QtWebEngine 1.10 + + \brief A request for showing a tooltip to the user. +*/ + +QQuickWebEngineTooltipRequest::QQuickWebEngineTooltipRequest( + const QString &text, QObject *parent): + QObject(parent) + , m_text(text) + , m_type(text.isEmpty() ? RequestType::Hide : RequestType::Show) + , m_accepted(false) +{ + Q_ASSERT(parent); + if (QQuickItem *view = qobject_cast<QQuickItem *>(parent)) + m_position = view->mapFromGlobal(view->cursor().pos()).toPoint(); +} + +QQuickWebEngineTooltipRequest::~QQuickWebEngineTooltipRequest() +{ + +} + +/*! + \qmlproperty int TooltipRequest::x + \readonly + + The x coordinate of the top-left corner of the requested tooltip. +*/ + +int QQuickWebEngineTooltipRequest::x() const +{ + return m_position.x(); +} + +/*! + \qmlproperty int TooltipRequest::y + \readonly + + The y coordinate of the top-left corner of the requested tooltip. +*/ + +int QQuickWebEngineTooltipRequest::y() const +{ + return m_position.y(); +} + +/*! + \qmlproperty bool TooltipRequest::text + \readonly + + The text of the tooltip. It contains an empty string when the + tooltip should be hidden. +*/ + + +QString QQuickWebEngineTooltipRequest::text() const +{ + return m_text; +} + +/*! + \qmlproperty enumeration TooltipRequest::type + \readonly + + The type of the tooltip request. + + \value TooltipRequest.Show + The tooltip should be shown. + \value TooltipRequest.Hide + The tooltip should be hidden. +*/ + +QQuickWebEngineTooltipRequest::RequestType QQuickWebEngineTooltipRequest::type() const +{ + return m_type; +} + +/*! + \qmlproperty bool TooltipRequest::accepted + + Indicates whether the tooltip request has been accepted + by the signal handler. + + If the property is \c false after any signal handlers + for WebEngineView::tooltipRequested have been executed, + a default tooltip will be shown. + To prevent this, set \c {request.accepted} to \c true. + + The default is \c false. +*/ + +bool QQuickWebEngineTooltipRequest::isAccepted() const +{ + return m_accepted; +} + +void QQuickWebEngineTooltipRequest::setAccepted(bool accepted) +{ + m_accepted = accepted; +} + QT_END_NAMESPACE diff --git a/src/webengine/api/qquickwebenginedialogrequests_p.h b/src/webengine/api/qquickwebenginedialogrequests_p.h index cdb10c26b..5e3f7c547 100644 --- a/src/webengine/api/qquickwebenginedialogrequests_p.h +++ b/src/webengine/api/qquickwebenginedialogrequests_p.h @@ -260,6 +260,39 @@ private: friend class QQuickWebEngineViewPrivate; }; +class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineTooltipRequest : public QObject { + Q_OBJECT +public: + enum RequestType { + Show, + Hide, + }; + Q_ENUM(RequestType) + Q_PROPERTY(int x READ x CONSTANT FINAL) + Q_PROPERTY(int y READ y CONSTANT FINAL) + Q_PROPERTY(QString text READ text CONSTANT FINAL) + Q_PROPERTY(RequestType type READ type CONSTANT FINAL) + Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted FINAL) + + ~QQuickWebEngineTooltipRequest(); + int x() const; + int y() const; + QString text() const; + RequestType type() const; + bool isAccepted() const; + void setAccepted(bool accepted); + +private: + QQuickWebEngineTooltipRequest(const QString &text = QString(), + QObject *parent = nullptr); + QPoint m_position; + QString m_text; + RequestType m_type; + bool m_accepted; + friend class QQuickWebEngineViewPrivate; + Q_DISABLE_COPY(QQuickWebEngineTooltipRequest) +}; + QT_END_NAMESPACE #endif // QQUICKWEBENGINDIALOGREQUESTS_H diff --git a/src/webengine/api/qquickwebenginedownloaditem.cpp b/src/webengine/api/qquickwebenginedownloaditem.cpp index 7d51ed21d..2b3e50a72 100644 --- a/src/webengine/api/qquickwebenginedownloaditem.cpp +++ b/src/webengine/api/qquickwebenginedownloaditem.cpp @@ -98,7 +98,7 @@ static inline QQuickWebEngineDownloadItem::DownloadInterruptReason toDownloadInt return static_cast<QQuickWebEngineDownloadItem::DownloadInterruptReason>(reason); } -QQuickWebEngineDownloadItemPrivate::QQuickWebEngineDownloadItemPrivate(QQuickWebEngineProfile *p) +QQuickWebEngineDownloadItemPrivate::QQuickWebEngineDownloadItemPrivate(QQuickWebEngineProfile *p, const QUrl &url) : profile(p) , downloadId(-1) , downloadState(QQuickWebEngineDownloadItem::DownloadCancelled) @@ -110,6 +110,7 @@ QQuickWebEngineDownloadItemPrivate::QQuickWebEngineDownloadItemPrivate(QQuickWeb , downloadFinished(false) , downloadPaused(false) , view(nullptr) + , downloadUrl(url) { } @@ -388,6 +389,20 @@ qint64 QQuickWebEngineDownloadItem::receivedBytes() const } /*! + \qmlproperty url WebEngineDownloadItem::url + \readonly + \since QtWebEngine 1.10 + + Returns the download's origin URL. +*/ + +QUrl QQuickWebEngineDownloadItem::url() const +{ + Q_D(const QQuickWebEngineDownloadItem); + return d->downloadUrl; +} + +/*! \qmlproperty string WebEngineDownloadItem::mimeType \since QtWebEngine 1.2 @@ -443,6 +458,18 @@ void QQuickWebEngineDownloadItem::setPath(QString path) Q_EMIT pathChanged(); } } +/*! + \qmlproperty string WebEngineDownloadItem::suggestedFileName + \since QtWebEngine 1.10 + + Returns the suggested file name. +*/ + +QString QQuickWebEngineDownloadItem::suggestedFileName() const +{ + Q_D(const QQuickWebEngineDownloadItem); + return d->suggestedFileName; +} /*! \qmlproperty enumeration WebEngineDownloadItem::savePageFormat diff --git a/src/webengine/api/qquickwebenginedownloaditem_p.h b/src/webengine/api/qquickwebenginedownloaditem_p.h index d19ca4828..613b0173d 100644 --- a/src/webengine/api/qquickwebenginedownloaditem_p.h +++ b/src/webengine/api/qquickwebenginedownloaditem_p.h @@ -55,6 +55,7 @@ #include <QObject> #include <QScopedPointer> #include <QString> +#include <QUrl> QT_BEGIN_NAMESPACE @@ -136,6 +137,8 @@ public: Q_PROPERTY(bool isPaused READ isPaused NOTIFY isPausedChanged REVISION 5 FINAL) Q_PROPERTY(bool isSavePageDownload READ isSavePageDownload CONSTANT REVISION 6 FINAL) Q_PROPERTY(QQuickWebEngineView *view READ view CONSTANT REVISION 7 FINAL) + Q_PROPERTY(QUrl url READ url CONSTANT REVISION 8 FINAL) + Q_PROPERTY(QString suggestedFileName READ suggestedFileName CONSTANT REVISION 8 FINAL) Q_INVOKABLE void accept(); Q_INVOKABLE void cancel(); @@ -158,6 +161,8 @@ public: bool isPaused() const; bool isSavePageDownload() const; QQuickWebEngineView *view() const; + QUrl url() const; + QString suggestedFileName() const; Q_SIGNALS: void stateChanged(); diff --git a/src/webengine/api/qquickwebenginedownloaditem_p_p.h b/src/webengine/api/qquickwebenginedownloaditem_p_p.h index f444c04a5..e4d90d8ef 100644 --- a/src/webengine/api/qquickwebenginedownloaditem_p_p.h +++ b/src/webengine/api/qquickwebenginedownloaditem_p_p.h @@ -67,7 +67,7 @@ class QQuickWebEngineDownloadItemPrivate { friend class QQuickWebEngineProfilePrivate; public: Q_DECLARE_PUBLIC(QQuickWebEngineDownloadItem) - QQuickWebEngineDownloadItemPrivate(QQuickWebEngineProfile *p); + QQuickWebEngineDownloadItemPrivate(QQuickWebEngineProfile *p, const QUrl &url); ~QQuickWebEngineDownloadItemPrivate(); quint32 downloadId; @@ -82,6 +82,8 @@ public: bool downloadFinished; bool downloadPaused; QQuickWebEngineView *view; + QUrl downloadUrl; + QString suggestedFileName; void update(const QtWebEngineCore::ProfileAdapterClient::DownloadItemInfo &info); void updateState(QQuickWebEngineDownloadItem::DownloadState newState); diff --git a/src/webengine/api/qquickwebenginenavigationrequest.cpp b/src/webengine/api/qquickwebenginenavigationrequest.cpp index a6e253561..03c1d3d78 100644 --- a/src/webengine/api/qquickwebenginenavigationrequest.cpp +++ b/src/webengine/api/qquickwebenginenavigationrequest.cpp @@ -143,6 +143,8 @@ QQuickWebEngineView::NavigationRequestAction QQuickWebEngineNavigationRequest::a Using navigation history to go to the previous or next page. \value WebEngineNavigationRequest.ReloadNavigation Reloading the page. + \value WebEngineNavigationRequest.RedirectNavigation + Page content or server triggered a redirection or page refresh. \value WebEngineNavigationRequest.OtherNavigation Using some other method to go to a page. */ diff --git a/src/webengine/api/qquickwebengineprofile.cpp b/src/webengine/api/qquickwebengineprofile.cpp index 4832ba303..2dbd0e94b 100644 --- a/src/webengine/api/qquickwebengineprofile.cpp +++ b/src/webengine/api/qquickwebengineprofile.cpp @@ -237,12 +237,13 @@ void QQuickWebEngineProfilePrivate::downloadRequested(DownloadItemInfo &info) Q_Q(QQuickWebEngineProfile); Q_ASSERT(!m_ongoingDownloads.contains(info.id)); - QQuickWebEngineDownloadItemPrivate *itemPrivate = new QQuickWebEngineDownloadItemPrivate(q); + QQuickWebEngineDownloadItemPrivate *itemPrivate = new QQuickWebEngineDownloadItemPrivate(q, info.url); itemPrivate->downloadId = info.id; itemPrivate->downloadState = QQuickWebEngineDownloadItem::DownloadRequested; itemPrivate->totalBytes = info.totalBytes; itemPrivate->mimeType = info.mimeType; itemPrivate->downloadPath = info.path; + itemPrivate->suggestedFileName = info.suggestedFileName; itemPrivate->savePageFormat = static_cast<QQuickWebEngineDownloadItem::SavePageFormat>( info.savePageFormat); itemPrivate->type = static_cast<QQuickWebEngineDownloadItem::DownloadType>(info.downloadType); diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index bb8428951..583678aaf 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -136,7 +136,7 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() memset(actions, 0, sizeof(actions)); QString platform = qApp->platformName().toLower(); - if (platform == QLatin1Literal("eglfs")) + if (platform == QLatin1String("eglfs")) m_ui2Enabled = true; const QByteArray dialogSet = qgetenv("QTWEBENGINE_DIALOG_SET"); @@ -705,6 +705,25 @@ const QObject *QQuickWebEngineViewPrivate::holdingQObject() const return q; } +void QQuickWebEngineViewPrivate::lifecycleStateChanged(LifecycleState state) +{ + Q_Q(QQuickWebEngineView); + Q_EMIT q->lifecycleStateChanged(static_cast<QQuickWebEngineView::LifecycleState>(state)); +} + +void QQuickWebEngineViewPrivate::recommendedStateChanged(LifecycleState state) +{ + Q_Q(QQuickWebEngineView); + QTimer::singleShot(0, q, [q, state]() { + Q_EMIT q->recommendedStateChanged(static_cast<QQuickWebEngineView::LifecycleState>(state)); + }); +} + +void QQuickWebEngineViewPrivate::visibleChanged(bool visible) +{ + Q_UNUSED(visible); +} + #ifndef QT_NO_ACCESSIBILITY QQuickWebEngineViewAccessible::QQuickWebEngineViewAccessible(QQuickWebEngineView *o) : QAccessibleObject(o) @@ -844,8 +863,8 @@ void QQuickWebEngineViewPrivate::initializationFinished() for (QQuickWebEngineScript *script : qAsConst(m_userScripts)) script->d_func()->bind(profileAdapter()->userResourceController(), adapter.data()); - if (q->window() && q->isVisible()) - adapter->wasShown(); + if (q->window()) + adapter->setVisible(q->isVisible()); if (!m_isBeingAdopted) return; @@ -1237,7 +1256,13 @@ bool QQuickWebEngineViewPrivate::isEnabled() const void QQuickWebEngineViewPrivate::setToolTip(const QString &toolTipText) { - ui()->showToolTip(toolTipText); + Q_Q(QQuickWebEngineView); + QQuickWebEngineTooltipRequest *request = new QQuickWebEngineTooltipRequest(toolTipText, q); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->tooltipRequested(request); + if (!request->isAccepted()) + ui()->showToolTip(toolTipText); } QtWebEngineCore::TouchHandleDrawableClient *QQuickWebEngineViewPrivate::createTouchHandle(const QMap<int, QImage> &images) @@ -1633,10 +1658,8 @@ void QQuickWebEngineView::itemChange(ItemChange change, const ItemChangeData &va Q_D(QQuickWebEngineView); if (d && d->profileInitialized() && d->adapter->isInitialized() && (change == ItemSceneChange || change == ItemVisibleHasChanged)) { - if (window() && isVisible()) - d->adapter->wasShown(); - else - d->adapter->wasHidden(); + if (window()) + d->adapter->setVisible(isVisible()); } QQuickItem::itemChange(change, value); } @@ -2148,6 +2171,24 @@ void QQuickWebEngineView::lazyInitialize() d->ensureContentsAdapter(); } +QQuickWebEngineView::LifecycleState QQuickWebEngineView::lifecycleState() const +{ + Q_D(const QQuickWebEngineView); + return static_cast<LifecycleState>(d->adapter->lifecycleState()); +} + +void QQuickWebEngineView::setLifecycleState(LifecycleState state) +{ + Q_D(QQuickWebEngineView); + d->adapter->setLifecycleState(static_cast<WebContentsAdapterClient::LifecycleState>(state)); +} + +QQuickWebEngineView::LifecycleState QQuickWebEngineView::recommendedState() const +{ + Q_D(const QQuickWebEngineView); + return static_cast<LifecycleState>(d->adapter->recommendedState()); +} + QQuickWebEngineFullScreenRequest::QQuickWebEngineFullScreenRequest() : m_viewPrivate(0) , m_toggleOn(false) diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index c851dcb8d..3c8e1d9ec 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -76,6 +76,7 @@ class QQuickWebEngineNavigationRequest; class QQuickWebEngineNewViewRequest; class QQuickWebEngineProfile; class QQuickWebEngineSettings; +class QQuickWebEngineTooltipRequest; class QQuickWebEngineFormValidationMessageRequest; class QQuickWebEngineViewPrivate; class QWebEngineQuotaRequest; @@ -104,10 +105,11 @@ private: const bool m_toggleOn; }; -#define LATEST_WEBENGINEVIEW_REVISION 9 +#define LATEST_WEBENGINEVIEW_REVISION 10 class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineView : public QQuickItem { Q_OBJECT + Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged FINAL) Q_PROPERTY(QUrl icon READ icon NOTIFY iconChanged FINAL) Q_PROPERTY(bool loading READ isLoading NOTIFY loadingChanged FINAL) @@ -136,6 +138,9 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineView : public QQuickItem { Q_PROPERTY(QQuickWebEngineTestSupport *testSupport READ testSupport WRITE setTestSupport NOTIFY testSupportChanged FINAL) #endif + Q_PROPERTY(LifecycleState lifecycleState READ lifecycleState WRITE setLifecycleState NOTIFY lifecycleStateChanged REVISION 11 FINAL) + Q_PROPERTY(LifecycleState recommendedState READ recommendedState NOTIFY recommendedStateChanged REVISION 11 FINAL) + public: QQuickWebEngineView(QQuickItem *parent = 0); ~QQuickWebEngineView(); @@ -172,7 +177,8 @@ public: FormSubmittedNavigation, BackForwardNavigation, ReloadNavigation, - OtherNavigation + OtherNavigation, + RedirectNavigation, }; Q_ENUM(NavigationType) @@ -459,6 +465,14 @@ public: }; Q_ENUM(PrintedPageOrientation) + // must match WebContentsAdapterClient::LifecycleState + enum class LifecycleState { + Active, + Frozen, + Discarded, + }; + Q_ENUM(LifecycleState) + // QmlParserStatus void componentComplete() override; @@ -490,6 +504,11 @@ public: void setDevToolsView(QQuickWebEngineView *); QQuickWebEngineView *devToolsView() const; + LifecycleState lifecycleState() const; + void setLifecycleState(LifecycleState state); + + LifecycleState recommendedState() const; + public Q_SLOTS: void runJavaScript(const QString&, const QJSValue & = QJSValue()); Q_REVISION(3) void runJavaScript(const QString&, quint32 worldId, const QJSValue & = QJSValue()); @@ -552,6 +571,9 @@ Q_SIGNALS: Q_REVISION(7) void registerProtocolHandlerRequested(const QWebEngineRegisterProtocolHandlerRequest &request); Q_REVISION(8) void printRequested(); Q_REVISION(9) void selectClientCertificate(QQuickWebEngineClientCertificateSelection *clientCertSelection); + Q_REVISION(10) void tooltipRequested(QQuickWebEngineTooltipRequest *request); + Q_REVISION(11) void lifecycleStateChanged(LifecycleState state); + Q_REVISION(11) void recommendedStateChanged(LifecycleState state); #if QT_CONFIG(webengine_testsupport) void testSupportChanged(); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 10fe5c2fd..1e0ba309c 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -101,6 +101,9 @@ public: QtWebEngineCore::RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(QtWebEngineCore::RenderWidgetHostViewQtDelegateClient *client) override; QtWebEngineCore::RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegateForPopup(QtWebEngineCore::RenderWidgetHostViewQtDelegateClient *client) override; void initializationFinished() override; + void lifecycleStateChanged(LifecycleState state) override; + void recommendedStateChanged(LifecycleState state) override; + void visibleChanged(bool visible) override; void titleChanged(const QString&) override; void urlChanged(const QUrl&) override; void iconChanged(const QUrl&) override; |