From eb96f424587c5da4eabe1306e4c277879a245c02 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 24 Jun 2019 14:41:46 +0200 Subject: Join some features request and response functions Will make it easier to expands with more features in the future Change-Id: Ic7c1aca23a543c95a4873471c918f74606be2053 Reviewed-by: Kirill Burtsev --- src/core/permission_manager_qt.cpp | 37 ++++++++++++++++------------- src/core/web_contents_adapter.cpp | 10 ++------ src/core/web_contents_adapter.h | 3 +-- src/core/web_contents_adapter_client.h | 6 ++--- src/core/web_contents_delegate_qt.cpp | 9 ++----- src/core/web_contents_delegate_qt.h | 3 +-- src/webengine/api/qquickwebengineview.cpp | 23 ++++++++++++------ src/webengine/api/qquickwebengineview_p_p.h | 3 +-- src/webenginewidgets/api/qwebenginepage.cpp | 32 +++++++++++++++---------- src/webenginewidgets/api/qwebenginepage_p.h | 3 +-- 10 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index c6eb2c238..16a7b25bf 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -52,7 +52,7 @@ namespace QtWebEngineCore { -ProfileAdapter::PermissionType toQt(content::PermissionType type) +static ProfileAdapter::PermissionType toQt(content::PermissionType type) { switch (type) { case content::PermissionType::GEOLOCATION: @@ -90,6 +90,18 @@ ProfileAdapter::PermissionType toQt(content::PermissionType type) return ProfileAdapter::UnsupportedPermission; } +static bool canRequestPermissionFor(ProfileAdapter::PermissionType type) +{ + switch (type) { + case ProfileAdapter::GeolocationPermission: + case ProfileAdapter::NotificationPermission: + return true; + default: + break; + } + return false; +} + PermissionManagerQt::PermissionManagerQt() : m_requestIdCount(0) , m_subscriberIdCount(0) @@ -170,10 +182,7 @@ int PermissionManagerQt::RequestPermission(content::PermissionType permission, Q_ASSERT(contentsDelegate); ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) { - std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); - return content::PermissionController::kNoPendingOperation; - } else if (permissionType == ProfileAdapter::ClipboardRead) { + if (permissionType == ProfileAdapter::ClipboardRead) { WebEngineSettings *settings = contentsDelegate->webEngineSettings(); if (settings->testAttribute(WebEngineSettings::JavascriptCanAccessClipboard) && settings->testAttribute(WebEngineSettings::JavascriptCanPaste)) @@ -181,19 +190,15 @@ int PermissionManagerQt::RequestPermission(content::PermissionType permission, else std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); return content::PermissionController::kNoPendingOperation; + } else if (!canRequestPermissionFor(permissionType)) { + std::move(callback).Run(blink::mojom::PermissionStatus::DENIED); + return content::PermissionController::kNoPendingOperation; } - // Audio and video-capture should not come this way currently - Q_ASSERT(permissionType != ProfileAdapter::AudioCapturePermission - && permissionType != ProfileAdapter::VideoCapturePermission); int request_id = ++m_requestIdCount; auto requestOrigin = toQt(requesting_origin); m_requests.push_back({ request_id, permissionType, requestOrigin, std::move(callback) }); - if (permissionType == ProfileAdapter::GeolocationPermission) - contentsDelegate->requestGeolocationPermission(requestOrigin); - else if (permissionType == ProfileAdapter::NotificationPermission) - contentsDelegate->requestUserNotificationPermission(requestOrigin); - + contentsDelegate->requestFeaturePermission(permissionType, requestOrigin); return request_id; } @@ -236,10 +241,8 @@ int PermissionManagerQt::RequestPermissions(const std::vectorrequestGeolocationPermission(requestOrigin); - else if (permissionType == ProfileAdapter::NotificationPermission) - contentsDelegate->requestUserNotificationPermission(requestOrigin); + if (canRequestPermissionFor(permissionType)) + contentsDelegate->requestFeaturePermission(permissionType, requestOrigin); } return request_id; } diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 61f8e5da0..a97db169b 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -1356,16 +1356,10 @@ void WebContentsAdapter::grantMediaAccessPermission(const QUrl &securityOrigin, MediaCaptureDevicesDispatcher::GetInstance()->handleMediaAccessPermissionResponse(m_webContents.get(), securityOrigin, flags); } -void WebContentsAdapter::runGeolocationRequestCallback(const QUrl &securityOrigin, bool allowed) +void WebContentsAdapter::runFeatureRequestCallback(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, bool allowed) { CHECK_INITIALIZED(); - m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::GeolocationPermission, allowed); -} - -void WebContentsAdapter::runUserNotificationRequestCallback(const QUrl &securityOrigin, bool allowed) -{ - CHECK_INITIALIZED(); - m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::NotificationPermission, allowed); + m_profileAdapter->permissionRequestReply(securityOrigin, feature, allowed); } void WebContentsAdapter::grantMouseLockPermission(bool granted) diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index ef9d21b8f..1a76cd3c1 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -192,9 +192,8 @@ public: void devToolsFrontendDestroyed(DevToolsFrontendQt *frontend); void grantMediaAccessPermission(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags flags); - void runGeolocationRequestCallback(const QUrl &securityOrigin, bool allowed); void grantMouseLockPermission(bool granted); - void runUserNotificationRequestCallback(const QUrl &securityOrigin, bool allowed); + void runFeatureRequestCallback(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, bool allowed); void setBackgroundColor(const QColor &color); QAccessibleInterface *browserAccessible(); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 3a75185f8..04df0450c 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -53,6 +53,8 @@ #include "qtwebenginecoreglobal_p.h" +#include "profile_adapter.h" + #include #include #include @@ -76,7 +78,6 @@ struct DropData; namespace QtWebEngineCore { class AuthenticationDialogController; -class ProfileAdapter; class ColorChooserController; class FilePickerController; class JavaScriptDialogController; @@ -489,12 +490,11 @@ public: virtual QObject *accessibilityParentObject() = 0; virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) = 0; virtual void authenticationRequired(QSharedPointer) = 0; - virtual void runGeolocationPermissionRequest(const QUrl &securityOrigin) = 0; + virtual void runFeaturePermissionRequest(ProfileAdapter::PermissionType, const QUrl &securityOrigin) = 0; virtual void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) = 0; virtual void runMouseLockPermissionRequest(const QUrl &securityOrigin) = 0; virtual void runQuotaRequest(QWebEngineQuotaRequest) = 0; virtual void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) = 0; - virtual void runUserNotificationPermissionRequest(const QUrl &securityOrigin) = 0; virtual WebEngineSettings *webEngineSettings() const = 0; RenderProcessTerminationStatus renderProcessExitStatus(int); virtual void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) = 0; diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index d1cdb8d9f..fada874a3 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -683,14 +683,9 @@ void WebContentsDelegateQt::selectClientCert(const QSharedPointerselectClientCert(selectController); } -void WebContentsDelegateQt::requestGeolocationPermission(const QUrl &requestingOrigin) +void WebContentsDelegateQt::requestFeaturePermission(ProfileAdapter::PermissionType feature, const QUrl &requestingOrigin) { - m_viewClient->runGeolocationPermissionRequest(requestingOrigin); -} - -void WebContentsDelegateQt::requestUserNotificationPermission(const QUrl &requestingOrigin) -{ - m_viewClient->runUserNotificationPermissionRequest(requestingOrigin); + m_viewClient->runFeaturePermissionRequest(feature, requestingOrigin); } extern WebContentsAdapterClient::NavigationType pageTransitionToNavigationType(ui::PageTransition transition); diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 81d6c8671..f32b02caf 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -172,8 +172,7 @@ public: void overrideWebPreferences(content::WebContents *, content::WebPreferences*); void allowCertificateError(const QSharedPointer &); void selectClientCert(const QSharedPointer &); - void requestGeolocationPermission(const QUrl &requestingOrigin); - void requestUserNotificationPermission(const QUrl &requestingOrigin); + void requestFeaturePermission(ProfileAdapter::PermissionType feature, const QUrl &requestingOrigin); void launchExternalURL(const QUrl &url, ui::PageTransition page_transition, bool is_main_frame, bool has_user_gesture); FaviconManager *faviconManager(); FindTextHelper *findTextHelper(); diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index bcbf95569..7052afe42 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -316,16 +316,25 @@ void QQuickWebEngineViewPrivate::selectClientCert(const QSharedPointerfeaturePermissionRequested(url, QQuickWebEngineView::Geolocation); + switch (type) { + case QtWebEngineCore::ProfileAdapter::NotificationPermission: + return QQuickWebEngineView::Notifications; + case QtWebEngineCore::ProfileAdapter::GeolocationPermission: + return QQuickWebEngineView::Geolocation; + default: + break; + } + Q_UNREACHABLE(); + return QQuickWebEngineView::Feature(-1); } -void QQuickWebEngineViewPrivate::runUserNotificationPermissionRequest(const QUrl &url) + +void QQuickWebEngineViewPrivate::runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &url) { Q_Q(QQuickWebEngineView); - Q_EMIT q->featurePermissionRequested(url, QQuickWebEngineView::Notifications); + Q_EMIT q->featurePermissionRequested(url, toFeature(permission)); } void QQuickWebEngineViewPrivate::showColorDialog(QSharedPointer controller) @@ -1629,7 +1638,7 @@ void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQu d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaRequestFlags(WebContentsAdapterClient::MediaAudioCapture | WebContentsAdapterClient::MediaVideoCapture)); break; case Geolocation: - d_ptr->adapter->runGeolocationRequestCallback(securityOrigin, granted); + d_ptr->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, granted); break; case DesktopVideoCapture: d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture); @@ -1642,7 +1651,7 @@ void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQu WebContentsAdapterClient::MediaDesktopVideoCapture)); break; case Notifications: - d_ptr->adapter->runUserNotificationRequestCallback(securityOrigin, granted); + d_ptr->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, granted); break; default: Q_UNREACHABLE(); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 6f9b552ec..5c884e36e 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -148,8 +148,7 @@ public: QtWebEngineCore::WebEngineSettings *webEngineSettings() const override; void allowCertificateError(const QSharedPointer &errorController) override; void selectClientCert(const QSharedPointer &selectController) override; - void runGeolocationPermissionRequest(QUrl const&) override; - void runUserNotificationPermissionRequest(QUrl const&) override; + void runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &securityOrigin) override; void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override; void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 55fa6a078..0d2988421 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -537,10 +537,24 @@ void QWebEnginePagePrivate::runMediaAccessPermissionRequest(const QUrl &security Q_EMIT q->featurePermissionRequested(securityOrigin, feature); } -void QWebEnginePagePrivate::runGeolocationPermissionRequest(const QUrl &securityOrigin) +static QWebEnginePage::Feature toFeature(QtWebEngineCore::ProfileAdapter::PermissionType type) +{ + switch (type) { + case QtWebEngineCore::ProfileAdapter::NotificationPermission: + return QWebEnginePage::Notifications; + case QtWebEngineCore::ProfileAdapter::GeolocationPermission: + return QWebEnginePage::Geolocation; + default: + break; + } + Q_UNREACHABLE(); + return QWebEnginePage::Feature(-1); +} + +void QWebEnginePagePrivate::runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &securityOrigin) { Q_Q(QWebEnginePage); - Q_EMIT q->featurePermissionRequested(securityOrigin, QWebEnginePage::Geolocation); + Q_EMIT q->featurePermissionRequested(securityOrigin, toFeature(permission)); } void QWebEnginePagePrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin) @@ -561,12 +575,6 @@ void QWebEnginePagePrivate::runRegisterProtocolHandlerRequest(QWebEngineRegister Q_EMIT q->registerProtocolHandlerRequested(request); } -void QWebEnginePagePrivate::runUserNotificationPermissionRequest(const QUrl &securityOrigin) -{ - Q_Q(QWebEnginePage); - Q_EMIT q->featurePermissionRequested(securityOrigin, QWebEnginePage::Notifications); -} - QObject *QWebEnginePagePrivate::accessibilityParentObject() { return view; @@ -1976,13 +1984,13 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture); break; case Geolocation: - d->adapter->runGeolocationRequestCallback(securityOrigin, true); + d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, true); break; case MouseLock: d->adapter->grantMouseLockPermission(true); break; case Notifications: - d->adapter->runUserNotificationRequestCallback(securityOrigin, true); + d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, true); break; } } else { // if (policy == PermissionDeniedByUser) @@ -1995,13 +2003,13 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaNone); break; case Geolocation: - d->adapter->runGeolocationRequestCallback(securityOrigin, false); + d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, false); break; case MouseLock: d->adapter->grantMouseLockPermission(false); break; case Notifications: - d->adapter->runUserNotificationRequestCallback(securityOrigin, false); + d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, false); break; } } diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 7fdc811e2..4f33e26f3 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -136,8 +136,7 @@ public: void authenticationRequired(QSharedPointer) override; void releaseProfile() override; void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) override; - void runGeolocationPermissionRequest(const QUrl &securityOrigin) override; - void runUserNotificationPermissionRequest(const QUrl &securityOrigin) override; + void runFeaturePermissionRequest(QtWebEngineCore::ProfileAdapter::PermissionType permission, const QUrl &securityOrigin) override; void runMouseLockPermissionRequest(const QUrl &securityOrigin) override; void runQuotaRequest(QWebEngineQuotaRequest) override; void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) override; -- cgit v1.2.3