diff options
Diffstat (limited to 'src/core/api/qwebenginepage.cpp')
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 416 |
1 files changed, 247 insertions, 169 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index ac645c430..f0260fd0d 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -24,6 +24,7 @@ #include "qwebenginescriptcollection_p.h" #include "qwebenginesettings.h" #include "qwebenginewebauthuxrequest.h" +#include "qwebenginepermission_p.h" #include "authentication_dialog_controller.h" #include "autofill_popup_controller.h" @@ -199,6 +200,12 @@ void QWebEnginePagePrivate::iconChanged(const QUrl &url) Q_EMIT q->iconChanged(iconUrl.isEmpty() ? QIcon() : adapter->icon()); } +void QWebEnginePagePrivate::zoomFactorChanged(qreal factor) +{ + Q_Q(QWebEnginePage); + Q_EMIT q->zoomFactorChanged(factor); +} + void QWebEnginePagePrivate::loadProgressChanged(int progress) { Q_Q(QWebEnginePage); @@ -268,6 +275,20 @@ void QWebEnginePagePrivate::loadFinished(QWebEngineLoadingInfo info) }); } +void QWebEnginePagePrivate::printToPdf(const QString &filePath, const QPageLayout &layout, + const QPageRanges &ranges, quint64 frameId) +{ + adapter->printToPDF(layout, ranges, filePath, frameId); +} + +void QWebEnginePagePrivate::printToPdf(std::function<void(QSharedPointer<QByteArray>)> &&callback, + const QPageLayout &layout, const QPageRanges &ranges, + quint64 frameId) +{ + adapter->printToPDFCallbackResult(std::move(callback), layout, ranges, /*colorMode*/ true, + /*useCustomMargins*/ true, frameId); +} + void QWebEnginePagePrivate::didPrintPageToPdf(const QString &filePath, bool success) { Q_Q(QWebEnginePage); @@ -489,10 +510,16 @@ void QWebEnginePagePrivate::windowCloseRejected() // Do nothing for now. } -void QWebEnginePagePrivate::didRunJavaScript(quint64 requestId, const QVariant& result) +void QWebEnginePagePrivate::runJavaScript(const QString &script, quint32 worldId, quint64 frameId, + const std::function<void(const QVariant &)> &callback) { - if (auto callback = m_variantCallbacks.take(requestId)) - callback(result); + ensureInitialized(); + if (adapter->lifecycleState() == WebContentsAdapter::LifecycleState::Discarded) { + qWarning("runJavaScript: disabled in Discarded state"); + if (callback) + callback(QVariant()); + } else + adapter->runJavaScript(script, worldId, frameId, callback); } void QWebEnginePagePrivate::didFetchDocumentMarkup(quint64 requestId, const QString& result) @@ -507,27 +534,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 } @@ -572,50 +590,121 @@ void QWebEnginePagePrivate::showColorDialog(QSharedPointer<ColorChooserControlle void QWebEnginePagePrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) { Q_Q(QWebEnginePage); - QWebEnginePage::Feature feature; - if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && - requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - feature = QWebEnginePage::MediaAudioVideoCapture; + QWebEnginePermission::Feature feature; + + if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + feature = QWebEnginePermission::MediaAudioVideoCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) + feature = QWebEnginePermission::MediaAudioCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + feature = QWebEnginePermission::MediaVideoCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) + feature = QWebEnginePermission::DesktopAudioVideoCapture; + else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) + feature = QWebEnginePermission::DesktopVideoCapture; + + Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, feature)); + +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + QWebEnginePage::Feature deprecatedFeature; + + if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + deprecatedFeature = QWebEnginePage::MediaAudioVideoCapture; else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - feature = QWebEnginePage::MediaAudioCapture; + deprecatedFeature = QWebEnginePage::MediaAudioCapture; else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - feature = QWebEnginePage::MediaVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) && - requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - feature = QWebEnginePage::DesktopAudioVideoCapture; + deprecatedFeature = QWebEnginePage::MediaVideoCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) + deprecatedFeature = QWebEnginePage::DesktopAudioVideoCapture; else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - feature = QWebEnginePage::DesktopVideoCapture; - Q_EMIT q->featurePermissionRequested(securityOrigin, feature); + deprecatedFeature = QWebEnginePage::DesktopVideoCapture; + + Q_EMIT q->featurePermissionRequested(securityOrigin, deprecatedFeature); + QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) } -static QWebEnginePage::Feature toFeature(QtWebEngineCore::ProfileAdapter::PermissionType type) +#if QT_DEPRECATED_SINCE(6, 8) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +static QWebEnginePage::Feature toDeprecatedFeature(QWebEnginePermission::Feature feature) { - switch (type) { - case QtWebEngineCore::ProfileAdapter::NotificationPermission: + switch (feature) { + case QWebEnginePermission::Feature::Notifications: return QWebEnginePage::Notifications; - case QtWebEngineCore::ProfileAdapter::GeolocationPermission: + case QWebEnginePermission::Feature::Geolocation: return QWebEnginePage::Geolocation; - case QtWebEngineCore::ProfileAdapter::ClipboardReadWrite: + case QWebEnginePermission::Feature::ClipboardReadWrite: return QWebEnginePage::ClipboardReadWrite; - case QtWebEngineCore::ProfileAdapter::LocalFontsPermission: + case QWebEnginePermission::Feature::LocalFontsAccess: return QWebEnginePage::LocalFontsAccess; - default: + case QWebEnginePermission::Feature::MediaAudioCapture: + return QWebEnginePage::MediaAudioCapture; + case QWebEnginePermission::Feature::MediaVideoCapture: + return QWebEnginePage::MediaVideoCapture; + case QWebEnginePermission::Feature::MediaAudioVideoCapture: + return QWebEnginePage::MediaAudioVideoCapture; + case QWebEnginePermission::Feature::DesktopVideoCapture: + return QWebEnginePage::DesktopVideoCapture; + case QWebEnginePermission::Feature::DesktopAudioVideoCapture: + return QWebEnginePage::DesktopAudioVideoCapture; + case QWebEnginePermission::Feature::MouseLock: + return QWebEnginePage::MouseLock; + case QWebEnginePermission::Feature::Unsupported: break; } + Q_UNREACHABLE(); return QWebEnginePage::Feature(-1); } +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) -void QWebEnginePagePrivate::runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &securityOrigin) +void QWebEnginePagePrivate::runFeaturePermissionRequest(QWebEnginePermission::Feature feature, const QUrl &securityOrigin) { Q_Q(QWebEnginePage); - Q_EMIT q->featurePermissionRequested(securityOrigin, toFeature(permission)); + switch (feature) { + case QWebEnginePermission::Notifications: + case QWebEnginePermission::Geolocation: + case QWebEnginePermission::ClipboardReadWrite: + case QWebEnginePermission::LocalFontsAccess: + Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, feature)); +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT q->featurePermissionRequested(securityOrigin, toDeprecatedFeature(feature)); + QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) + return; + case QWebEnginePermission::MouseLock: + case QWebEnginePermission::MediaAudioCapture: + case QWebEnginePermission::MediaVideoCapture: + case QWebEnginePermission::MediaAudioVideoCapture: + case QWebEnginePermission::DesktopAudioVideoCapture: + case QWebEnginePermission::DesktopVideoCapture: + case QWebEnginePermission::Unsupported: + Q_UNREACHABLE(); + return; + } } void QWebEnginePagePrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin) { Q_Q(QWebEnginePage); + Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, QWebEnginePermission::MouseLock)); + +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED Q_EMIT q->featurePermissionRequested(securityOrigin, QWebEnginePage::MouseLock); + QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) } void QWebEnginePagePrivate::runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest request) @@ -804,6 +893,12 @@ void QWebEnginePagePrivate::showWebAuthDialog(QWebEngineWebAuthUxRequest *reques Q_EMIT q->webAuthUxRequested(request); } +QWebEnginePermission QWebEnginePagePrivate::createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::Feature feature) +{ + auto *returnPrivate = new QWebEnginePermissionPrivate{securityOrigin, feature, adapter, profileAdapter()}; + return QWebEnginePermission(returnPrivate); +} + QWebEnginePage::QWebEnginePage(QObject* parent) : QObject(parent) , d_ptr(new QWebEnginePagePrivate()) @@ -971,11 +1066,9 @@ QWebEnginePage::~QWebEnginePage() setDevToolsPage(nullptr); emit _q_aboutToDelete(); - for (auto varFun : std::as_const(d_ptr->m_variantCallbacks)) - varFun(QVariant()); + d_ptr->adapter->clearJavaScriptCallbacks(); for (auto strFun : std::as_const(d_ptr->m_stringCallbacks)) strFun(QString()); - d_ptr->m_variantCallbacks.clear(); d_ptr->m_stringCallbacks.clear(); } } @@ -1516,13 +1609,13 @@ void QWebEnginePagePrivate::contextMenuRequested(QWebEngineContextMenuRequest *d \sa acceptNavigationRequest() */ -void QWebEnginePagePrivate::navigationRequested(int navigationType, const QUrl &url, bool &accepted, bool isMainFrame) +void QWebEnginePagePrivate::navigationRequested(int navigationType, const QUrl &url, bool &accepted, bool isMainFrame, bool hasFormData) { Q_Q(QWebEnginePage); accepted = q->acceptNavigationRequest(url, static_cast<QWebEnginePage::NavigationType>(navigationType), isMainFrame); if (accepted) { - QWebEngineNavigationRequest navigationRequest(url, static_cast<QWebEngineNavigationRequest::NavigationType>(navigationType), isMainFrame); + QWebEngineNavigationRequest navigationRequest(url, static_cast<QWebEngineNavigationRequest::NavigationType>(navigationType), isMainFrame, hasFormData); Q_EMIT q->navigationRequested(navigationRequest); accepted = navigationRequest.isAccepted(); } @@ -1652,11 +1745,14 @@ void QWebEnginePagePrivate::setToolTip(const QString &toolTipText) \fn void QWebEnginePage::printRequested() \since 5.12 - This signal is emitted when the JavaScript \c{window.print()} method is called or the user pressed the print - button of PDF viewer plugin. + This signal is emitted when the JavaScript \c{window.print()} method is called on the main + frame, or the user pressed the print button of PDF viewer plugin. Typically, the signal handler can simply call printToPdf(). - \sa printToPdf() + Since 6.8, this signal is only emitted for the main frame, instead of being emitted for any + frame that requests printing. + + \sa printToPdf(), printRequestedByFrame() */ void QWebEnginePagePrivate::printRequested() @@ -1669,6 +1765,25 @@ void QWebEnginePagePrivate::printRequested() view->printRequested(); } +/*! + \fn void QWebEnginePage::printRequestedByFrame(QWebEngineFrame frame) + \since 6.8 + + This signal is emitted when the JavaScript \c{window.print()} method is called on \a frame. + If the frame is the main frame, \c{printRequested} is emitted instead. + + \sa printRequested(), printToPdf(), QWebEngineFrame::printToPdf() +*/ + +void QWebEnginePagePrivate::printRequestedByFrame(quint64 frameId) +{ + Q_Q(QWebEnginePage); + QWebEngineFrame frame(this, frameId); + QTimer::singleShot(0, q, [q, frame]() { Q_EMIT q->printRequestedByFrame(frame); }); + if (view) + view->printRequestedByFrame(frame); +} + QtWebEngineCore::TouchHandleDrawableDelegate * QWebEnginePagePrivate::createTouchHandleDelegate(const QMap<int, QImage> &images) { @@ -1736,104 +1851,64 @@ void QWebEnginePage::setUrlRequestInterceptor(QWebEngineUrlRequestInterceptor *i d->adapter->setRequestInterceptor(interceptor); } +#if QT_DEPRECATED_SINCE(6, 8) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEnginePage::Feature feature, QWebEnginePage::PermissionPolicy policy) { Q_D(QWebEnginePage); - if (policy == PermissionUnknown) { - switch (feature) { - case MediaAudioVideoCapture: - case MediaAudioCapture: - case MediaVideoCapture: - case DesktopAudioVideoCapture: - case DesktopVideoCapture: - case MouseLock: - break; - case Geolocation: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::AskPermission); - break; - case Notifications: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AskPermission); - break; - case ClipboardReadWrite: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, - ProfileAdapter::AskPermission); - break; - case LocalFontsAccess: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::LocalFontsPermission, ProfileAdapter::AskPermission); - break; - } - return; + QWebEnginePermission::Feature f; + QWebEnginePermission::State s; + + switch (feature) { + case QWebEnginePage::Notifications: + f = QWebEnginePermission::Notifications; + break; + case QWebEnginePage::Geolocation: + f = QWebEnginePermission::Geolocation; + break; + case QWebEnginePage::MediaAudioCapture: + f = QWebEnginePermission::MediaAudioCapture; + break; + case QWebEnginePage::MediaVideoCapture: + f = QWebEnginePermission::MediaVideoCapture; + break; + case QWebEnginePage::MediaAudioVideoCapture: + f = QWebEnginePermission::MediaAudioVideoCapture; + break; + case QWebEnginePage::MouseLock: + f = QWebEnginePermission::MouseLock; + break; + case QWebEnginePage::DesktopVideoCapture: + f = QWebEnginePermission::DesktopVideoCapture; + break; + case QWebEnginePage::DesktopAudioVideoCapture: + f = QWebEnginePermission::DesktopAudioVideoCapture; + break; + case QWebEnginePage::ClipboardReadWrite: + f = QWebEnginePermission::ClipboardReadWrite; + break; + case QWebEnginePage::LocalFontsAccess: + f = QWebEnginePermission::LocalFontsAccess; + break; } - const WebContentsAdapterClient::MediaRequestFlags audioVideoCaptureFlags( - WebContentsAdapterClient::MediaVideoCapture | - WebContentsAdapterClient::MediaAudioCapture); - const WebContentsAdapterClient::MediaRequestFlags desktopAudioVideoCaptureFlags( - WebContentsAdapterClient::MediaDesktopVideoCapture | - WebContentsAdapterClient::MediaDesktopAudioCapture); - - if (policy == PermissionGrantedByUser) { - switch (feature) { - case MediaAudioVideoCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, audioVideoCaptureFlags); - break; - case MediaAudioCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaAudioCapture); - break; - case MediaVideoCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaVideoCapture); - break; - case DesktopAudioVideoCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, desktopAudioVideoCaptureFlags); - break; - case DesktopVideoCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture); - break; - case MouseLock: - d->adapter->grantMouseLockPermission(securityOrigin, true); - break; - case Geolocation: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::AllowedPermission); - break; - case Notifications: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AllowedPermission); - break; - case ClipboardReadWrite: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, - ProfileAdapter::AllowedPermission); - break; - case LocalFontsAccess: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::LocalFontsPermission, ProfileAdapter::AllowedPermission); - break; - } - } else { // if (policy == PermissionDeniedByUser) - switch (feature) { - case MediaAudioVideoCapture: - case MediaAudioCapture: - case MediaVideoCapture: - case DesktopAudioVideoCapture: - case DesktopVideoCapture: - d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaNone); - break; - case Geolocation: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::DeniedPermission); - break; - case MouseLock: - d->adapter->grantMouseLockPermission(securityOrigin, false); - break; - case Notifications: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::DeniedPermission); - break; - case ClipboardReadWrite: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, - ProfileAdapter::DeniedPermission); - break; - case LocalFontsAccess: - d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::LocalFontsPermission, ProfileAdapter::DeniedPermission); - break; - } + switch (policy) { + case QWebEnginePage::PermissionUnknown: + s = QWebEnginePermission::Ask; + break; + case QWebEnginePage::PermissionDeniedByUser: + s = QWebEnginePermission::Denied; + break; + case QWebEnginePage::PermissionGrantedByUser: + s = QWebEnginePermission::Granted; + break; } + + d->adapter->setFeaturePermission(securityOrigin, f, s); } +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) static inline QWebEnginePage::FileSelectionMode toPublic(FilePickerController::FileChooserMode mode) { @@ -2020,7 +2095,7 @@ void QWebEnginePage::setZoomFactor(qreal factor) Q_D(QWebEnginePage); d->defaultZoomFactor = factor; - if (d->adapter->isInitialized()) { + if (d->adapter->isInitialized() && !qFuzzyCompare(factor, zoomFactor())) { d->adapter->setZoomFactor(factor); // MEMO: should reset if factor was not applied due to being invalid d->defaultZoomFactor = zoomFactor(); @@ -2029,40 +2104,13 @@ void QWebEnginePage::setZoomFactor(qreal factor) 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"); - if (resultCallback) - resultCallback(QVariant()); - return; - } - quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, QWebEngineScript::MainWorld); - if (requestId) - d->m_variantCallbacks.insert(requestId, resultCallback); - else if (resultCallback) - resultCallback(QVariant()); + runJavaScript(scriptSource, QWebEngineScript::MainWorld, 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; - } - if (resultCallback) { - quint64 requestId = d->adapter->runJavaScriptCallbackResult(scriptSource, worldId); - if (requestId) - d->m_variantCallbacks.insert(requestId, resultCallback); - else - resultCallback(QVariant()); - } else { - d->adapter->runJavaScript(scriptSource, worldId); - } + d->runJavaScript(scriptSource, worldId, WebContentsAdapter::kUseMainFrameId, resultCallback); } /*! @@ -2322,7 +2370,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, WebContentsAdapter::kUseMainFrameId); #else Q_UNUSED(filePath); Q_UNUSED(layout); @@ -2347,11 +2395,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, WebContentsAdapter::kUseMainFrameId); #else Q_UNUSED(layout); Q_UNUSED(ranges); @@ -2501,6 +2552,33 @@ void QWebEnginePage::setVisible(bool visible) d->adapter->setVisible(visible); } +/*! + \since 6.8 + + The main, top-level frame of the page. All other frames on this page are accessible + as children of the main frame. +*/ +QWebEngineFrame QWebEnginePage::mainFrame() +{ + Q_D(QWebEnginePage); + return QWebEngineFrame(d, d->adapter->mainFrameId()); +} + +/*! + \since 6.8 + + Returns the frame with the given \a name. If there are multiple frames with the same + name, which one is returned is arbitrary. If no frame was found, returns \c std::nullopt. +*/ +std::optional<QWebEngineFrame> QWebEnginePage::findFrameByName(const QString &name) +{ + Q_D(QWebEnginePage); + if (auto maybeId = d->adapter->findFrameIdByName(name)) { + return QWebEngineFrame(d, *maybeId); + } + return {}; +} + QDataStream &operator<<(QDataStream &stream, const QWebEngineHistory &history) { auto adapter = history.d_func()->adapter(); |