summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/permission_manager_qt.cpp49
-rw-r--r--src/core/profile_adapter.h2
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h2
-rw-r--r--tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp33
4 files changed, 76 insertions, 10 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp
index b6d055e27..cf3041e7a 100644
--- a/src/core/permission_manager_qt.cpp
+++ b/src/core/permission_manager_qt.cpp
@@ -48,6 +48,7 @@
#include "type_conversion.h"
#include "web_contents_delegate_qt.h"
+#include "web_engine_settings.h"
namespace QtWebEngineCore {
@@ -69,8 +70,11 @@ ProfileAdapter::PermissionType toQt(content::PermissionType type)
case content::PermissionType::BACKGROUND_SYNC:
case content::PermissionType::SENSORS:
case content::PermissionType::ACCESSIBILITY_EVENTS:
+ break;
case content::PermissionType::CLIPBOARD_READ:
+ return ProfileAdapter::ClipboardRead;
case content::PermissionType::CLIPBOARD_WRITE:
+ return ProfileAdapter::ClipboardWrite;
case content::PermissionType::PAYMENT_HANDLER:
case content::PermissionType::BACKGROUND_FETCH:
case content::PermissionType::NUM:
@@ -154,19 +158,28 @@ int PermissionManagerQt::RequestPermission(content::PermissionType permission,
bool /*user_gesture*/,
const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
{
- int request_id = ++m_requestIdCount;
+ WebContentsDelegateQt *contentsDelegate = static_cast<WebContentsDelegateQt *>(
+ content::WebContents::FromRenderFrameHost(frameHost)->GetDelegate());
+ Q_ASSERT(contentsDelegate);
+
ProfileAdapter::PermissionType permissionType = toQt(permission);
if (permissionType == ProfileAdapter::UnsupportedPermission) {
callback.Run(blink::mojom::PermissionStatus::DENIED);
return content::PermissionController::kNoPendingOperation;
+ } else if (permissionType == ProfileAdapter::ClipboardRead) {
+ WebEngineSettings *settings = contentsDelegate->webEngineSettings();
+ if (settings->testAttribute(WebEngineSettings::JavascriptCanAccessClipboard)
+ && settings->testAttribute(WebEngineSettings::JavascriptCanPaste))
+ callback.Run(blink::mojom::PermissionStatus::GRANTED);
+ else
+ 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);
- content::WebContents *webContents = frameHost->GetRenderViewHost()->GetDelegate()->GetAsWebContents();
- WebContentsDelegateQt* contentsDelegate = static_cast<WebContentsDelegateQt*>(webContents->GetDelegate());
- Q_ASSERT(contentsDelegate);
+ int request_id = ++m_requestIdCount;
RequestOrSubscription request = {
permissionType,
toQt(requesting_origin),
@@ -184,6 +197,10 @@ int PermissionManagerQt::RequestPermissions(const std::vector<content::Permissio
bool /*user_gesture*/,
const base::Callback<void(const std::vector<blink::mojom::PermissionStatus>&)>& callback)
{
+ WebContentsDelegateQt *contentsDelegate = static_cast<WebContentsDelegateQt *>(
+ content::WebContents::FromRenderFrameHost(frameHost)->GetDelegate());
+ Q_ASSERT(contentsDelegate);
+
bool answerable = true;
std::vector<blink::mojom::PermissionStatus> result;
result.reserve(permissions.size());
@@ -191,7 +208,14 @@ int PermissionManagerQt::RequestPermissions(const std::vector<content::Permissio
const ProfileAdapter::PermissionType permissionType = toQt(permission);
if (permissionType == ProfileAdapter::UnsupportedPermission)
result.push_back(blink::mojom::PermissionStatus::DENIED);
- else {
+ else if (permissionType == ProfileAdapter::ClipboardRead) {
+ WebEngineSettings *settings = contentsDelegate->webEngineSettings();
+ if (settings->testAttribute(WebEngineSettings::JavascriptCanAccessClipboard)
+ && settings->testAttribute(WebEngineSettings::JavascriptCanPaste))
+ result.push_back(blink::mojom::PermissionStatus::GRANTED);
+ else
+ result.push_back(blink::mojom::PermissionStatus::DENIED);
+ } else {
answerable = false;
break;
}
@@ -202,9 +226,6 @@ int PermissionManagerQt::RequestPermissions(const std::vector<content::Permissio
}
int request_id = ++m_requestIdCount;
- content::WebContents *webContents = frameHost->GetRenderViewHost()->GetDelegate()->GetAsWebContents();
- WebContentsDelegateQt* contentsDelegate = static_cast<WebContentsDelegateQt*>(webContents->GetDelegate());
- Q_ASSERT(contentsDelegate);
MultiRequest request = {
permissions,
toQt(requesting_origin),
@@ -241,6 +262,18 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForFrame(
content::RenderFrameHost *render_frame_host,
const GURL &requesting_origin)
{
+ if (permission == content::PermissionType::CLIPBOARD_READ ||
+ permission == content::PermissionType::CLIPBOARD_WRITE) {
+ WebContentsDelegateQt *delegate = static_cast<WebContentsDelegateQt *>(
+ content::WebContents::FromRenderFrameHost(render_frame_host)->GetDelegate());
+ if (!delegate->webEngineSettings()->testAttribute(WebEngineSettings::JavascriptCanAccessClipboard))
+ return blink::mojom::PermissionStatus::DENIED;
+ if (permission == content::PermissionType::CLIPBOARD_READ &&
+ !delegate->webEngineSettings()->testAttribute(WebEngineSettings::JavascriptCanPaste))
+ return blink::mojom::PermissionStatus::DENIED;
+ return blink::mojom::PermissionStatus::GRANTED;
+ }
+
return GetPermissionStatus(
permission,
requesting_origin,
diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h
index 3b1b9bc91..800058bc5 100644
--- a/src/core/profile_adapter.h
+++ b/src/core/profile_adapter.h
@@ -157,6 +157,8 @@ public:
// NotificationPermission = 2,
AudioCapturePermission = 3,
VideoCapturePermission = 4,
+ ClipboardRead = 5,
+ ClipboardWrite = 6,
};
HttpCacheType httpCacheType() const;
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index 4fd195074..5eda8c72f 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -77,8 +77,6 @@ class QWEBENGINEWIDGETS_EXPORT QWebEnginePage : public QObject {
Q_OBJECT
Q_PROPERTY(QString selectedText READ selectedText)
Q_PROPERTY(bool hasSelection READ hasSelection)
-
- // Ex-QWebFrame properties
Q_PROPERTY(QUrl requestedUrl READ requestedUrl)
Q_PROPERTY(qreal zoomFactor READ zoomFactor WRITE setZoomFactor)
Q_PROPERTY(QString title READ title)
diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
index d467cd8ae..8947bba9d 100644
--- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
+++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp
@@ -1110,6 +1110,39 @@ void tst_QQuickWebEngineView::javascriptClipboard()
QCOMPARE(evaluateJavaScriptSync(view, "document.execCommand('paste')").toBool(), pasteResult);
QCOMPARE(evaluateJavaScriptSync(view, "document.getElementById('myInput').value").toString(),
(pasteResult ? QString("AnotherText") : QString("OriginalText")));
+
+ // Test settings on clipboard permissions
+ evaluateJavaScriptSync(view,
+ QStringLiteral(
+ "var accessGranted = false;"
+ "var accessDenied = false;"
+ "var accessPrompt = false;"
+ "navigator.permissions.query({name:'clipboard-write'})"
+ ".then(result => {"
+ "if (result.state == 'granted') accessGranted = true;"
+ "if (result.state == 'denied') accessDenied = true;"
+ "if (result.state == 'prompt') accessPrompt = true;"
+ "})"));
+
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessGranted").toBool(), copyResult);
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessDenied").toBool(), !javascriptCanAccessClipboard);
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessPrompt").toBool(), false);
+
+ evaluateJavaScriptSync(view,
+ QStringLiteral(
+ "accessGranted = false;"
+ "accessDenied = false;"
+ "accessPrompt = false;"
+ "navigator.permissions.query({name:'clipboard-read'})"
+ ".then(result => {"
+ "if (result.state == 'granted') accessGranted = true;"
+ "if (result.state == 'denied') accessDenied = true;"
+ "if (result.state == 'prompt') accessPrompt = true;"
+ "})"));
+
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessGranted").toBool(), pasteResult);
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessDenied").toBool(), !javascriptCanAccessClipboard || !javascriptCanPaste);
+ QTRY_COMPARE(evaluateJavaScriptSync(view, "accessPrompt").toBool(), false);
}
QTEST_MAIN(tst_QQuickWebEngineView)