From f2bdf9af580dd7f8676948c6437b33a01dfc8894 Mon Sep 17 00:00:00 2001 From: Szabolcs David Date: Thu, 24 Jan 2019 17:42:39 +0100 Subject: 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 --- src/core/permission_manager_qt.cpp | 48 +++++++++++++++++++++++++++++++------- src/core/profile_adapter.h | 2 ++ 2 files changed, 42 insertions(+), 8 deletions(-) (limited to 'src') 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& callback) { - int request_id = ++m_requestIdCount; + WebContentsDelegateQt *contentsDelegate = static_cast( + 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(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&)>& callback) { + WebContentsDelegateQt *contentsDelegate = static_cast( + content::WebContents::FromRenderFrameHost(frameHost)->GetDelegate()); + Q_ASSERT(contentsDelegate); + bool answerable = true; std::vector result; result.reserve(permissions.size()); @@ -190,7 +206,14 @@ int PermissionManagerQt::RequestPermissions(const std::vectorwebEngineSettings(); + 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::vectorGetRenderViewHost()->GetDelegate()->GetAsWebContents(); - WebContentsDelegateQt* contentsDelegate = static_cast(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( + 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; -- cgit v1.2.3