diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-02-01 14:51:46 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-02-01 14:51:46 +0100 |
commit | d782265b08e28ccb6cb83e32b449386b7883848c (patch) | |
tree | ab7ac80d26434366c0fd4cc4fb5302cc8e2c6cf6 | |
parent | 3bff0bae7e0c660fc25c5c46dedaf9cb89563a58 (diff) | |
parent | 435586eedf983ab9b81291cb8cdfcce28822a0c4 (diff) |
Merge remote-tracking branch 'origin/5.12' into 5.13
Change-Id: I2889e49fe9f71bfc996689feb0f350e09569f611
-rw-r--r-- | src/core/permission_manager_qt.cpp | 49 | ||||
-rw-r--r-- | src/core/profile_adapter.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp | 33 |
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) |