summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-04-15 13:01:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-05-20 10:40:00 +0200
commit1fa77712fb241e9c87bf97263df57a5f6f905702 (patch)
treebde6b4c4ddbeb06126a287510354c033ba7cd1b4
parent2beb353bb850c4c6a09d497cea5b597a8543e1ab (diff)
Add support for clearing the feature request
Task-number: QTBUG-83476 Change-Id: I63ad9801e3e97f7fdac959600c69c04d0105be1f Reviewed-by: Kirill Burtsev <kirill.burtsev@qt.io>
-rw-r--r--src/core/permission_manager_qt.cpp26
-rw-r--r--src/core/permission_manager_qt.h11
-rw-r--r--src/core/profile_adapter.cpp2
-rw-r--r--src/core/profile_adapter.h8
-rw-r--r--src/core/web_contents_adapter.cpp6
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/webengine/api/qquickwebengineview.cpp10
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp30
8 files changed, 68 insertions, 27 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp
index 2f9543769..862a1c262 100644
--- a/src/core/permission_manager_qt.cpp
+++ b/src/core/permission_manager_qt.cpp
@@ -102,6 +102,18 @@ static bool canRequestPermissionFor(ProfileAdapter::PermissionType type)
return false;
}
+static blink::mojom::PermissionStatus toBlink(ProfileAdapter::PermissionState reply)
+{
+ switch (reply) {
+ case ProfileAdapter::AskPermission:
+ return blink::mojom::PermissionStatus::ASK;
+ case ProfileAdapter::AllowedPermission:
+ return blink::mojom::PermissionStatus::GRANTED;
+ case ProfileAdapter::DeniedPermission:
+ return blink::mojom::PermissionStatus::DENIED;
+ }
+}
+
PermissionManagerQt::PermissionManagerQt()
: m_requestIdCount(0)
, m_subscriberIdCount(0)
@@ -112,7 +124,7 @@ PermissionManagerQt::~PermissionManagerQt()
{
}
-void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter::PermissionType type, bool reply)
+void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter::PermissionType type, ProfileAdapter::PermissionState reply)
{
// Normalize the QUrl to GURL origin form.
const GURL gorigin = toGurl(url).GetOrigin();
@@ -120,9 +132,12 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter
if (origin.isEmpty())
return;
QPair<QUrl, ProfileAdapter::PermissionType> key(origin, type);
- m_permissions[key] = reply;
- blink::mojom::PermissionStatus status = reply ? blink::mojom::PermissionStatus::GRANTED : blink::mojom::PermissionStatus::DENIED;
- {
+ if (reply == ProfileAdapter::AskPermission)
+ m_permissions.remove(key);
+ else
+ m_permissions[key] = (reply == ProfileAdapter::AllowedPermission);
+ blink::mojom::PermissionStatus status = toBlink(reply);
+ if (reply != ProfileAdapter::AskPermission) {
auto it = m_requests.begin();
while (it != m_requests.end()) {
if (it->origin == origin && it->type == type) {
@@ -137,6 +152,9 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &url, ProfileAdapter
it.second.callback.Run(status);
}
+ if (reply == ProfileAdapter::AskPermission)
+ return;
+
auto it = m_multiRequests.begin();
while (it != m_multiRequests.end()) {
if (it->origin == origin) {
diff --git a/src/core/permission_manager_qt.h b/src/core/permission_manager_qt.h
index 6ab071237..e046174df 100644
--- a/src/core/permission_manager_qt.h
+++ b/src/core/permission_manager_qt.h
@@ -54,10 +54,9 @@ class PermissionManagerQt : public content::PermissionControllerDelegate {
public:
PermissionManagerQt();
~PermissionManagerQt();
- typedef ProfileAdapter::PermissionType PermissionType;
- void permissionRequestReply(const QUrl &origin, PermissionType type, bool reply);
- bool checkPermission(const QUrl &origin, PermissionType type);
+ void permissionRequestReply(const QUrl &origin, ProfileAdapter::PermissionType type, ProfileAdapter::PermissionState reply);
+ bool checkPermission(const QUrl &origin, ProfileAdapter::PermissionType type);
// content::PermissionManager implementation:
int RequestPermission(
@@ -99,10 +98,10 @@ public:
void UnsubscribePermissionStatusChange(int subscription_id) override;
private:
- QHash<QPair<QUrl, PermissionType>, bool> m_permissions;
+ QHash<QPair<QUrl, ProfileAdapter::PermissionType>, bool> m_permissions;
struct Request {
int id;
- PermissionType type;
+ ProfileAdapter::PermissionType type;
QUrl origin;
base::OnceCallback<void(blink::mojom::PermissionStatus)> callback;
};
@@ -113,7 +112,7 @@ private:
base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback;
};
struct Subscription {
- PermissionType type;
+ ProfileAdapter::PermissionType type;
QUrl origin;
base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback;
};
diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp
index b87591c97..4557ad7a4 100644
--- a/src/core/profile_adapter.cpp
+++ b/src/core/profile_adapter.cpp
@@ -543,7 +543,7 @@ UserResourceControllerHost *ProfileAdapter::userResourceController()
return m_userResourceController.data();
}
-void ProfileAdapter::permissionRequestReply(const QUrl &origin, PermissionType type, bool reply)
+void ProfileAdapter::permissionRequestReply(const QUrl &origin, PermissionType type, PermissionState reply)
{
static_cast<PermissionManagerQt*>(profile()->GetPermissionControllerDelegate())->permissionRequestReply(origin, type, reply);
}
diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h
index 1e5a3e21f..efd56e50e 100644
--- a/src/core/profile_adapter.h
+++ b/src/core/profile_adapter.h
@@ -164,6 +164,12 @@ public:
ClipboardWrite = 6,
};
+ enum PermissionState {
+ AskPermission = 0,
+ AllowedPermission = 1,
+ DeniedPermission = 2
+ };
+
HttpCacheType httpCacheType() const;
void setHttpCacheType(ProfileAdapter::HttpCacheType);
@@ -187,7 +193,7 @@ public:
const QList<QByteArray> customUrlSchemes() const;
UserResourceControllerHost *userResourceController();
- void permissionRequestReply(const QUrl &origin, PermissionType type, bool reply);
+ void permissionRequestReply(const QUrl &origin, PermissionType type, PermissionState reply);
bool checkPermission(const QUrl &origin, PermissionType type);
QString httpAcceptLanguageWithoutQualities() const;
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index da2902dc3..ef482ef08 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -1360,13 +1360,13 @@ void WebContentsAdapter::grantMediaAccessPermission(const QUrl &securityOrigin,
CHECK_INITIALIZED();
// Let the permission manager remember the reply.
if (flags & WebContentsAdapterClient::MediaAudioCapture)
- m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::AudioCapturePermission, true);
+ m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::AudioCapturePermission, ProfileAdapter::AllowedPermission);
if (flags & WebContentsAdapterClient::MediaVideoCapture)
- m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::VideoCapturePermission, true);
+ m_profileAdapter->permissionRequestReply(securityOrigin, ProfileAdapter::VideoCapturePermission, ProfileAdapter::AllowedPermission);
MediaCaptureDevicesDispatcher::GetInstance()->handleMediaAccessPermissionResponse(m_webContents.get(), securityOrigin, flags);
}
-void WebContentsAdapter::runFeatureRequestCallback(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, bool allowed)
+void WebContentsAdapter::grantFeaturePermission(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, ProfileAdapter::PermissionState allowed)
{
Q_ASSERT(m_profileAdapter);
m_profileAdapter->permissionRequestReply(securityOrigin, feature, allowed);
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 66808ce5e..d833314f2 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -196,7 +196,7 @@ public:
void grantMediaAccessPermission(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags flags);
void grantMouseLockPermission(const QUrl &securityOrigin, bool granted);
void handlePendingMouseLockPermission();
- void runFeatureRequestCallback(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, bool allowed);
+ void grantFeaturePermission(const QUrl &securityOrigin, ProfileAdapter::PermissionType feature, ProfileAdapter::PermissionState allowed);
void setBackgroundColor(const QColor &color);
QAccessibleInterface *browserAccessible();
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 804d81e54..aeb202c6a 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -1644,9 +1644,6 @@ void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQu
case MediaAudioVideoCapture:
d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaRequestFlags(WebContentsAdapterClient::MediaAudioCapture | WebContentsAdapterClient::MediaVideoCapture));
break;
- case Geolocation:
- d_ptr->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, granted);
- break;
case DesktopVideoCapture:
d_ptr->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture);
break;
@@ -1657,8 +1654,13 @@ void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQu
WebContentsAdapterClient::MediaDesktopAudioCapture |
WebContentsAdapterClient::MediaDesktopVideoCapture));
break;
+ case Geolocation:
+ d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission,
+ granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission);
+ break;
case Notifications:
- d_ptr->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, granted);
+ d_ptr->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission,
+ granted ? ProfileAdapter::AllowedPermission : ProfileAdapter::DeniedPermission);
break;
default:
Q_UNREACHABLE();
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index dc06e48be..4d47ef747 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -1931,8 +1931,24 @@ QMenu *QWebEnginePage::createStandardContextMenu()
void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEnginePage::Feature feature, QWebEnginePage::PermissionPolicy policy)
{
Q_D(QWebEnginePage);
- if (policy == PermissionUnknown)
+ if (policy == PermissionUnknown) {
+ switch (feature) {
+ case MediaAudioVideoCapture:
+ case MediaAudioCapture:
+ case MediaVideoCapture:
+ case DesktopAudioVideoCapture:
+ case DesktopVideoCapture:
+ case MouseLock:
+ break;
+ case Geolocation:
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::AskPermission);
+ break;
+ case Notifications:
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AskPermission);
+ break;
+ }
return;
+ }
const WebContentsAdapterClient::MediaRequestFlags audioVideoCaptureFlags(
WebContentsAdapterClient::MediaVideoCapture |
@@ -1958,14 +1974,14 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine
case DesktopVideoCapture:
d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaDesktopVideoCapture);
break;
- case Geolocation:
- d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, true);
- break;
case MouseLock:
d->adapter->grantMouseLockPermission(securityOrigin, true);
break;
+ case Geolocation:
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::AllowedPermission);
+ break;
case Notifications:
- d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, true);
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::AllowedPermission);
break;
}
} else { // if (policy == PermissionDeniedByUser)
@@ -1978,13 +1994,13 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine
d->adapter->grantMediaAccessPermission(securityOrigin, WebContentsAdapterClient::MediaNone);
break;
case Geolocation:
- d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::GeolocationPermission, false);
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::GeolocationPermission, ProfileAdapter::DeniedPermission);
break;
case MouseLock:
d->adapter->grantMouseLockPermission(securityOrigin, false);
break;
case Notifications:
- d->adapter->runFeatureRequestCallback(securityOrigin, ProfileAdapter::NotificationPermission, false);
+ d->adapter->grantFeaturePermission(securityOrigin, ProfileAdapter::NotificationPermission, ProfileAdapter::DeniedPermission);
break;
}
}