diff options
| author | Moss Heim <self@mossheim.net> | 2023-12-13 13:39:16 +0100 |
|---|---|---|
| committer | Moss Heim <moss.heim@qt.io> | 2024-03-11 10:33:05 +0100 |
| commit | fbb216fa3119d06f88744e18d3f4f53d64fcf523 (patch) | |
| tree | 1f6c7cea4f33b2ac5cff000919ff0175768f9fd0 /src | |
| parent | 8064e40e070c2319dd87578bda5ad68b9abdbee0 (diff) | |
Add granular permission for clipboard-read/write
Previously, permissions for clipboard access could only be managed
through the JavascriptCanAccessClipboard and JavascriptCanPaste
settings. This change allows copy/paste to be handled the same way
as notification and geolocation permissions.
If both JavascriptCanAccessClipboard and JavascriptCanPaste are
enabled, permissions will be granted unconditionally without a
feature request being made.
Fixes: QTBUG-77450
Change-Id: I383e27e244ced3d6b7988644e38d2307c6267f76
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/api/qwebenginepage.cpp | 14 | ||||
| -rw-r--r-- | src/core/api/qwebenginepage.h | 3 | ||||
| -rw-r--r-- | src/core/doc/src/qwebenginepage_lgpl.qdoc | 5 | ||||
| -rw-r--r-- | src/core/permission_manager_qt.cpp | 33 | ||||
| -rw-r--r-- | src/core/profile_adapter.h | 3 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview.cpp | 7 | ||||
| -rw-r--r-- | src/webenginequick/api/qquickwebengineview_p.h | 1 | ||||
| -rw-r--r-- | src/webenginequick/doc/src/webengineview_lgpl.qdoc | 6 |
8 files changed, 55 insertions, 17 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index 3bd3aeeb3..0dcc56393 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -595,6 +595,8 @@ static QWebEnginePage::Feature toFeature(QtWebEngineCore::ProfileAdapter::Permis return QWebEnginePage::Notifications; case QtWebEngineCore::ProfileAdapter::GeolocationPermission: return QWebEnginePage::Geolocation; + case QtWebEngineCore::ProfileAdapter::ClipboardReadWrite: + return QWebEnginePage::ClipboardReadWrite; default: break; } @@ -1750,6 +1752,10 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine case Notifications: d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AskPermission); break; + case ClipboardReadWrite: + d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, + ProfileAdapter::AskPermission); + break; } return; } @@ -1787,6 +1793,10 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine case Notifications: d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AllowedPermission); break; + case ClipboardReadWrite: + d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, + ProfileAdapter::AllowedPermission); + break; } } else { // if (policy == PermissionDeniedByUser) switch (feature) { @@ -1806,6 +1816,10 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine case Notifications: d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::DeniedPermission); break; + case ClipboardReadWrite: + d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, + ProfileAdapter::DeniedPermission); + break; } } } diff --git a/src/core/api/qwebenginepage.h b/src/core/api/qwebenginepage.h index 45e96fe73..2fc6e422d 100644 --- a/src/core/api/qwebenginepage.h +++ b/src/core/api/qwebenginepage.h @@ -172,7 +172,8 @@ public: MediaAudioVideoCapture, MouseLock, DesktopVideoCapture, - DesktopAudioVideoCapture + DesktopAudioVideoCapture, + ClipboardReadWrite, }; Q_ENUM(Feature) diff --git a/src/core/doc/src/qwebenginepage_lgpl.qdoc b/src/core/doc/src/qwebenginepage_lgpl.qdoc index 4cf10a6cb..458359628 100644 --- a/src/core/doc/src/qwebenginepage_lgpl.qdoc +++ b/src/core/doc/src/qwebenginepage_lgpl.qdoc @@ -295,6 +295,11 @@ for screen sharing purposes for example. \value [since 5.10] DesktopAudioVideoCapture Both audio and video output capture. + \value [since 6.8] ClipboardReadWrite + Read and write access for the clipboard. If both \l{QWebEngineSettings::JavascriptCanPaste} + {JavascriptCanPaste} and \l{QWebEngineSettings::JavascriptCanAccessClipboard} + {JavascriptCanAccessClipboard} settings are enabled, this permission will always be granted + automatically and no feature requests will be made. \sa featurePermissionRequested(), featurePermissionRequestCanceled(), setFeaturePermission(), PermissionPolicy diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index ecaeb0779..ef235e718 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -25,10 +25,11 @@ static ProfileAdapter::PermissionType toQt(blink::PermissionType type) return ProfileAdapter::AudioCapturePermission; case blink::PermissionType::VIDEO_CAPTURE: return ProfileAdapter::VideoCapturePermission; + // We treat these both as read/write since we do not currently have a + // ClipboardSanitizedWrite feature. case blink::PermissionType::CLIPBOARD_READ_WRITE: - return ProfileAdapter::ClipboardRead; case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE: - return ProfileAdapter::ClipboardWrite; + return ProfileAdapter::ClipboardReadWrite; case blink::PermissionType::NOTIFICATIONS: return ProfileAdapter::NotificationPermission; case blink::PermissionType::ACCESSIBILITY_EVENTS: @@ -66,6 +67,7 @@ static bool canRequestPermissionFor(ProfileAdapter::PermissionType type) switch (type) { case ProfileAdapter::GeolocationPermission: case ProfileAdapter::NotificationPermission: + case ProfileAdapter::ClipboardReadWrite: return true; default: break; @@ -89,13 +91,11 @@ static blink::mojom::PermissionStatus getStatusFromSettings(blink::PermissionTyp { switch (type) { case blink::PermissionType::CLIPBOARD_READ_WRITE: - if (!settings->testAttribute(QWebEngineSettings::JavascriptCanPaste)) - return blink::mojom::PermissionStatus::DENIED; - Q_FALLTHROUGH(); case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE: - if (!settings->testAttribute(QWebEngineSettings::JavascriptCanAccessClipboard)) - return blink::mojom::PermissionStatus::DENIED; - return blink::mojom::PermissionStatus::GRANTED; + if (settings->testAttribute(QWebEngineSettings::JavascriptCanPaste) + && settings->testAttribute(QWebEngineSettings::JavascriptCanAccessClipboard)) + return blink::mojom::PermissionStatus::GRANTED; + return blink::mojom::PermissionStatus::ASK; default: return blink::mojom::PermissionStatus::ASK; } @@ -198,14 +198,17 @@ void PermissionManagerQt::RequestPermissions(content::RenderFrameHost *frameHost result.reserve(requestDescription.permissions.size()); for (blink::PermissionType permission : requestDescription.permissions) { const ProfileAdapter::PermissionType permissionType = toQt(permission); - if (permissionType == ProfileAdapter::UnsupportedPermission) + if (permissionType == ProfileAdapter::UnsupportedPermission) { result.push_back(blink::mojom::PermissionStatus::DENIED); - else if (permissionType == ProfileAdapter::ClipboardRead || permissionType == ProfileAdapter::ClipboardWrite) - result.push_back(getStatusFromSettings(permission, contentsDelegate->webEngineSettings())); - else { + continue; + } + + auto status = getStatusFromSettings(permission, contentsDelegate->webEngineSettings()); + if (status == blink::mojom::PermissionStatus::ASK) { answerable = false; break; - } + } else + result.push_back(status); } if (answerable) { std::move(callback).Run(result); @@ -256,7 +259,9 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForCurren WebContentsDelegateQt *delegate = static_cast<WebContentsDelegateQt *>( content::WebContents::FromRenderFrameHost(render_frame_host)->GetDelegate()); Q_ASSERT(delegate); - return getStatusFromSettings(permission, delegate->webEngineSettings()); + auto status = getStatusFromSettings(permission, delegate->webEngineSettings()); + if (status != blink::mojom::PermissionStatus::ASK) + return status; } return GetPermissionStatus( diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h index eab910d1d..018ca5a00 100644 --- a/src/core/profile_adapter.h +++ b/src/core/profile_adapter.h @@ -133,8 +133,7 @@ public: NotificationPermission = 2, AudioCapturePermission = 3, VideoCapturePermission = 4, - ClipboardRead = 5, - ClipboardWrite = 6, + ClipboardReadWrite = 5, }; enum PermissionState { diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index c5f931a69..700e18b25 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -492,6 +492,8 @@ static QQuickWebEngineView::Feature toFeature(QtWebEngineCore::ProfileAdapter::P return QQuickWebEngineView::Notifications; case QtWebEngineCore::ProfileAdapter::GeolocationPermission: return QQuickWebEngineView::Geolocation; + case QtWebEngineCore::ProfileAdapter::ClipboardReadWrite: + return QQuickWebEngineView::ClipboardReadWrite; default: break; } @@ -1781,6 +1783,11 @@ void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQu d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission); break; + case ClipboardReadWrite: + d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::ClipboardReadWrite, + granted ? ProfileAdapter::AllowedPermission + : ProfileAdapter::DeniedPermission); + break; default: Q_UNREACHABLE(); } diff --git a/src/webenginequick/api/qquickwebengineview_p.h b/src/webenginequick/api/qquickwebengineview_p.h index 4cbe4cfd2..5c59ec9bb 100644 --- a/src/webenginequick/api/qquickwebengineview_p.h +++ b/src/webenginequick/api/qquickwebengineview_p.h @@ -173,6 +173,7 @@ QT_WARNING_POP DesktopVideoCapture, DesktopAudioVideoCapture, Notifications, + ClipboardReadWrite, }; Q_ENUM(Feature) diff --git a/src/webenginequick/doc/src/webengineview_lgpl.qdoc b/src/webenginequick/doc/src/webengineview_lgpl.qdoc index 6b731b11b..a9ce40d4b 100644 --- a/src/webenginequick/doc/src/webengineview_lgpl.qdoc +++ b/src/webenginequick/doc/src/webengineview_lgpl.qdoc @@ -859,6 +859,12 @@ Both audio and video output capture. (Added in Qt 5.10) \value WebEnginView.Notifications Web notifications for the end-user. + \value WebEngineView.ClipboardReadWrite + Read and write access for the clipboard. If both \l{WebEngineSettings::JavascriptCanPaste} + {JavascriptCanPaste} and \l{WebEngineSettings::JavascriptCanAccessClipboard} + {JavascriptCanAccessClipboard} settings are enabled, this permission will always be granted + automatically and no feature requests will be made. + (Added in Qt 6.8) \sa featurePermissionRequested(), grantFeaturePermission() */ |
