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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/permissions/permission_service_impl.h" 5 #include "content/browser/permissions/permission_service_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "content/public/browser/browser_context.h" 8 #include "content/public/browser/browser_context.h"
9 #include "content/public/browser/permission_manager.h" 9 #include "content/public/browser/permission_manager.h"
10 #include "content/public/browser/permission_type.h" 10 #include "content/public/browser/permission_type.h"
(...skipping 21 matching lines...) Expand all
32 case PERMISSION_NAME_AUDIO_CAPTURE: 32 case PERMISSION_NAME_AUDIO_CAPTURE:
33 return PermissionType::AUDIO_CAPTURE; 33 return PermissionType::AUDIO_CAPTURE;
34 case PERMISSION_NAME_VIDEO_CAPTURE: 34 case PERMISSION_NAME_VIDEO_CAPTURE:
35 return PermissionType::VIDEO_CAPTURE; 35 return PermissionType::VIDEO_CAPTURE;
36 } 36 }
37 37
38 NOTREACHED(); 38 NOTREACHED();
39 return PermissionType::NUM; 39 return PermissionType::NUM;
40 } 40 }
41 41
42 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.
43 const mojo::Callback<void(PermissionStatus)>& callback,
44 const mojo::Array<PermissionStatus>& vector) {
45 DCHECK(vector.size() == 1);
46 callback.Run(vector[0]);
47 }
48
42 } // anonymous namespace 49 } // anonymous namespace
43 50
44 PermissionServiceImpl::PendingRequest::PendingRequest( 51 PermissionServiceImpl::PendingRequest::PendingRequest(
45 PermissionType permission, 52 const PermissionsStatusCallback& callback,
46 const GURL& origin, 53 int request_count)
47 const PermissionStatusCallback& callback) 54 : callback(callback),
48 : permission(permission), 55 request_count(request_count) {
49 origin(origin),
50 callback(callback) {
51 } 56 }
52 57
53 PermissionServiceImpl::PendingRequest::~PendingRequest() { 58 PermissionServiceImpl::PendingRequest::~PendingRequest() {
54 if (!callback.is_null()) 59 if (!callback.is_null()) {
55 callback.Run(PERMISSION_STATUS_ASK); 60 mojo::Array<PermissionStatus> result =
61 mojo::Array<PermissionStatus>::New(request_count);
62 for (int i = 0; i < request_count; ++i)
63 result[i] = PERMISSION_STATUS_DENIED;
64 callback.Run(result.Pass());
65 }
56 } 66 }
57 67
58 PermissionServiceImpl::PendingSubscription::PendingSubscription( 68 PermissionServiceImpl::PendingSubscription::PendingSubscription(
59 PermissionType permission, 69 PermissionType permission,
60 const GURL& origin, 70 const GURL& origin,
61 const PermissionStatusCallback& callback) 71 const PermissionStatusCallback& callback)
62 : id(-1), 72 : id(-1),
63 permission(permission), 73 permission(permission),
64 origin(origin), 74 origin(origin),
65 callback(callback) { 75 callback(callback) {
(...skipping 22 matching lines...) Expand all
88 void PermissionServiceImpl::OnConnectionError() { 98 void PermissionServiceImpl::OnConnectionError() {
89 context_->ServiceHadConnectionError(this); 99 context_->ServiceHadConnectionError(this);
90 // After that call, |this| will be deleted. 100 // After that call, |this| will be deleted.
91 } 101 }
92 102
93 void PermissionServiceImpl::RequestPermission( 103 void PermissionServiceImpl::RequestPermission(
94 PermissionName permission, 104 PermissionName permission,
95 const mojo::String& origin, 105 const mojo::String& origin,
96 bool user_gesture, 106 bool user_gesture,
97 const PermissionStatusCallback& callback) { 107 const PermissionStatusCallback& callback) {
108 mojo::Array<PermissionName> permissions(1);
109 permissions[0] = permission;
110 RequestPermissionsInternal(
111 permissions.Pass(),
112 origin,
113 user_gesture,
114 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.
115 callback));
116 }
117
118 void PermissionServiceImpl::RequestPermissions(
119 mojo::Array<PermissionName> permissions,
120 const mojo::String& origin,
121 bool user_gesture,
122 const PermissionsStatusCallback& callback) {
123 RequestPermissionsInternal(
124 permissions.Pass(), origin, user_gesture, callback);
125 }
126
127 void PermissionServiceImpl::RequestPermissionsInternal(
128 mojo::Array<PermissionName> permissions,
129 const mojo::String& origin,
130 bool user_gesture,
131 const PermissionsStatusCallback& callback) {
132 if (permissions.is_null()) {
133 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?
134 return;
135 }
136
98 // This condition is valid if the call is coming from a ChildThread instead of 137 // This condition is valid if the call is coming from a ChildThread instead of
99 // a RenderFrame. Some consumers of the service run in Workers and some in 138 // a RenderFrame. Some consumers of the service run in Workers and some in
100 // Frames. In the context of a Worker, it is not possible to show a 139 // Frames. In the context of a Worker, it is not possible to show a
101 // permission prompt because there is no tab. In the context of a Frame, we 140 // permission prompt because there is no tab. In the context of a Frame, we
102 // can. Even if the call comes from a context where it is not possible to show 141 // can. Even if the call comes from a context where it is not possible to show
103 // any UI, we want to still return something relevant so the current 142 // any UI, we want to still return something relevant so the current
104 // permission status is returned. 143 // permission status is returned for each permission.
105 if (!context_->render_frame_host()) { 144 if (!context_->render_frame_host()) {
106 // There is no way to show a UI so the call will simply return the current 145 mojo::Array<PermissionStatus> result(permissions.size());
107 // permission. 146 for (size_t i = 0; i < permissions.size(); ++i)
108 HasPermission(permission, origin, callback); 147 result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin));
148 callback.Run(result.Pass());
109 return; 149 return;
110 } 150 }
111 151
112 BrowserContext* browser_context = context_->GetBrowserContext(); 152 BrowserContext* browser_context = context_->GetBrowserContext();
113 DCHECK(browser_context); 153 DCHECK(browser_context);
114 if (!browser_context->GetPermissionManager()) { 154 if (!browser_context->GetPermissionManager()) {
115 callback.Run(content::PERMISSION_STATUS_DENIED); 155 mojo::Array<PermissionStatus> result(permissions.size());
156 for (size_t i = 0; i < permissions.size(); ++i)
157 result[i] = PERMISSION_STATUS_DENIED;
158 callback.Run(result.Pass());
116 return; 159 return;
117 } 160 }
118 161
119 PermissionType permission_type = PermissionNameToPermissionType(permission); 162 std::vector<PermissionType> types(permissions.size());
163 for (size_t i = 0; i < types.size(); ++i)
164 types[i] = PermissionNameToPermissionType(permissions[i]);
165
120 int request_id = pending_requests_.Add( 166 int request_id = pending_requests_.Add(
121 new PendingRequest(permission_type, GURL(origin), callback)); 167 new PendingRequest(callback, permissions.size()));
122 int manager_id = browser_context->GetPermissionManager()->RequestPermission( 168 int manager_id = browser_context->GetPermissionManager()->RequestPermissions(
123 permission_type, 169 types,
124 context_->render_frame_host(), 170 context_->render_frame_host(),
125 GURL(origin), 171 GURL(origin),
126 user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770) 172 user_gesture, // TODO(mlamouri): should be removed (crbug.com/423770)
127 base::Bind(&PermissionServiceImpl::OnRequestPermissionResponse, 173 base::Bind(&PermissionServiceImpl::OnRequestPermissionsResponse,
128 weak_factory_.GetWeakPtr(), 174 weak_factory_.GetWeakPtr(),
129 request_id)); 175 request_id));
130 176
131 // Check if the request still exists. It may have been removed by the 177 // Check if the request still exists. It may have been removed by the
132 // the response callback. 178 // the response callback.
133 PendingRequest* pending_request = pending_requests_.Lookup(request_id); 179 PendingRequest* pending_request = pending_requests_.Lookup(request_id);
134 if (!pending_request) 180 if (!pending_request)
135 return; 181 return;
136 pending_request->manager_id = manager_id; 182 pending_request->manager_id = manager_id;
137 } 183 }
138 184
139 void PermissionServiceImpl::RequestPermissions( 185 void PermissionServiceImpl::OnRequestPermissionsResponse(
140 mojo::Array<PermissionName> permissions,
141 const mojo::String& origin,
142 bool user_gesture,
143 const PermissionsStatusCallback& callback) {
144 NOTIMPLEMENTED();
145
146 // TODO(lalitm,mlamouri): this is returning the current permission statuses
147 // in order for the call to successfully return. It will be changed later.
148 // See https://crbug.com/516626
149 mojo::Array<PermissionStatus> result(permissions.size());
150 for (size_t i = 0; i < permissions.size(); ++i)
151 result[i] = GetPermissionStatusFromName(permissions[i], GURL(origin));
152 callback.Run(result.Pass());
153 }
154
155 void PermissionServiceImpl::OnRequestPermissionResponse(
156 int request_id, 186 int request_id,
157 PermissionStatus status) { 187 const std::vector<PermissionStatus>& result) {
158 PendingRequest* request = pending_requests_.Lookup(request_id); 188 PendingRequest* request = pending_requests_.Lookup(request_id);
159 PermissionStatusCallback callback(request->callback); 189 PermissionsStatusCallback callback(request->callback);
160 request->callback.reset(); 190 request->callback.reset();
161 pending_requests_.Remove(request_id); 191 pending_requests_.Remove(request_id);
162 callback.Run(status); 192 callback.Run(mojo::Array<PermissionStatus>::From(result));
163 } 193 }
164 194
165 void PermissionServiceImpl::CancelPendingOperations() { 195 void PermissionServiceImpl::CancelPendingOperations() {
166 DCHECK(context_->render_frame_host()); 196 DCHECK(context_->render_frame_host());
167 DCHECK(context_->GetBrowserContext()); 197 DCHECK(context_->GetBrowserContext());
168 198
169 PermissionManager* permission_manager = 199 PermissionManager* permission_manager =
170 context_->GetBrowserContext()->GetPermissionManager(); 200 context_->GetBrowserContext()->GetPermissionManager();
171 if (!permission_manager) 201 if (!permission_manager)
172 return; 202 return;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 338
309 PermissionStatusCallback callback = subscription->callback; 339 PermissionStatusCallback callback = subscription->callback;
310 340
311 subscription->callback.reset(); 341 subscription->callback.reset();
312 pending_subscriptions_.Remove(pending_subscription_id); 342 pending_subscriptions_.Remove(pending_subscription_id);
313 343
314 callback.Run(status); 344 callback.Run(status);
315 } 345 }
316 346
317 } // namespace content 347 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698