summaryrefslogtreecommitdiffstats
path: root/src/core/permission_manager_qt.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-09-19 13:43:03 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-10-25 07:03:39 +0000
commit2e0653699ca849714cfe1481068b02539df46cd5 (patch)
treeca12a0f39bb3573681f999c27b8994029947aa40 /src/core/permission_manager_qt.cpp
parent049a2ef68fe37d86b1367fcaf5844aadf0e3fd96 (diff)
Adaptations to 61-based
Change-Id: I5cb198445f283c6cea8187a1a2883896df0ee918 Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'src/core/permission_manager_qt.cpp')
-rw-r--r--src/core/permission_manager_qt.cpp86
1 files changed, 67 insertions, 19 deletions
diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp
index 4c941406c..5328166d1 100644
--- a/src/core/permission_manager_qt.cpp
+++ b/src/core/permission_manager_qt.cpp
@@ -88,18 +88,52 @@ void PermissionManagerQt::permissionRequestReply(const QUrl &origin, BrowserCont
QPair<QUrl, BrowserContextAdapter::PermissionType> key(origin, type);
m_permissions[key] = reply;
blink::mojom::PermissionStatus status = reply ? blink::mojom::PermissionStatus::GRANTED : blink::mojom::PermissionStatus::DENIED;
- auto it = m_requests.begin();
- while (it != m_requests.end()) {
- if (it->origin == origin && it->type == type) {
- it->callback.Run(status);
- it = m_requests.erase(it);
- } else
- ++it;
+ {
+ auto it = m_requests.begin();
+ while (it != m_requests.end()) {
+ if (it->origin == origin && it->type == type) {
+ it->callback.Run(status);
+ it = m_requests.erase(it);
+ } else
+ ++it;
+ }
}
Q_FOREACH (const RequestOrSubscription &subscriber, m_subscribers) {
if (subscriber.origin == origin && subscriber.type == type)
subscriber.callback.Run(status);
}
+
+ auto it = m_multiRequests.begin();
+ while (it != m_multiRequests.end()) {
+ if (it->origin == origin) {
+ bool answerable = true;
+ std::vector<blink::mojom::PermissionStatus> result;
+ result.reserve(it->types.size());
+ for (content::PermissionType permission : it->types) {
+ const BrowserContextAdapter::PermissionType permissionType = toQt(permission);
+ if (permissionType == BrowserContextAdapter::UnsupportedPermission) {
+ result.push_back(blink::mojom::PermissionStatus::DENIED);
+ continue;
+ }
+
+ QPair<QUrl, BrowserContextAdapter::PermissionType> key(origin, permissionType);
+ if (!m_permissions.contains(key)) {
+ answerable = false;
+ break;
+ }
+ if (m_permissions[key])
+ result.push_back(blink::mojom::PermissionStatus::GRANTED);
+ else
+ result.push_back(blink::mojom::PermissionStatus::DENIED);
+ }
+ if (answerable) {
+ it->callback.Run(result);
+ it = m_multiRequests.erase(it);
+ continue;
+ }
+ }
+ ++it;
+ }
}
bool PermissionManagerQt::checkPermission(const QUrl &origin, BrowserContextAdapter::PermissionType type)
@@ -144,32 +178,46 @@ int PermissionManagerQt::RequestPermissions(const std::vector<content::Permissio
bool /*user_gesture*/,
const base::Callback<void(const std::vector<blink::mojom::PermissionStatus>&)>& callback)
{
- NOTIMPLEMENTED() << "RequestPermissions has not been implemented in QtWebEngine";
- Q_UNUSED(frameHost);
-
- std::vector<blink::mojom::PermissionStatus> result(permissions.size());
+ bool answerable = true;
+ std::vector<blink::mojom::PermissionStatus> result;
+ result.reserve(permissions.size());
for (content::PermissionType permission : permissions) {
const BrowserContextAdapter::PermissionType permissionType = toQt(permission);
if (permissionType == BrowserContextAdapter::UnsupportedPermission)
result.push_back(blink::mojom::PermissionStatus::DENIED);
else {
- QPair<QUrl, BrowserContextAdapter::PermissionType> key(toQt(requesting_origin), permissionType);
- // TODO: Request permission from UI
- if (m_permissions.contains(key) && m_permissions[key])
- result.push_back(blink::mojom::PermissionStatus::GRANTED);
- else
- result.push_back(blink::mojom::PermissionStatus::DENIED);
+ answerable = false;
+ break;
}
}
+ if (answerable) {
+ callback.Run(result);
+ return kNoPendingOperation;
+ }
- callback.Run(result);
- return kNoPendingOperation;
+ 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),
+ callback
+ };
+ m_multiRequests.insert(request_id, request);
+ for (content::PermissionType permission : permissions) {
+ const BrowserContextAdapter::PermissionType permissionType = toQt(permission);
+ if (permissionType == BrowserContextAdapter::GeolocationPermission)
+ contentsDelegate->requestGeolocationPermission(request.origin);
+ }
+ return request_id;
}
void PermissionManagerQt::CancelPermissionRequest(int request_id)
{
// Should we add API to cancel permissions in the UI level?
m_requests.remove(request_id);
+ m_multiRequests.remove(request_id);
}
blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatus(