diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-06-04 11:07:25 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-06-18 00:59:32 +0000 |
commit | 75522d57a8a8d4d038dc5c0954ce823f290ca7e7 (patch) | |
tree | 08f24915b696402fc45dc095e288f509750b3081 | |
parent | 267ea323460766b146cf68d8446b8ea7c45f754f (diff) |
Switch QWebEngineCallbacks in QWebEnginePage to std::function
Change-Id: I5b0c1c7ef0966c3cff79184aa0733b59208d6890
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
(cherry picked from commit 566a4df270911e1656efef5dbb16e4f95bf6ca8d)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 70 | ||||
-rw-r--r-- | src/core/api/qwebenginepage.h | 9 | ||||
-rw-r--r-- | src/core/api/qwebenginepage_p.h | 4 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 12 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.h | 5 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 7 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc | 10 |
7 files changed, 71 insertions, 46 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index 499343bb3..6b66a0d70 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -40,14 +40,8 @@ #include "qwebenginepage.h" #include "qwebenginepage_p.h" -#include "qwebenginedownloadrequest_p.h" -#include "authentication_dialog_controller.h" -#include "profile_adapter.h" -#include "color_chooser_controller.h" -#include "find_text_helper.h" -#include "file_picker_controller.h" -#include "javascript_dialog_controller.h" #include "qwebenginecertificateerror.h" +#include "qwebenginedownloadrequest_p.h" #include "qwebenginefindtextresult.h" #include "qwebenginefullscreenrequest.h" #include "qwebenginehistory.h" @@ -60,15 +54,23 @@ #include "qwebengineprofile_p.h" #include "qwebenginequotarequest.h" #include "qwebengineregisterprotocolhandlerrequest.h" +#include "qwebenginescript.h" #include "qwebenginescriptcollection_p.h" #include "qwebenginesettings.h" -#include "user_notification_controller.h" + +#include "authentication_dialog_controller.h" +#include "color_chooser_controller.h" +#include "find_text_helper.h" +#include "file_picker_controller.h" +#include "javascript_dialog_controller.h" +#include "profile_adapter.h" +#include "render_view_context_menu_qt.h" #include "render_widget_host_view_qt_delegate.h" +#include "render_widget_host_view_qt_delegate_client.h" +#include "user_notification_controller.h" #include "web_contents_adapter.h" #include "web_engine_settings.h" -#include "qwebenginescript.h" -#include "render_view_context_menu_qt.h" -#include "render_widget_host_view_qt_delegate_client.h" + #include <QAction> #include <QGuiApplication> #include <QAuthenticator> @@ -80,7 +82,6 @@ #include <QTimer> #include <QUrl> - QT_BEGIN_NAMESPACE using namespace QtWebEngineCore; @@ -456,17 +457,20 @@ void QWebEnginePagePrivate::windowCloseRejected() void QWebEnginePagePrivate::didRunJavaScript(quint64 requestId, const QVariant& result) { - m_callbacks.invoke(requestId, result); + if (auto callback = m_variantCallbacks.take(requestId)) + callback(result); } void QWebEnginePagePrivate::didFetchDocumentMarkup(quint64 requestId, const QString& result) { - m_callbacks.invoke(requestId, result); + if (auto callback = m_stringCallbacks.take(requestId)) + callback(result); } void QWebEnginePagePrivate::didFetchDocumentInnerText(quint64 requestId, const QString& result) { - m_callbacks.invoke(requestId, result); + if (auto callback = m_stringCallbacks.take(requestId)) + callback(result); } void QWebEnginePagePrivate::didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result) @@ -883,6 +887,13 @@ QWebEnginePage::~QWebEnginePage() // d_ptr might be exceptionally null if profile adapter got deleted first setDevToolsPage(nullptr); emit _q_aboutToDelete(); + + for (auto varFun : qAsConst(d_ptr->m_variantCallbacks)) + varFun(QVariant()); + for (auto strFun : qAsConst(d_ptr->m_stringCallbacks)) + strFun(QString()); + d_ptr->m_variantCallbacks.clear(); + d_ptr->m_stringCallbacks.clear(); } } @@ -1902,20 +1913,20 @@ void QWebEnginePage::load(const QWebEngineHttpRequest& request) d->adapter->load(request); } -void QWebEnginePage::toHtml(const QWebEngineCallback<const QString &> &resultCallback) const +void QWebEnginePage::toHtml(const std::function<void(const QString &)> &resultCallback) const { Q_D(const QWebEnginePage); d->ensureInitialized(); quint64 requestId = d->adapter->fetchDocumentMarkup(); - d->m_callbacks.registerCallback(requestId, resultCallback); + d->m_stringCallbacks.insert(requestId, resultCallback); } -void QWebEnginePage::toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const +void QWebEnginePage::toPlainText(const std::function<void(const QString &)> &resultCallback) const { Q_D(const QWebEnginePage); d->ensureInitialized(); quint64 requestId = d->adapter->fetchDocumentInnerText(); - d->m_callbacks.registerCallback(requestId, resultCallback); + d->m_stringCallbacks.insert(requestId, resultCallback); } void QWebEnginePage::setHtml(const QString &html, const QUrl &baseUrl) @@ -2019,32 +2030,43 @@ void QWebEnginePage::runJavaScript(const QString &scriptSource) d->adapter->runJavaScript(scriptSource, QWebEngineScript::MainWorld); } -void QWebEnginePage::runJavaScript(const QString& scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback) +void QWebEnginePage::runJavaScript(const QString& scriptSource, const std::function<void(const QVariant &)> &resultCallback) { Q_D(QWebEnginePage); d->ensureInitialized(); if (d->adapter->lifecycleState() == WebContentsAdapter::LifecycleState::Discarded) { qWarning("runJavaScript: disabled in Discarded state"); - d->m_callbacks.invokeEmpty(resultCallback); + if (resultCallback) + resultCallback(QVariant()); return; } quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, QWebEngineScript::MainWorld); - d->m_callbacks.registerCallback(requestId, resultCallback); + d->m_variantCallbacks.insert(requestId, resultCallback); } void QWebEnginePage::runJavaScript(const QString &scriptSource, quint32 worldId) { Q_D(QWebEnginePage); d->ensureInitialized(); + if (d->adapter->lifecycleState() == WebContentsAdapter::LifecycleState::Discarded) { + qWarning("runJavaScript: disabled in Discarded state"); + return; + } d->adapter->runJavaScript(scriptSource, worldId); } -void QWebEnginePage::runJavaScript(const QString& scriptSource, quint32 worldId, const QWebEngineCallback<const QVariant &> &resultCallback) +void QWebEnginePage::runJavaScript(const QString& scriptSource, quint32 worldId, const std::function<void(const QVariant &)> &resultCallback) { Q_D(QWebEnginePage); d->ensureInitialized(); + if (d->adapter->lifecycleState() == WebContentsAdapter::LifecycleState::Discarded) { + qWarning("runJavaScript: disabled in Discarded state"); + if (resultCallback) + resultCallback(QVariant()); + return; + } quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, worldId); - d->m_callbacks.registerCallback(requestId, resultCallback); + d->m_variantCallbacks.insert(requestId, resultCallback); } /*! diff --git a/src/core/api/qwebenginepage.h b/src/core/api/qwebenginepage.h index ecf4e3307..f2ac8eb6c 100644 --- a/src/core/api/qwebenginepage.h +++ b/src/core/api/qwebenginepage.h @@ -43,7 +43,6 @@ #include <QtWebEngineCore/qtwebenginecoreglobal.h> #include <QtWebEngineCore/qwebengineclientcertificateselection.h> #include <QtWebEngineCore/qwebenginedownloadrequest.h> -#include <QtWebEngineCore/qwebenginecallback.h> #include <QtWebEngineCore/qwebenginehttprequest.h> #include <QtCore/qobject.h> @@ -271,8 +270,8 @@ public: void setHtml(const QString &html, const QUrl &baseUrl = QUrl()); void setContent(const QByteArray &data, const QString &mimeType = QString(), const QUrl &baseUrl = QUrl()); - void toHtml(const QWebEngineCallback<const QString &> &resultCallback) const; - void toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const; + void toHtml(const std::function<void(const QString &)> &resultCallback) const; + void toPlainText(const std::function<void(const QString &)> &resultCallback) const; QString title() const; void setUrl(const QUrl &url); @@ -289,8 +288,8 @@ public: void runJavaScript(const QString& scriptSource); void runJavaScript(const QString& scriptSource, quint32 worldId); - void runJavaScript(const QString& scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback); - void runJavaScript(const QString& scriptSource, quint32 worldId, const QWebEngineCallback<const QVariant &> &resultCallback); + void runJavaScript(const QString& scriptSource, const std::function<void(const QVariant &)> &resultCallback); + void runJavaScript(const QString& scriptSource, quint32 worldId, const std::function<void(const QVariant &)> &resultCallback); QWebEngineScriptCollection &scripts(); QWebEngineSettings *settings() const; diff --git a/src/core/api/qwebenginepage_p.h b/src/core/api/qwebenginepage_p.h index 46dcf2ce8..8aebc2951 100644 --- a/src/core/api/qwebenginepage_p.h +++ b/src/core/api/qwebenginepage_p.h @@ -53,7 +53,6 @@ #include "qwebenginepage.h" -#include "qwebenginecallback_p.h" #include "qwebenginescriptcollection.h" #include "web_contents_adapter_client.h" @@ -226,7 +225,8 @@ public: QTimer wasShownTimer; QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *widget = nullptr; - mutable QtWebEngineCore::CallbackDirectory m_callbacks; + mutable QMap<quint64, std::function<void(const QVariant &)>> m_variantCallbacks; + mutable QMap<quint64, std::function<void(const QString &)>> m_stringCallbacks; mutable QAction *actions[QWebEnginePage::WebActionCount]; }; diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index 65b53103a..b2eb17ec7 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -517,7 +517,7 @@ void QWebEngineViewPrivate::didPrintPage(quint64 requestId, QSharedPointer<QByte if (!currentPrinter) { if (!result.data()) return; - page->d_ptr->m_callbacks.invoke(requestId, *(result.data())); + m_callbacks.invoke(requestId, *(result.data())); return; } @@ -545,7 +545,7 @@ void QWebEngineViewPrivate::didPrintPage(quint64 requestId, QSharedPointer<QByte #else // we should never enter this branch, but just for safe-keeping... Q_UNUSED(result); - page->d_ptr->m_callbacks.invoke(requestId, QByteArray()); + m_callbacks.invoke(requestId, QByteArray()); #endif } @@ -1006,19 +1006,19 @@ void QWebEngineView::printToPdf(const QString &filePath, const QPageLayout &layo */ void QWebEngineView::printToPdf(const QWebEngineCallback<const QByteArray&> &resultCallback, const QPageLayout &layout) { -#if QT_CONFIG(webengine_printing_and_pdf) Q_D(QWebEngineView); +#if QT_CONFIG(webengine_printing_and_pdf) if (d->currentPrinter) { qWarning("Cannot print to PDF while printing at the same time."); - page()->d_ptr->m_callbacks.invokeEmpty(resultCallback); + d->m_callbacks.invokeEmpty(resultCallback); return; } page()->d_ptr->ensureInitialized(); quint64 requestId = page()->d_ptr->adapter->printToPDFCallbackResult(layout); - page()->d_ptr->m_callbacks.registerCallback(requestId, resultCallback); + d->m_callbacks.registerCallback(requestId, resultCallback); #else Q_UNUSED(layout); - page()->d_ptr->m_callbacks.invokeEmpty(resultCallback); + d->m_callbacks.invokeEmpty(resultCallback); #endif } diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index 90a2d4118..3faa07a6b 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -45,9 +45,10 @@ #include <QtWidgets/qwidget.h> #include <QtWebEngineWidgets/qtwebenginewidgetsglobal.h> -#include <QtWebEngineCore/qwebenginepage.h> -#include <QtWebEngineCore/qwebenginehttprequest.h> +#include <QtWebEngineCore/qwebenginecallback.h> #include <QtWebEngineCore/qwebenginecontextmenurequest.h> +#include <QtWebEngineCore/qwebenginehttprequest.h> +#include <QtWebEngineCore/qwebenginepage.h> QT_BEGIN_NAMESPACE class QContextMenuEvent; diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 71e7d04f7..d49b0e74e 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -52,11 +52,13 @@ // #include <QtWebEngineWidgets/qwebengineview.h> -#include "qwebenginecontextmenurequest.h" -#include "render_view_context_menu_qt.h" +#include <QtWebEngineCore/private/qwebenginecallback_p.h> #include <QtWebEngineCore/private/qwebenginepage_p.h> +#include <QtWebEngineCore/qwebenginecontextmenurequest.h> #include <QtWidgets/qaccessiblewidget.h> +#include "render_view_context_menu_qt.h" + namespace QtWebEngineCore { class QPrinter; class RenderWidgetHostViewQtDelegateWidget; @@ -116,6 +118,7 @@ public: #if QT_CONFIG(webengine_printing_and_pdf) QPrinter *currentPrinter; #endif + mutable QtWebEngineCore::CallbackDirectory m_callbacks; }; #ifndef QT_NO_ACCESSIBILITY diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc index d567f9988..bbd3d886e 100644 --- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc @@ -640,7 +640,7 @@ */ /*! - \fn void QWebEnginePage::toHtml(const QWebEngineCallback<const QString &> &resultCallback) const + \fn void QWebEnginePage::toHtml(const std::function<void(const QString &)> &resultCallback) const Asynchronous method to retrieve the page's content as HTML, enclosed in HTML and BODY tags. Upon successful completion, \a resultCallback is called with the page's content. @@ -654,7 +654,7 @@ */ /*! - \fn void QWebEnginePage::toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const + \fn void QWebEnginePage::toPlainText(const std::function<void(const QString &)> &resultCallback) const Asynchronous method to retrieve the page's content converted to plain text, completely stripped of all HTML formatting. Upon successful completion, \a resultCallback is called with the page's content. @@ -768,10 +768,10 @@ */ /*! - \fn void QWebEnginePage::runJavaScript(const QString &scriptSource, quint32 worldId, const QWebEngineCallback<const QVariant &> &resultCallback) + \fn void QWebEnginePage::runJavaScript(const QString &scriptSource, quint32 worldId, const std::function<void(const QVariant &)> &resultCallback) \fn void QWebEnginePage::runJavaScript(const QString &scriptSource, quint32 worldId) - \fn void QWebEnginePage::runJavaScript(const QString& scriptSource) - \fn void QWebEnginePage::runJavaScript(const QString &scriptSource, const QWebEngineCallback<const QVariant &> &resultCallback) + \fn void QWebEnginePage::runJavaScript(const QString &scriptSource) + \fn void QWebEnginePage::runJavaScript(const QString &scriptSource, const std::function<void(const QVariant &)> &resultCallback) \since 5.7 Runs the JavaScript code contained in \a scriptSource without checking |