Chromium Code Reviews| Index: content/browser/permissions/permission_service_impl.cc |
| diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc |
| index 922091e40909bc0dc2d71267b3a76814408e7177..23cb697212de08cb2fe7ece10766cdbd37247438 100644 |
| --- a/content/browser/permissions/permission_service_impl.cc |
| +++ b/content/browser/permissions/permission_service_impl.cc |
| @@ -39,20 +39,30 @@ PermissionType PermissionNameToPermissionType(PermissionName name) { |
| return PermissionType::NUM; |
| } |
| +void PermissionRequestResponseCallbackWrapper( |
|
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Could you add a comment explaining why you need th
Lalit Maganti
2015/09/16 17:21:18
Done.
|
| + const mojo::Callback<void(PermissionStatus)>& callback, |
| + const mojo::Array<PermissionStatus>& vector) { |
| + DCHECK(vector.size() == 1); |
| + callback.Run(vector[0]); |
| +} |
| + |
| } // anonymous namespace |
| PermissionServiceImpl::PendingRequest::PendingRequest( |
| - PermissionType permission, |
| - const GURL& origin, |
| - const PermissionStatusCallback& callback) |
| - : permission(permission), |
| - origin(origin), |
| - callback(callback) { |
| + const PermissionsStatusCallback& callback, |
| + int request_count) |
| + : callback(callback), |
| + request_count(request_count) { |
| } |
| PermissionServiceImpl::PendingRequest::~PendingRequest() { |
| - if (!callback.is_null()) |
| - callback.Run(PERMISSION_STATUS_ASK); |
| + if (!callback.is_null()) { |
| + mojo::Array<PermissionStatus> result = |
| + mojo::Array<PermissionStatus>::New(request_count); |
| + for (int i = 0; i < request_count; ++i) |
| + result[i] = PERMISSION_STATUS_DENIED; |
| + callback.Run(result.Pass()); |
| + } |
| } |
| PermissionServiceImpl::PendingSubscription::PendingSubscription( |
| @@ -95,36 +105,72 @@ void PermissionServiceImpl::RequestPermission( |
| const mojo::String& origin, |
| bool user_gesture, |
| const PermissionStatusCallback& callback) { |
| + mojo::Array<PermissionName> permissions(1); |
| + permissions[0] = permission; |
| + RequestPermissionsInternal( |
| + permissions.Pass(), |
| + origin, |
| + user_gesture, |
| + base::Bind(&PermissionRequestResponseCallbackWrapper, |
|
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Can you add a comment explaining why you are doing
Lalit Maganti
2015/09/16 17:21:18
Done.
|
| + callback)); |
| +} |
| + |
| +void PermissionServiceImpl::RequestPermissions( |
| + mojo::Array<PermissionName> permissions, |
| + const mojo::String& origin, |
| + bool user_gesture, |
| + const PermissionsStatusCallback& callback) { |
| + RequestPermissionsInternal( |
| + permissions.Pass(), origin, user_gesture, callback); |
| +} |
| + |
| +void PermissionServiceImpl::RequestPermissionsInternal( |
| + mojo::Array<PermissionName> permissions, |
| + const mojo::String& origin, |
| + bool user_gesture, |
| + const PermissionsStatusCallback& callback) { |
| + if (permissions.is_null()) { |
| + callback.Run(mojo::Array<PermissionStatus>()); |
|
mlamouri (slow - plz ping)
2015/09/16 15:08:09
Is that even possible?
Lalit Maganti
2015/09/16 17:21:18
A rouge renderer I guess?
|
| + return; |
| + } |
| + |
| // This condition is valid if the call is coming from a ChildThread instead of |
| // a RenderFrame. Some consumers of the service run in Workers and some in |
| // Frames. In the context of a Worker, it is not possible to show a |
| // permission prompt because there is no tab. In the context of a Frame, we |
| // can. Even if the call comes from a context where it is not possible to show |
| // any UI, we want to still return something relevant so the current |
| - // permission status is returned. |
| + // permission status is returned for each permission. |
| if (!context_->render_frame_host()) { |
| - // There is no way to show a UI so the call will simply return the current |
| - // permission. |
| - HasPermission(permission, origin, callback); |
| + mojo::Array<PermissionStatus> result(permissions.size()); |
| + for (size_t i = 0; i < permissions.size(); ++i) |
| + result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin)); |
| + callback.Run(result.Pass()); |
| return; |
| } |
| BrowserContext* browser_context = context_->GetBrowserContext(); |
| DCHECK(browser_context); |
| if (!browser_context->GetPermissionManager()) { |
| - callback.Run(content::PERMISSION_STATUS_DENIED); |
| + mojo::Array<PermissionStatus> result(permissions.size()); |
| + for (size_t i = 0; i < permissions.size(); ++i) |
| + result[i] = PERMISSION_STATUS_DENIED; |
| + callback.Run(result.Pass()); |
| return; |
| } |
| - PermissionType permission_type = PermissionNameToPermissionType(permission); |
| + std::vector<PermissionType> types(permissions.size()); |
| + for (size_t i = 0; i < types.size(); ++i) |
| + types[i] = PermissionNameToPermissionType(permissions[i]); |
| + |
| int request_id = pending_requests_.Add( |
| - new PendingRequest(permission_type, GURL(origin), callback)); |
| - int manager_id = browser_context->GetPermissionManager()->RequestPermission( |
| - permission_type, |
| + new PendingRequest(callback, permissions.size())); |
| + int manager_id = browser_context->GetPermissionManager()->RequestPermissions( |
| + types, |
| context_->render_frame_host(), |
| GURL(origin), |
| user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770) |
| - base::Bind(&PermissionServiceImpl::OnRequestPermissionResponse, |
| + base::Bind(&PermissionServiceImpl::OnRequestPermissionsResponse, |
| weak_factory_.GetWeakPtr(), |
| request_id)); |
| @@ -136,30 +182,14 @@ void PermissionServiceImpl::RequestPermission( |
| pending_request->manager_id = manager_id; |
| } |
| -void PermissionServiceImpl::RequestPermissions( |
| - mojo::Array<PermissionName> permissions, |
| - const mojo::String& origin, |
| - bool user_gesture, |
| - const PermissionsStatusCallback& callback) { |
| - NOTIMPLEMENTED(); |
| - |
| - // TODO(lalitm,mlamouri): this is returning the current permission statuses |
| - // in order for the call to successfully return. It will be changed later. |
| - // See https://crbug.com/516626 |
| - mojo::Array<PermissionStatus> result(permissions.size()); |
| - for (size_t i = 0; i < permissions.size(); ++i) |
| - result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin)); |
| - callback.Run(result.Pass()); |
| -} |
| - |
| -void PermissionServiceImpl::OnRequestPermissionResponse( |
| +void PermissionServiceImpl::OnRequestPermissionsResponse( |
| int request_id, |
| - PermissionStatus status) { |
| + const std::vector<PermissionStatus>& result) { |
| PendingRequest* request = pending_requests_.Lookup(request_id); |
| - PermissionStatusCallback callback(request->callback); |
| + PermissionsStatusCallback callback(request->callback); |
| request->callback.reset(); |
| pending_requests_.Remove(request_id); |
| - callback.Run(status); |
| + callback.Run(mojo::Array<PermissionStatus>::From(result)); |
| } |
| void PermissionServiceImpl::CancelPendingOperations() { |