summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSzabolcs David <davidsz@inf.u-szeged.hu>2019-01-24 17:42:39 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-01-30 15:58:34 +0000
commitf2bdf9af580dd7f8676948c6437b33a01dfc8894 (patch)
treefc4caa04d760849b6bc9f8d902ac290732a10771 /src
parentb573b064c5f724c56a77d68b32ce8e3c16694a4f (diff)
Answer permission checks for clipboard permissions
Wire page settings into clipboard permissions and add some auto test. Task-number: QTBUG-72714 Change-Id: If921c65cdff7f55a48340d90fc593071febc6ebe Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/core/permission_manager_qt.cpp48
-rw-r--r--src/core/profile_adapter.h2
2 files changed, 42 insertions, 8 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp
index 2fa42bf10..b15cdb038 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 {
@@ -70,7 +71,9 @@ ProfileAdapter::PermissionType toQt(content::PermissionType type)
case content::PermissionType::SENSORS:
case content::PermissionType::ACCESSIBILITY_EVENTS:
case content::PermissionType::CLIPBOARD_READ:
+ return ProfileAdapter::ClipboardRead;
case content::PermissionType::CLIPBOARD_WRITE:
+ return ProfileAdapter::ClipboardWrite;
case content::PermissionType::PAYMENT_HANDLER:
case content::PermissionType::NUM:
break;
@@ -153,19 +156,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),
@@ -183,6 +195,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());
@@ -190,7 +206,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;
}
@@ -201,9 +224,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),
@@ -240,6 +260,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 f2a5cdb49..9bc92b54a 100644
--- a/src/core/profile_adapter.h
+++ b/src/core/profile_adapter.h
@@ -153,6 +153,8 @@ public:
// NotificationPermission = 2,
AudioCapturePermission = 3,
VideoCapturePermission = 4,
+ ClipboardRead = 5,
+ ClipboardWrite = 6,
};
HttpCacheType httpCacheType() const;