| 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,
|
|
|