diff options
| -rw-r--r-- | src/core/api/qwebenginepage.cpp | 40 | ||||
| -rw-r--r-- | src/core/api/qwebenginepage_p.h | 7 | ||||
| -rw-r--r-- | src/core/web_contents_adapter.cpp | 42 | ||||
| -rw-r--r-- | src/core/web_contents_adapter.h | 8 | ||||
| -rw-r--r-- | src/core/web_contents_adapter_client.h | 7 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 25 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview_p_p.h | 6 | ||||
| -rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 17 |
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); |
