diff options
Diffstat (limited to 'src/webenginequick/api/qquickwebengineview.cpp')
-rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 269 |
1 files changed, 178 insertions, 91 deletions
diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index 31e5d572e..852d00c76 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -25,9 +25,9 @@ #include "find_text_helper.h" #include "javascript_dialog_controller.h" #include "render_widget_host_view_qt_delegate_item.h" -#include "render_widget_host_view_qt_delegate_quickwindow.h" +#include "render_widget_host_view_qt_delegate_quickwindow_p.h" #include "touch_selection_menu_controller.h" -#include "ui_delegates_manager.h" +#include "ui_delegates_manager_p.h" #include "web_contents_adapter.h" #include <QtWebEngineCore/qwebenginecertificateerror.h> @@ -41,6 +41,7 @@ #include <QtWebEngineCore/qwebengineregisterprotocolhandlerrequest.h> #include <QtWebEngineCore/qwebenginescriptcollection.h> #include <QtWebEngineCore/qwebenginewebauthuxrequest.h> +#include <QtWebEngineCore/qwebenginepermission.h> #include <QtWebEngineCore/private/qwebenginecontextmenurequest_p.h> #include <QtWebEngineCore/private/qwebenginedesktopmediarequest_p.h> #include <QtWebEngineCore/private/qwebenginehistory_p.h> @@ -48,6 +49,7 @@ #include <QtWebEngineCore/private/qwebenginescriptcollection_p.h> #include <QtWebEngineCore/private/qwebenginepage_p.h> #include <QtWebEngineCore/private/qtwebenginecoreglobal_p.h> +#include <QtWebEngineCore/private/qwebenginepermission_p.h> #include <QtCore/qloggingcategory.h> #include <QtCore/qmimedata.h> @@ -63,7 +65,7 @@ #include <QtQml/qqmlproperty.h> #if QT_CONFIG(accessibility) -#include "qquickwebengine_accessible.h" +#include "qquickwebengine_accessible_p.h" #include <QtGui/qaccessible.h> #endif @@ -332,8 +334,7 @@ QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() { Q_ASSERT(m_profileInitialized); m_profile->d_ptr->removeWebContentsAdapterClient(this); - if (m_faviconProvider) - m_faviconProvider->detach(q_ptr); + FaviconProviderHelper::instance()->detach(q_ptr); bindViewAndDelegateItem(this, nullptr); } @@ -446,10 +447,10 @@ void QQuickWebEngineViewPrivate::contextMenuRequested(QWebEngineContextMenuReque ui()->showMenu(menu); } -void QQuickWebEngineViewPrivate::navigationRequested(int navigationType, const QUrl &url, bool &accepted, bool isMainFrame) +void QQuickWebEngineViewPrivate::navigationRequested(int navigationType, const QUrl &url, bool &accepted, bool isMainFrame, bool hasFrameData) { Q_Q(QQuickWebEngineView); - auto request = new QWebEngineNavigationRequest(url, static_cast<QWebEngineNavigationRequest::NavigationType>(navigationType), isMainFrame); + auto request = new QWebEngineNavigationRequest(url, static_cast<QWebEngineNavigationRequest::NavigationType>(navigationType), isMainFrame, hasFrameData); qmlEngine(q)->newQObject(request); Q_EMIT q->navigationRequested(request); @@ -485,29 +486,67 @@ void QQuickWebEngineViewPrivate::selectClientCert( Q_EMIT q->selectClientCertificate(certSelection); } -static QQuickWebEngineView::Feature toFeature(QtWebEngineCore::ProfileAdapter::PermissionType type) +#if QT_DEPRECATED_SINCE(6, 8) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +static QQuickWebEngineView::Feature toDeprecatedFeature(QWebEnginePermission::Feature feature) { - switch (type) { - case QtWebEngineCore::ProfileAdapter::NotificationPermission: + switch (feature) { + case QWebEnginePermission::Feature::Notifications: return QQuickWebEngineView::Notifications; - case QtWebEngineCore::ProfileAdapter::GeolocationPermission: + case QWebEnginePermission::Feature::Geolocation: return QQuickWebEngineView::Geolocation; - case QtWebEngineCore::ProfileAdapter::ClipboardReadWrite: + case QWebEnginePermission::Feature::ClipboardReadWrite: return QQuickWebEngineView::ClipboardReadWrite; - case QtWebEngineCore::ProfileAdapter::LocalFontsPermission: + case QWebEnginePermission::Feature::LocalFontsAccess: return QQuickWebEngineView::LocalFontsAccess; - default: + case QWebEnginePermission::Feature::MediaAudioCapture: + return QQuickWebEngineView::MediaAudioCapture; + case QWebEnginePermission::Feature::MediaVideoCapture: + return QQuickWebEngineView::MediaVideoCapture; + case QWebEnginePermission::Feature::MediaAudioVideoCapture: + return QQuickWebEngineView::MediaAudioVideoCapture; + case QWebEnginePermission::Feature::DesktopVideoCapture: + return QQuickWebEngineView::DesktopVideoCapture; + case QWebEnginePermission::Feature::DesktopAudioVideoCapture: + return QQuickWebEngineView::DesktopAudioVideoCapture; + case QWebEnginePermission::Feature::MouseLock: + case QWebEnginePermission::Feature::Unsupported: break; } + Q_UNREACHABLE(); return QQuickWebEngineView::Feature(-1); } +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) - -void QQuickWebEngineViewPrivate::runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &url) +void QQuickWebEngineViewPrivate::runFeaturePermissionRequest(QWebEnginePermission::Feature feature, const QUrl &url) { Q_Q(QQuickWebEngineView); - Q_EMIT q->featurePermissionRequested(url, toFeature(permission)); + switch (feature) { + case QWebEnginePermission::Notifications: + case QWebEnginePermission::Geolocation: + case QWebEnginePermission::ClipboardReadWrite: + case QWebEnginePermission::LocalFontsAccess: + Q_EMIT q->permissionRequested(createFeaturePermissionObject(url, feature)); +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT q->featurePermissionRequested(url, 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 QQuickWebEngineViewPrivate::showColorDialog(QSharedPointer<ColorChooserController> controller) @@ -573,6 +612,12 @@ void QQuickWebEngineViewPrivate::iconChanged(const QUrl &url) QTimer::singleShot(0, q, &QQuickWebEngineView::iconChanged); } +void QQuickWebEngineViewPrivate::zoomFactorChanged(qreal factor) +{ + Q_Q(QQuickWebEngineView); + Q_EMIT q->zoomFactorChanged(factor); +} + void QQuickWebEngineViewPrivate::loadProgressChanged(int progress) { Q_Q(QQuickWebEngineView); @@ -779,19 +824,41 @@ void QQuickWebEngineViewPrivate::runMediaAccessPermissionRequest(const QUrl &sec Q_Q(QQuickWebEngineView); if (!requestFlags) return; - QQuickWebEngineView::Feature feature; + QWebEnginePermission::Feature feature; if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - feature = QQuickWebEngineView::MediaAudioVideoCapture; + feature = QWebEnginePermission::MediaAudioVideoCapture; else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - feature = QQuickWebEngineView::MediaAudioCapture; + feature = QWebEnginePermission::MediaAudioCapture; else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - feature = QQuickWebEngineView::MediaVideoCapture; + feature = QWebEnginePermission::MediaVideoCapture; else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - feature = QQuickWebEngineView::DesktopAudioVideoCapture; + feature = QWebEnginePermission::DesktopAudioVideoCapture; else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - feature = QQuickWebEngineView::DesktopVideoCapture; - Q_EMIT q->featurePermissionRequested(securityOrigin, feature); + feature = QWebEnginePermission::DesktopVideoCapture; + Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, feature)); + +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + QQuickWebEngineView::Feature deprecatedFeature; + + if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + deprecatedFeature = QQuickWebEngineView::MediaAudioVideoCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) + deprecatedFeature = QQuickWebEngineView::MediaAudioCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + deprecatedFeature = QQuickWebEngineView::MediaVideoCapture; + else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) + && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) + deprecatedFeature = QQuickWebEngineView::DesktopAudioVideoCapture; + else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) + deprecatedFeature = QQuickWebEngineView::DesktopVideoCapture; + + Q_EMIT q->featurePermissionRequested(securityOrigin, deprecatedFeature); + QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) } void QQuickWebEngineViewPrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin) @@ -837,6 +904,14 @@ void QQuickWebEngineViewPrivate::printRequested() }); } +void QQuickWebEngineViewPrivate::printRequestedByFrame(quint64 frameId) +{ + Q_Q(QQuickWebEngineView); + QTimer::singleShot(0, q, [this, q, frameId]() { + Q_EMIT q->printRequestedByFrame(QWebEngineFrame(this, frameId)); + }); +} + void QQuickWebEngineViewPrivate::findTextFinished(const QWebEngineFindTextResult &result) { Q_Q(QQuickWebEngineView); @@ -951,16 +1026,7 @@ void QQuickWebEngineViewPrivate::ensureContentsAdapter() adapter->loadDefault(); } - if (!m_faviconProvider) { - QQmlEngine *engine = qmlEngine(q_ptr); - // TODO: this is a workaround for QTBUG-65044 - if (!engine) - return; - m_faviconProvider = static_cast<QQuickWebEngineFaviconProvider *>( - engine->imageProvider(QQuickWebEngineFaviconProvider::identifier())); - m_faviconProvider->attach(q_ptr); - Q_ASSERT(m_faviconProvider); - } + FaviconProviderHelper::instance()->attach(q_ptr); } void QQuickWebEngineViewPrivate::initializationFinished() @@ -1235,7 +1301,6 @@ void QQuickWebEngineView::setZoomFactor(qreal arg) d->adapter->setZoomFactor(arg); // MEMO: should reset if factor was not applied due to being invalid d->m_zoomFactor = zoomFactor(); - emit zoomFactorChanged(d->m_zoomFactor); } else { d->m_zoomFactor = arg; } @@ -1306,22 +1371,26 @@ bool QQuickWebEngineView::activeFocusOnPress() const return d->m_activeFocusOnPress; } -void QQuickWebEngineViewPrivate::didRunJavaScript(quint64 requestId, const QVariant &result) +void QQuickWebEngineViewPrivate::runJavaScript( + const QString &script, quint32 worldId, quint64 frameId, + const std::function<void(const QVariant &)> &callback) { - Q_Q(QQuickWebEngineView); - QJSValue callback = m_callbacks.take(requestId); - QJSValueList args; - args.append(qmlEngine(q)->toScriptValue(result)); - callback.call(args); + ensureContentsAdapter(); + 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, quint64 frameId) { - Q_Q(QQuickWebEngineView); - QJSValue callback = m_callbacks.take(requestId); - QJSValueList args; - args.append(qmlEngine(q)->toScriptValue(*(result.data()))); - callback.call(args); + adapter->printToPDF(layout, ranges, filePath, frameId); +} + +void QQuickWebEngineViewPrivate::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 QQuickWebEngineViewPrivate::didPrintPageToPdf(const QString &filePath, bool success) @@ -1459,6 +1528,12 @@ void QQuickWebEngineViewPrivate::showWebAuthDialog(QWebEngineWebAuthUxRequest *r Q_EMIT q->webAuthUxRequested(request); } +QWebEnginePermission QQuickWebEngineViewPrivate::createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::Feature feature) +{ + auto *returnPrivate = new QWebEnginePermissionPrivate(securityOrigin, feature, adapter, profileAdapter()); + return QWebEnginePermission(returnPrivate); +} + bool QQuickWebEngineView::isLoading() const { Q_D(const QQuickWebEngineView); @@ -1497,16 +1572,15 @@ void QQuickWebEngineView::runJavaScript(const QString &script, const QJSValue &c void QQuickWebEngineView::runJavaScript(const QString &script, quint32 worldId, const QJSValue &callback) { Q_D(QQuickWebEngineView); - d->ensureContentsAdapter(); + std::function<void(const QVariant &)> wrappedCallback; if (!callback.isUndefined()) { - quint64 requestId = d_ptr->adapter->runJavaScriptCallbackResult(script, worldId); - if (requestId) { - d->m_callbacks.insert(requestId, callback); - } else { - callback.call(); - } - } else - d->adapter->runJavaScript(script, worldId); + wrappedCallback = [this, callback](const QVariant &result) { + QJSValueList args; + args.append(qmlEngine(this)->toScriptValue(result)); + callback.call(args); + }; + } + d->runJavaScript(script, worldId, WebContentsAdapter::kUseMainFrameId, wrappedCallback); } qreal QQuickWebEngineView::zoomFactor() const @@ -1581,7 +1655,7 @@ void QQuickWebEngineView::printToPdf(const QString& filePath, PrintedPageSizeId QPageLayout pageLayout(layoutSize, layoutOrientation, QMarginsF(0.0, 0.0, 0.0, 0.0)); QPageRanges ranges; d->ensureContentsAdapter(); - d->adapter->printToPDF(pageLayout, ranges, filePath); + d->printToPdf(filePath, pageLayout, ranges, WebContentsAdapter::kUseMainFrameId); #else Q_UNUSED(filePath); Q_UNUSED(pageSizeId); @@ -1602,8 +1676,14 @@ void QQuickWebEngineView::printToPdf(const QJSValue &callback, PrintedPageSizeId return; d->ensureContentsAdapter(); - quint64 requestId = d->adapter->printToPDFCallbackResult(pageLayout, ranges); - d->m_callbacks.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, + WebContentsAdapter::kUseMainFrameId); #else Q_UNUSED(pageSizeId); Q_UNUSED(orientation); @@ -1749,55 +1829,49 @@ void QQuickWebEngineView::setDevToolsView(QQuickWebEngineView *devToolsView) Q_EMIT devToolsViewChanged(); } +#if QT_DEPRECATED_SINCE(6, 8) +QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQuickWebEngineView::Feature feature, bool granted) { - if (!granted && ((feature >= MediaAudioCapture && feature <= MediaAudioVideoCapture) || - (feature >= DesktopVideoCapture && feature <= DesktopAudioVideoCapture))) { - d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaNone); - return; - } + Q_D(QQuickWebEngineView); + QWebEnginePermission::Feature f; switch (feature) { - case MediaAudioCapture: - d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaAudioCapture); + case QQuickWebEngineView::Notifications: + f = QWebEnginePermission::Notifications; break; - case MediaVideoCapture: - d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaVideoCapture); + case QQuickWebEngineView::Geolocation: + f = QWebEnginePermission::Geolocation; break; - case MediaAudioVideoCapture: - d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaRequestFlags(WebContentsAdapterClient::MediaAudioCapture | WebContentsAdapterClient::MediaVideoCapture)); + case QQuickWebEngineView::MediaAudioCapture: + f = QWebEnginePermission::MediaAudioCapture; break; - case DesktopVideoCapture: - d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture); + case QQuickWebEngineView::MediaVideoCapture: + f = QWebEnginePermission::MediaVideoCapture; break; - case DesktopAudioVideoCapture: - d_ptr->adapter->grantMediaAccessPermission( - securityOrigin, - WebContentsAdapterClient::MediaRequestFlags( - WebContentsAdapterClient::MediaDesktopAudioCapture | - WebContentsAdapterClient::MediaDesktopVideoCapture)); + case QQuickWebEngineView::MediaAudioVideoCapture: + f = QWebEnginePermission::MediaAudioVideoCapture; break; - case Geolocation: - d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, - granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission); + case QQuickWebEngineView::DesktopVideoCapture: + f = QWebEnginePermission::DesktopVideoCapture; break; - case Notifications: - d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, - granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission); + case QQuickWebEngineView::DesktopAudioVideoCapture: + f = QWebEnginePermission::DesktopAudioVideoCapture; break; - case ClipboardReadWrite: - d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, - granted ? ProfileAdapter::AllowedPermission - : ProfileAdapter::DeniedPermission); + case QQuickWebEngineView::ClipboardReadWrite: + f = QWebEnginePermission::ClipboardReadWrite; break; - case LocalFontsAccess: - d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::LocalFontsPermission, - granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission); + case QQuickWebEngineView::LocalFontsAccess: + f = QWebEnginePermission::LocalFontsAccess; break; default: Q_UNREACHABLE(); } + + d->adapter->setFeaturePermission(securityOrigin, f, granted ? QWebEnginePermission::Granted : QWebEnginePermission::Denied); } +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) void QQuickWebEngineView::setActiveFocusOnPress(bool arg) { @@ -2529,6 +2603,19 @@ QQmlComponent *QQuickWebEngineView::touchHandleDelegate() const return d_ptr->m_touchHandleDelegate; } +QWebEngineFrame QQuickWebEngineView::mainFrame() +{ + Q_D(QQuickWebEngineView); + return QWebEngineFrame(d, d->adapter->mainFrameId()); +} + +QWebEngineFrame QQuickWebEngineView::findFrameByName(const QString &name) +{ + Q_D(QQuickWebEngineView); + auto maybeId = d->adapter->findFrameIdByName(name); + return QWebEngineFrame(d, maybeId.value_or(WebContentsAdapter::kInvalidFrameId)); +} + void QQuickWebEngineView::save(const QString &filePath, QWebEngineDownloadRequest::SavePageFormat format) const { |