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

Unified Diff: content/browser/permissions/permission_service_impl.cc

Issue 1316863010: browser: implement multiple permission requesting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@request-multiple-content
Patch Set: Cut down on CL size 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/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() {

Powered by Google App Engine
This is Rietveld 408576698