summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMoss Heim <moss.heim@qt.io>2024-05-23 16:06:24 +0200
committerMoss Heim <moss.heim@qt.io>2024-05-31 16:09:34 +0200
commit378cb6138801b21c643348807b1749a732e7b8e1 (patch)
tree833597bc0da5c988a3c55aaa2092987c4d08b860
parentd825fca2d3c88117aa50269bbe09f5cd49d96ac7 (diff)
Merge printToPdf callback systems
Provide a common API in WebContentsAdapterClient so it can be used easily by QWebEngineFrame. Change-Id: I9abc1214cf535c3110d54d9ecb3257000c6db5fb Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--src/core/api/qwebenginepage.cpp40
-rw-r--r--src/core/api/qwebenginepage_p.h7
-rw-r--r--src/core/web_contents_adapter.cpp42
-rw-r--r--src/core/web_contents_adapter.h8
-rw-r--r--src/core/web_contents_adapter_client.h7
-rw-r--r--src/webenginequick/api/qquickwebengineview.cpp25
-rw-r--r--src/webenginequick/api/qquickwebengineview_p_p.h6
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp17
8 files changed, 93 insertions, 59 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp
index c393c014b..7c6a53d0f 100644
--- a/src/core/api/qwebenginepage.cpp
+++ b/src/core/api/qwebenginepage.cpp
@@ -274,6 +274,18 @@ void QWebEnginePagePrivate::loadFinished(QWebEngineLoadingInfo info)
});
}
+void QWebEnginePagePrivate::printToPdf(const QString &filePath, const QPageLayout &layout,
+ const QPageRanges &ranges)
+{
+ adapter->printToPDF(layout, ranges, filePath);
+}
+
+void QWebEnginePagePrivate::printToPdf(std::function<void(QSharedPointer<QByteArray>)> &&callback,
+ const QPageLayout &layout, const QPageRanges &ranges)
+{
+ adapter->printToPDFCallbackResult(std::move(callback), layout, ranges);
+}
+
void QWebEnginePagePrivate::didPrintPageToPdf(const QString &filePath, bool success)
{
Q_Q(QWebEnginePage);
@@ -519,27 +531,18 @@ void QWebEnginePagePrivate::didFetchDocumentInnerText(quint64 requestId, const Q
callback(result);
}
-void QWebEnginePagePrivate::didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result)
+void QWebEnginePagePrivate::didPrintPage(QSharedPointer<QByteArray> result)
{
#if QT_CONFIG(webengine_printing_and_pdf)
- // If no currentPrinter is set that means that were printing to PDF only.
- if (!currentPrinter) {
- if (!result.data())
- return;
- if (auto callback = m_pdfResultCallbacks.take(requestId))
- callback(*(result.data()));
- return;
- }
-
+ Q_ASSERT(currentPrinter);
if (view)
view->didPrintPage(currentPrinter, result);
else
currentPrinter = nullptr;
#else
- // we should never enter this branch, but just for safe-keeping...
+ // should not get here
Q_UNUSED(result);
- if (auto callback = m_pdfResultCallbacks.take(requestId))
- callback(QByteArray());
+ Q_ASSERT(false);
#endif
}
@@ -2327,7 +2330,7 @@ void QWebEnginePage::printToPdf(const QString &filePath, const QPageLayout &layo
#if QT_CONFIG(webengine_printing_and_pdf)
Q_D(QWebEnginePage);
d->ensureInitialized();
- d->adapter->printToPDF(layout, ranges, filePath);
+ d->printToPdf(filePath, layout, ranges);
#else
Q_UNUSED(filePath);
Q_UNUSED(layout);
@@ -2352,11 +2355,14 @@ void QWebEnginePage::printToPdf(const QString &filePath, const QPageLayout &layo
*/
void QWebEnginePage::printToPdf(const std::function<void(const QByteArray&)> &resultCallback, const QPageLayout &layout, const QPageRanges &ranges)
{
- Q_D(QWebEnginePage);
#if QT_CONFIG(webengine_printing_and_pdf)
+ Q_D(QWebEnginePage);
d->ensureInitialized();
- quint64 requestId = d->adapter->printToPDFCallbackResult(layout, ranges);
- d->m_pdfResultCallbacks.insert(requestId, resultCallback);
+ std::function wrappedCallback = [resultCallback](QSharedPointer<QByteArray> result) {
+ if (resultCallback && result)
+ resultCallback(*result);
+ };
+ d->printToPdf(std::move(wrappedCallback), layout, ranges);
#else
Q_UNUSED(layout);
Q_UNUSED(ranges);
diff --git a/src/core/api/qwebenginepage_p.h b/src/core/api/qwebenginepage_p.h
index ef6ce7f2b..3aeda6711 100644
--- a/src/core/api/qwebenginepage_p.h
+++ b/src/core/api/qwebenginepage_p.h
@@ -136,7 +136,10 @@ public:
const std::function<void(const QVariant &)> &callback) override;
void didFetchDocumentMarkup(quint64 requestId, const QString &result) override;
void didFetchDocumentInnerText(quint64 requestId, const QString &result) override;
- void didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result) override;
+ void printToPdf(const QString &filePath, const QPageLayout &layout,
+ const QPageRanges &ranges) override;
+ void printToPdf(std::function<void(QSharedPointer<QByteArray>)> &&callback,
+ const QPageLayout &layout, const QPageRanges &ranges) override;
void didPrintPageToPdf(const QString &filePath, bool success) override;
bool passOnFocus(bool reverse) override;
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString &message,
@@ -188,6 +191,7 @@ public:
bool adoptWebContents(QtWebEngineCore::WebContentsAdapter *webContents);
QtWebEngineCore::WebContentsAdapter *webContents() { return adapter.data(); }
void recreateFromSerializedHistory(QDataStream &input);
+ void didPrintPage(QSharedPointer<QByteArray> result);
void setFullScreenMode(bool);
void ensureInitialized() const;
@@ -219,7 +223,6 @@ public:
#endif
mutable QMap<quint64, std::function<void(const QString &)>> m_stringCallbacks;
- QMap<quint64, std::function<void(const QByteArray &)>> m_pdfResultCallbacks;
mutable QAction *actions[QWebEnginePage::WebActionCount];
};
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index b06ed2121..4b21838a0 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -180,12 +180,10 @@ static void callbackOnEvaluateJS(WebContentsAdapter *adapter, quint64 requestId,
}
#if QT_CONFIG(webengine_printing_and_pdf)
-static void callbackOnPrintingFinished(WebContentsAdapterClient *adapterClient,
- int requestId,
+static void callbackOnPrintingFinished(WebContentsAdapter *adapter, quint64 requestId,
QSharedPointer<QByteArray> result)
{
- if (requestId)
- adapterClient->didPrintPage(requestId, result);
+ adapter->didPrintPage(requestId, result);
}
static void callbackOnPdfSavingFinished(WebContentsAdapterClient *adapterClient,
@@ -1366,32 +1364,38 @@ void WebContentsAdapter::printToPDF(const QPageLayout &pageLayout, const QPageRa
#endif // QT_CONFIG(webengine_printing_and_pdf)
}
-quint64 WebContentsAdapter::printToPDFCallbackResult(const QPageLayout &pageLayout,
- const QPageRanges &pageRanges,
- bool colorMode,
- bool useCustomMargins)
+void WebContentsAdapter::printToPDFCallbackResult(
+ std::function<void(QSharedPointer<QByteArray>)> &&callback, const QPageLayout &pageLayout,
+ const QPageRanges &pageRanges, bool colorMode, bool useCustomMargins)
{
#if QT_CONFIG(webengine_printing_and_pdf)
- CHECK_INITIALIZED(0);
- PrintViewManagerQt::PrintToPDFCallback callback = base::BindOnce(&callbackOnPrintingFinished,
- m_adapterClient,
- m_nextRequestId);
+ CHECK_INITIALIZED();
+ Q_ASSERT(callback);
+ PrintViewManagerQt::PrintToPDFCallback internalCallback =
+ base::BindOnce(&callbackOnPrintingFinished, this, m_nextRequestId);
content::WebContents *webContents = m_webContents.get();
if (content::WebContents *guest = guestWebContents())
webContents = guest;
- PrintViewManagerQt::FromWebContents(webContents)->PrintToPDFWithCallback(pageLayout,
- pageRanges,
- colorMode,
- useCustomMargins,
- std::move(callback));
- return m_nextRequestId++;
+ PrintViewManagerQt::FromWebContents(webContents)
+ ->PrintToPDFWithCallback(pageLayout, pageRanges, colorMode, useCustomMargins,
+ std::move(internalCallback));
+ m_printCallbacks.emplace(m_nextRequestId++, std::move(callback));
#else
Q_UNUSED(pageLayout);
Q_UNUSED(colorMode);
- return 0;
#endif // QT_CONFIG(webengine_printing_and_pdf)
}
+void WebContentsAdapter::didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result)
+{
+ Q_ASSERT(requestId);
+ auto mapIt = m_printCallbacks.find(requestId);
+ Q_ASSERT(mapIt != m_printCallbacks.end());
+ Q_ASSERT(mapIt->second);
+ mapIt->second(std::move(result));
+ m_printCallbacks.erase(mapIt);
+}
+
QPointF WebContentsAdapter::lastScrollOffset() const
{
CHECK_INITIALIZED(QPointF());
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 24de7eb1b..9663c77ed 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -207,9 +207,10 @@ public:
void leaveDrag();
#endif // QT_CONFIG(draganddrop)
void printToPDF(const QPageLayout&, const QPageRanges &, const QString&);
- quint64 printToPDFCallbackResult(const QPageLayout &, const QPageRanges &,
- bool colorMode = true,
- bool useCustomMargins = true);
+ void printToPDFCallbackResult(std::function<void(QSharedPointer<QByteArray>)> &&,
+ const QPageLayout &, const QPageRanges &, bool colorMode = true,
+ bool useCustomMargins = true);
+ void didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result);
void replaceMisspelling(const QString &word);
void viewSource();
@@ -269,6 +270,7 @@ private:
quint64 m_nextRequestId;
QMap<QUrl, bool> m_pendingMouseLockPermissions;
QMap<quint64, std::function<void(const QVariant &)>> m_javaScriptCallbacks;
+ std::map<quint64, std::function<void(QSharedPointer<QByteArray>)>> m_printCallbacks;
std::unique_ptr<content::DropData> m_currentDropData;
uint m_currentDropAction;
bool m_updateDragActionCalled;
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h
index 78cb8e793..3c50ac840 100644
--- a/src/core/web_contents_adapter_client.h
+++ b/src/core/web_contents_adapter_client.h
@@ -26,6 +26,8 @@
#include <QUrl>
QT_FORWARD_DECLARE_CLASS(QKeyEvent)
+QT_FORWARD_DECLARE_CLASS(QPageLayout)
+QT_FORWARD_DECLARE_CLASS(QPageRanges)
QT_FORWARD_DECLARE_CLASS(QVariant)
QT_FORWARD_DECLARE_CLASS(QWebEngineFileSystemAccessRequest)
QT_FORWARD_DECLARE_CLASS(QWebEngineFindTextResult)
@@ -180,7 +182,10 @@ public:
const std::function<void(const QVariant &)> &callback) = 0;
virtual void didFetchDocumentMarkup(quint64 requestId, const QString& result) = 0;
virtual void didFetchDocumentInnerText(quint64 requestId, const QString& result) = 0;
- virtual void didPrintPage(quint64 requestId, QSharedPointer<QByteArray>) = 0;
+ virtual void printToPdf(const QString &filePath, const QPageLayout &layout,
+ const QPageRanges &ranges) = 0;
+ virtual void printToPdf(std::function<void(QSharedPointer<QByteArray>)> &&callback,
+ const QPageLayout &layout, const QPageRanges &ranges) = 0;
virtual void didPrintPageToPdf(const QString &filePath, bool success) = 0;
virtual bool passOnFocus(bool reverse) = 0;
// returns the last QObject (QWidget/QQuickItem) based object in the accessibility
diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp
index 411caa0a4..f6bd38780 100644
--- a/src/webenginequick/api/qquickwebengineview.cpp
+++ b/src/webenginequick/api/qquickwebengineview.cpp
@@ -1317,13 +1317,17 @@ void QQuickWebEngineViewPrivate::runJavaScript(
adapter->runJavaScript(script, worldId, frameId, callback);
}
-void QQuickWebEngineViewPrivate::didPrintPage(quint64 requestId, QSharedPointer<QByteArray> result)
+void QQuickWebEngineViewPrivate::printToPdf(const QString &filePath, const QPageLayout &layout,
+ const QPageRanges &ranges)
{
- Q_Q(QQuickWebEngineView);
- QJSValue callback = m_printCallbacks.take(requestId);
- QJSValueList args;
- args.append(qmlEngine(q)->toScriptValue(*(result.data())));
- callback.call(args);
+ adapter->printToPDF(layout, ranges, filePath);
+}
+
+void QQuickWebEngineViewPrivate::printToPdf(
+ std::function<void(QSharedPointer<QByteArray>)> &&callback, const QPageLayout &layout,
+ const QPageRanges &ranges)
+{
+ adapter->printToPDFCallbackResult(std::move(callback), layout, ranges);
}
void QQuickWebEngineViewPrivate::didPrintPageToPdf(const QString &filePath, bool success)
@@ -1603,8 +1607,13 @@ void QQuickWebEngineView::printToPdf(const QJSValue &callback, PrintedPageSizeId
return;
d->ensureContentsAdapter();
- quint64 requestId = d->adapter->printToPDFCallbackResult(pageLayout, ranges);
- d->m_printCallbacks.insert(requestId, callback);
+ std::function wrappedCallback = [this, callback](QSharedPointer<QByteArray> result) {
+ QJSValueList args;
+ args.append(qmlEngine(this)->toScriptValue(*result));
+ callback.call(args);
+ };
+
+ d->printToPdf(std::move(wrappedCallback), pageLayout, ranges);
#else
Q_UNUSED(pageSizeId);
Q_UNUSED(orientation);
diff --git a/src/webenginequick/api/qquickwebengineview_p_p.h b/src/webenginequick/api/qquickwebengineview_p_p.h
index 6d0257532..5a968aaa4 100644
--- a/src/webenginequick/api/qquickwebengineview_p_p.h
+++ b/src/webenginequick/api/qquickwebengineview_p_p.h
@@ -97,7 +97,10 @@ public:
const std::function<void(const QVariant &)> &callback) override;
void didFetchDocumentMarkup(quint64, const QString&) override { }
void didFetchDocumentInnerText(quint64, const QString&) override { }
- void didPrintPage(quint64 requestId, QSharedPointer<QByteArray>) override;
+ void printToPdf(const QString &filePath, const QPageLayout &layout,
+ const QPageRanges &ranges) override;
+ void printToPdf(std::function<void(QSharedPointer<QByteArray>)> &&callback,
+ const QPageLayout &layout, const QPageRanges &ranges) override;
void didPrintPageToPdf(const QString &filePath, bool success) override;
bool passOnFocus(bool reverse) override;
void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) override;
@@ -160,7 +163,6 @@ public:
bool m_fullscreenMode;
bool isLoading;
bool m_activeFocusOnPress;
- QMap<quint64, QJSValue> m_printCallbacks;
QQmlWebChannel *m_webChannel;
QPointer<QQuickWebEngineView> inspectedView;
QPointer<QQuickWebEngineView> devToolsView;
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index 50a850750..e72ad8fa9 100644
--- a/src/webenginewidgets/api/qwebengineview.cpp
+++ b/src/webenginewidgets/api/qwebengineview.cpp
@@ -1487,17 +1487,20 @@ void QWebEngineView::printToPdf(const std::function<void(const QByteArray&)> &re
void QWebEngineView::print(QPrinter *printer)
{
#if QT_CONFIG(webengine_printing_and_pdf)
- if (page()->d_ptr->currentPrinter) {
+ auto *dPage = page()->d_ptr.get();
+ if (dPage->currentPrinter) {
qWarning("Cannot print page on printer %ls: Already printing on a device.", qUtf16Printable(printer->printerName()));
return;
}
- page()->d_ptr->currentPrinter = printer;
- page()->d_ptr->ensureInitialized();
- page()->d_ptr->adapter->printToPDFCallbackResult(printer->pageLayout(),
- printer->pageRanges(),
- printer->colorMode() == QPrinter::Color,
- false);
+ dPage->currentPrinter = printer;
+ dPage->ensureInitialized();
+ std::function callback = [dPage](QSharedPointer<QByteArray> result) {
+ dPage->didPrintPage(std::move(result));
+ };
+ dPage->adapter->printToPDFCallbackResult(std::move(callback), printer->pageLayout(),
+ printer->pageRanges(),
+ printer->colorMode() == QPrinter::Color, false);
#else
Q_UNUSED(printer);
Q_EMIT printFinished(false);