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() { |