summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMoss Heim <self@mossheim.net>2023-12-13 13:39:16 +0100
committerMoss Heim <moss.heim@qt.io>2024-03-11 10:33:05 +0100
commitfbb216fa3119d06f88744e18d3f4f53d64fcf523 (patch)
tree1f6c7cea4f33b2ac5cff000919ff0175768f9fd0 /src
parent8064e40e070c2319dd87578bda5ad68b9abdbee0 (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.cpp14
-rw-r--r--src/core/api/qwebenginepage.h3
-rw-r--r--src/core/doc/src/qwebenginepage_lgpl.qdoc5
-rw-r--r--src/core/permission_manager_qt.cpp33
-rw-r--r--src/core/profile_adapter.h3
-rw-r--r--src/webenginequick/api/qquickwebengineview.cpp7
-rw-r--r--src/webenginequick/api/qquickwebengineview_p.h1
-rw-r--r--src/webenginequick/doc/src/webengineview_lgpl.qdoc6
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()
*/