Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(651)

Unified Diff: content/child/permissions/permission_dispatcher.cc

Issue 1260193009: renderer: implement multiple permission requesting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permissions-request-multiple
Patch Set: Address review comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/child/permissions/permission_dispatcher.cc
diff --git a/content/child/permissions/permission_dispatcher.cc b/content/child/permissions/permission_dispatcher.cc
index 8824276e7a0601fc252667a4331bc4129482fa47..4c2e054e0cf5b8229bd507016c9871a0c6c9c457 100644
--- a/content/child/permissions/permission_dispatcher.cc
+++ b/content/child/permissions/permission_dispatcher.cc
@@ -102,6 +102,14 @@ void PermissionDispatcher::requestPermission(
type, origin.string().utf8(), callback, kNoWorkerThread);
}
+void PermissionDispatcher::requestPermissions(
+ const blink::WebVector<blink::WebPermissionType>& types,
+ const blink::WebURL& origin,
+ blink::WebPermissionsCallback* callback) {
+ RequestPermissionsInternal(
+ types, origin.string().utf8(), callback, kNoWorkerThread);
+}
+
void PermissionDispatcher::revokePermission(
blink::WebPermissionType type,
const blink::WebURL& origin,
@@ -151,6 +159,14 @@ void PermissionDispatcher::RequestPermissionForWorker(
RequestPermissionInternal(type, origin, callback, worker_thread_id);
}
+void PermissionDispatcher::RequestPermissionsForWorker(
+ const blink::WebVector<blink::WebPermissionType>& types,
+ const std::string& origin,
+ blink::WebPermissionsCallback* callback,
+ int worker_thread_id) {
+ RequestPermissionsInternal(types, origin, callback, worker_thread_id);
+}
+
void PermissionDispatcher::RevokePermissionForWorker(
blink::WebPermissionType type,
const std::string& origin,
@@ -195,12 +211,18 @@ void PermissionDispatcher::GetNextPermissionChangeForWorker(
}
// static
-void PermissionDispatcher::RunCallbackOnWorkerThread(
+void PermissionDispatcher::RunPermissionCallbackOnWorkerThread(
scoped_ptr<blink::WebPermissionCallback> callback,
blink::WebPermissionStatus status) {
callback->onSuccess(status);
}
+void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread(
+ scoped_ptr<blink::WebPermissionsCallback> callback,
+ scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) {
+ callback->onSuccess(blink::adoptWebPtr(statuses.release()));
+}
+
PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() {
if (!permission_service_.get()) {
service_registry_->ConnectToRemoteService(
@@ -219,7 +241,7 @@ void PermissionDispatcher::QueryPermissionInternal(
// the |permission_service_| pipe will be destroyed too so OnQueryPermission
// will not be called.
uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- pending_callbacks_.add(callback_key,
+ permission_callbacks_.add(callback_key,
scoped_ptr<blink::WebPermissionCallback>(callback));
GetPermissionServicePtr()->HasPermission(
@@ -241,7 +263,7 @@ void PermissionDispatcher::RequestPermissionInternal(
// the |permission_service_| pipe will be destroyed too so OnQueryPermission
// will not be called.
uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- pending_callbacks_.add(callback_key,
+ permission_callbacks_.add(callback_key,
scoped_ptr<blink::WebPermissionCallback>(callback));
GetPermissionServicePtr()->RequestPermission(
@@ -254,6 +276,33 @@ void PermissionDispatcher::RequestPermissionInternal(
callback_key));
}
+void PermissionDispatcher::RequestPermissionsInternal(
+ const blink::WebVector<blink::WebPermissionType>& types,
+ const std::string& origin,
+ blink::WebPermissionsCallback* callback,
+ int worker_thread_id) {
+ // We need to save the |callback| in an ScopedVector so if |this| gets
+ // deleted, the callback will not leak. In the case of |this| gets deleted,
+ // the |permission_service_| pipe will be destroyed too so OnQueryPermission
+ // will not be called.
+ uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
+ permissions_callbacks_.add(callback_key,
+ scoped_ptr<blink::WebPermissionsCallback>(callback));
+
+ mojo::Array<PermissionName> names(types.size());
+ for (size_t i = 0; i < types.size(); ++i)
+ names[i] = GetPermissionName(types[i]);
+
+ GetPermissionServicePtr()->RequestPermissions(
+ names.Pass(),
+ origin,
+ blink::WebUserGestureIndicator::isProcessingUserGesture(),
+ base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse,
+ base::Unretained(this),
+ worker_thread_id,
+ callback_key));
+}
+
void PermissionDispatcher::RevokePermissionInternal(
blink::WebPermissionType type,
const std::string& origin,
@@ -264,7 +313,7 @@ void PermissionDispatcher::RevokePermissionInternal(
// the |permission_service_| pipe will be destroyed too so OnQueryPermission
// will not be called.
uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- pending_callbacks_.add(callback_key,
+ permission_callbacks_.add(callback_key,
scoped_ptr<blink::WebPermissionCallback>(callback));
GetPermissionServicePtr()->RevokePermission(
@@ -281,7 +330,7 @@ void PermissionDispatcher::OnPermissionResponse(
uintptr_t callback_key,
PermissionStatus result) {
scoped_ptr<blink::WebPermissionCallback> callback =
- pending_callbacks_.take_and_erase(callback_key);
+ permission_callbacks_.take_and_erase(callback_key);
blink::WebPermissionStatus status = GetWebPermissionStatus(result);
if (worker_thread_id != kNoWorkerThread) {
@@ -289,7 +338,7 @@ void PermissionDispatcher::OnPermissionResponse(
// gracefully fail, destroying the callback too.
WorkerTaskRunner::Instance()->PostTask(
worker_thread_id,
- base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread,
+ base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread,
base::Passed(&callback), status));
return;
}
@@ -297,6 +346,32 @@ void PermissionDispatcher::OnPermissionResponse(
callback->onSuccess(status);
}
+void PermissionDispatcher::OnRequestPermissionsResponse(
+ int worker_thread_id,
+ uintptr_t callback_key,
+ const mojo::Array<PermissionStatus>& result) {
+ scoped_ptr<blink::WebPermissionsCallback> callback =
+ permissions_callbacks_.take_and_erase(callback_key);
+ scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses(
+ new blink::WebVector<blink::WebPermissionStatus>(result.size()));
+
+ for (size_t i = 0; i < result.size(); i++)
+ statuses->operator[](i) = GetWebPermissionStatus(result[i]);
+
+ if (worker_thread_id != kNoWorkerThread) {
+ // If the worker is no longer running, ::PostTask() will return false and
+ // gracefully fail, destroying the callback too.
+ WorkerTaskRunner::Instance()->PostTask(
+ worker_thread_id,
+ base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread,
+ base::Passed(&callback),
+ base::Passed(&statuses)));
+ return;
+ }
+
+ callback->onSuccess(blink::adoptWebPtr(statuses.release()));
+}
+
void PermissionDispatcher::OnPermissionChanged(
blink::WebPermissionType type,
const std::string& origin,
« no previous file with comments | « content/child/permissions/permission_dispatcher.h ('k') | content/child/permissions/permission_dispatcher_thread_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698