summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-06-04 11:07:25 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-06-18 00:59:32 +0000
commit75522d57a8a8d4d038dc5c0954ce823f290ca7e7 (patch)
tree08f24915b696402fc45dc095e288f509750b3081
parent267ea323460766b146cf68d8446b8ea7c45f754f (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.cpp70
-rw-r--r--src/core/api/qwebenginepage.h9
-rw-r--r--src/core/api/qwebenginepage_p.h4
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp12
-rw-r--r--src/webenginewidgets/api/qwebengineview.h5
-rw-r--r--src/webenginewidgets/api/qwebengineview_p.h7
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc10
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