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

Side by Side Diff: content/child/permissions/permission_dispatcher.cc

Issue 1260193009: renderer: implement multiple permission requesting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permissions-request-multiple
Patch Set: Rebase on top of other change Created 5 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/child/permissions/permission_dispatcher.h" 5 #include "content/child/permissions/permission_dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "content/child/worker_task_runner.h" 8 #include "content/child/worker_task_runner.h"
9 #include "content/public/common/service_registry.h" 9 #include "content/public/common/service_registry.h"
10 #include "third_party/WebKit/public/platform/WebURL.h" 10 #include "third_party/WebKit/public/platform/WebURL.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 } 95 }
96 96
97 void PermissionDispatcher::requestPermission( 97 void PermissionDispatcher::requestPermission(
98 blink::WebPermissionType type, 98 blink::WebPermissionType type,
99 const blink::WebURL& origin, 99 const blink::WebURL& origin,
100 blink::WebPermissionCallback* callback) { 100 blink::WebPermissionCallback* callback) {
101 RequestPermissionInternal( 101 RequestPermissionInternal(
102 type, origin.string().utf8(), callback, kNoWorkerThread); 102 type, origin.string().utf8(), callback, kNoWorkerThread);
103 } 103 }
104 104
105 void PermissionDispatcher::requestPermissions(
106 const blink::WebVector<blink::WebPermissionType>& types,
107 const blink::WebURL& origin,
108 blink::WebPermissionsCallback* callback) {
109 RequestPermissionsInternal(
110 types, origin.string().utf8(), callback, kNoWorkerThread);
111 }
112
105 void PermissionDispatcher::revokePermission( 113 void PermissionDispatcher::revokePermission(
106 blink::WebPermissionType type, 114 blink::WebPermissionType type,
107 const blink::WebURL& origin, 115 const blink::WebURL& origin,
108 blink::WebPermissionCallback* callback) { 116 blink::WebPermissionCallback* callback) {
109 RevokePermissionInternal( 117 RevokePermissionInternal(
110 type, origin.string().utf8(), callback, kNoWorkerThread); 118 type, origin.string().utf8(), callback, kNoWorkerThread);
111 } 119 }
112 120
113 void PermissionDispatcher::startListening( 121 void PermissionDispatcher::startListening(
114 blink::WebPermissionType type, 122 blink::WebPermissionType type,
(...skipping 29 matching lines...) Expand all
144 } 152 }
145 153
146 void PermissionDispatcher::RequestPermissionForWorker( 154 void PermissionDispatcher::RequestPermissionForWorker(
147 blink::WebPermissionType type, 155 blink::WebPermissionType type,
148 const std::string& origin, 156 const std::string& origin,
149 blink::WebPermissionCallback* callback, 157 blink::WebPermissionCallback* callback,
150 int worker_thread_id) { 158 int worker_thread_id) {
151 RequestPermissionInternal(type, origin, callback, worker_thread_id); 159 RequestPermissionInternal(type, origin, callback, worker_thread_id);
152 } 160 }
153 161
162 void PermissionDispatcher::RequestPermissionsForWorker(
163 const blink::WebVector<blink::WebPermissionType>& types,
164 const std::string& origin,
165 blink::WebPermissionsCallback* callback,
166 int worker_thread_id) {
167 RequestPermissionsInternal(types, origin, callback, worker_thread_id);
168 }
169
154 void PermissionDispatcher::RevokePermissionForWorker( 170 void PermissionDispatcher::RevokePermissionForWorker(
155 blink::WebPermissionType type, 171 blink::WebPermissionType type,
156 const std::string& origin, 172 const std::string& origin,
157 blink::WebPermissionCallback* callback, 173 blink::WebPermissionCallback* callback,
158 int worker_thread_id) { 174 int worker_thread_id) {
159 RevokePermissionInternal(type, origin, callback, worker_thread_id); 175 RevokePermissionInternal(type, origin, callback, worker_thread_id);
160 } 176 }
161 177
162 void PermissionDispatcher::StartListeningForWorker( 178 void PermissionDispatcher::StartListeningForWorker(
163 blink::WebPermissionType type, 179 blink::WebPermissionType type,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 } 211 }
196 212
197 // static 213 // static
198 void PermissionDispatcher::RunCallbackOnWorkerThread( 214 void PermissionDispatcher::RunCallbackOnWorkerThread(
199 blink::WebPermissionCallback* callback, 215 blink::WebPermissionCallback* callback,
200 scoped_ptr<blink::WebPermissionStatus> status) { 216 scoped_ptr<blink::WebPermissionStatus> status) {
201 callback->onSuccess(status.release()); 217 callback->onSuccess(status.release());
202 delete callback; 218 delete callback;
203 } 219 }
204 220
221 void PermissionDispatcher::RunMultiCallbackOnWorkerThread(
222 blink::WebPermissionsCallback* callback,
223 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) {
224 callback->onSuccess(blink::adoptWebPtr(statuses.release()));
225 delete callback;
226 }
227
205 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { 228 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() {
206 if (!permission_service_.get()) { 229 if (!permission_service_.get()) {
207 service_registry_->ConnectToRemoteService( 230 service_registry_->ConnectToRemoteService(
208 mojo::GetProxy(&permission_service_)); 231 mojo::GetProxy(&permission_service_));
209 } 232 }
210 return permission_service_; 233 return permission_service_;
211 } 234 }
212 235
213 void PermissionDispatcher::QueryPermissionInternal( 236 void PermissionDispatcher::QueryPermissionInternal(
214 blink::WebPermissionType type, 237 blink::WebPermissionType type,
215 const std::string& origin, 238 const std::string& origin,
216 blink::WebPermissionCallback* callback, 239 blink::WebPermissionCallback* callback,
217 int worker_thread_id) { 240 int worker_thread_id) {
218 // We need to save the |callback| in an ScopedVector so if |this| gets 241 // We need to save the |callback| in an ScopedVector so if |this| gets
219 // deleted, the callback will not leak. In the case of |this| gets deleted, 242 // deleted, the callback will not leak. In the case of |this| gets deleted,
220 // the |permission_service_| pipe will be destroyed too so OnQueryPermission 243 // the |permission_service_| pipe will be destroyed too so OnQueryPermission
221 // will not be called. 244 // will not be called.
222 PendingCallbackVector::iterator iterator = 245 PendingCallbackVector::iterator iterator =
223 pending_callbacks_.insert(pending_callbacks_.end(), callback); 246 pending_callbacks_.insert(pending_callbacks_.end(), callback);
224
mlamouri (slow - plz ping) 2015/08/21 10:24:41 nit: revert that change
Lalit Maganti 2015/08/25 16:58:27 Done.
225 GetPermissionServicePtr()->HasPermission( 247 GetPermissionServicePtr()->HasPermission(
226 GetPermissionName(type), 248 GetPermissionName(type),
227 origin, 249 origin,
228 base::Bind(&PermissionDispatcher::OnPermissionResponse, 250 base::Bind(&PermissionDispatcher::OnPermissionResponse,
229 base::Unretained(this), 251 base::Unretained(this),
230 worker_thread_id, 252 worker_thread_id,
231 iterator)); 253 iterator));
232 } 254 }
233 255
234 void PermissionDispatcher::RequestPermissionInternal( 256 void PermissionDispatcher::RequestPermissionInternal(
235 blink::WebPermissionType type, 257 blink::WebPermissionType type,
236 const std::string& origin, 258 const std::string& origin,
237 blink::WebPermissionCallback* callback, 259 blink::WebPermissionCallback* callback,
238 int worker_thread_id) { 260 int worker_thread_id) {
239 // We need to save the |callback| in an ScopedVector so if |this| gets 261 // We need to save the |callback| in an ScopedVector so if |this| gets
240 // deleted, the callback will not leak. In the case of |this| gets deleted, 262 // deleted, the callback will not leak. In the case of |this| gets deleted,
241 // the |permission_service_| pipe will be destroyed too so OnQueryPermission 263 // the |permission_service_| pipe will be destroyed too so OnQueryPermission
242 // will not be called. 264 // will not be called.
243 PendingCallbackVector::iterator iterator = 265 PendingCallbackVector::iterator iterator =
244 pending_callbacks_.insert(pending_callbacks_.end(), callback); 266 pending_callbacks_.insert(pending_callbacks_.end(), callback);
245
mlamouri (slow - plz ping) 2015/08/21 10:24:41 ditto
Lalit Maganti 2015/08/25 16:58:27 Done.
246 GetPermissionServicePtr()->RequestPermission( 267 GetPermissionServicePtr()->RequestPermission(
247 GetPermissionName(type), 268 GetPermissionName(type),
248 origin, 269 origin,
249 blink::WebUserGestureIndicator::isProcessingUserGesture(), 270 blink::WebUserGestureIndicator::isProcessingUserGesture(),
250 base::Bind(&PermissionDispatcher::OnPermissionResponse, 271 base::Bind(&PermissionDispatcher::OnPermissionResponse,
251 base::Unretained(this), 272 base::Unretained(this),
252 worker_thread_id, 273 worker_thread_id,
253 iterator)); 274 iterator));
254 } 275 }
255 276
277 void PermissionDispatcher::RequestPermissionsInternal(
278 const blink::WebVector<blink::WebPermissionType>& types,
279 const std::string& origin,
280 blink::WebPermissionsCallback* callback,
281 int worker_thread_id) {
282 // We need to save the |callback| in an ScopedVector so if |this| gets
283 // deleted, the callback will not leak. In the case of |this| gets deleted,
284 // the |permission_service_| pipe will be destroyed too so OnQueryPermission
285 // will not be called.
286 PendingBatchCallbackVector::iterator iterator =
287 batch_pending_callbacks_.insert(batch_pending_callbacks_.end(), callback);
mlamouri (slow - plz ping) 2015/08/21 10:24:41 I guess this needs to be rebased.
Lalit Maganti 2015/08/25 16:58:27 Done.
288
289 mojo::Array<PermissionName> names(types.size());
290 for (size_t i = 0; i < types.size(); ++i)
291 names[i] = GetPermissionName(types[i]);
292
293 GetPermissionServicePtr()->RequestBatchPermission(
294 names.Pass(),
295 origin,
296 blink::WebUserGestureIndicator::isProcessingUserGesture(),
297 base::Bind(&PermissionDispatcher::OnPermissionsResponse,
298 base::Unretained(this),
299 worker_thread_id,
300 iterator));
301 }
302
256 void PermissionDispatcher::RevokePermissionInternal( 303 void PermissionDispatcher::RevokePermissionInternal(
257 blink::WebPermissionType type, 304 blink::WebPermissionType type,
258 const std::string& origin, 305 const std::string& origin,
259 blink::WebPermissionCallback* callback, 306 blink::WebPermissionCallback* callback,
260 int worker_thread_id) { 307 int worker_thread_id) {
261 // We need to save the |callback| in an ScopedVector so if |this| gets 308 // We need to save the |callback| in an ScopedVector so if |this| gets
262 // deleted, the callback will not leak. In the case of |this| gets deleted, 309 // deleted, the callback will not leak. In the case of |this| gets deleted,
263 // the |permission_service_| pipe will be destroyed too so OnQueryPermission 310 // the |permission_service_| pipe will be destroyed too so OnQueryPermission
264 // will not be called. 311 // will not be called.
265 PendingCallbackVector::iterator iterator = 312 PendingCallbackVector::iterator iterator =
266 pending_callbacks_.insert(pending_callbacks_.end(), callback); 313 pending_callbacks_.insert(pending_callbacks_.end(), callback);
267
268 GetPermissionServicePtr()->RevokePermission( 314 GetPermissionServicePtr()->RevokePermission(
269 GetPermissionName(type), 315 GetPermissionName(type),
270 origin, 316 origin,
271 base::Bind(&PermissionDispatcher::OnPermissionResponse, 317 base::Bind(&PermissionDispatcher::OnPermissionResponse,
272 base::Unretained(this), 318 base::Unretained(this),
273 worker_thread_id, 319 worker_thread_id,
274 iterator)); 320 iterator));
275 } 321 }
276 322
277 void PermissionDispatcher::OnPermissionResponse( 323 void PermissionDispatcher::OnPermissionResponse(
(...skipping 14 matching lines...) Expand all
292 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread, 338 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread,
293 base::Unretained(callback), 339 base::Unretained(callback),
294 base::Passed(&status))); 340 base::Passed(&status)));
295 return; 341 return;
296 } 342 }
297 343
298 callback->onSuccess(status.release()); 344 callback->onSuccess(status.release());
299 pending_callbacks_.erase(callback_iterator); 345 pending_callbacks_.erase(callback_iterator);
300 } 346 }
301 347
348 void PermissionDispatcher::OnPermissionsResponse(
349 int worker_thread_id,
350 PendingBatchCallbackVector::iterator callback_iterator,
351 const mojo::Array<PermissionStatus>& result) {
352 blink::WebPermissionsCallback* callback = *callback_iterator;
353 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses(
354 new blink::WebVector<blink::WebPermissionStatus>(result.size()));
355
356 for (size_t i = 0; i < result.size(); i++)
357 statuses->operator[](i) = GetWebPermissionStatus(result[i]);
358
359 if (worker_thread_id != kNoWorkerThread) {
360 batch_pending_callbacks_.weak_erase(callback_iterator);
361
362 // If the worker is no longer running, ::PostTask() will return false and
363 // gracefully fail, destroying the callback too.
364 WorkerTaskRunner::Instance()->PostTask(
365 worker_thread_id,
366 base::Bind(&PermissionDispatcher::RunMultiCallbackOnWorkerThread,
367 base::Unretained(callback),
368 base::Passed(&statuses)));
369 return;
370 }
371
372 callback->onSuccess(blink::adoptWebPtr(statuses.release()));
373 batch_pending_callbacks_.erase(callback_iterator);
374 }
375
302 void PermissionDispatcher::OnPermissionChanged( 376 void PermissionDispatcher::OnPermissionChanged(
303 blink::WebPermissionType type, 377 blink::WebPermissionType type,
304 const std::string& origin, 378 const std::string& origin,
305 WebPermissionObserver* observer, 379 WebPermissionObserver* observer,
306 PermissionStatus status) { 380 PermissionStatus status) {
307 if (!IsObserverRegistered(observer)) 381 if (!IsObserverRegistered(observer))
308 return; 382 return;
309 383
310 observer->permissionChanged(type, GetWebPermissionStatus(status)); 384 observer->permissionChanged(type, GetWebPermissionStatus(status));
311 385
(...skipping 20 matching lines...) Expand all
332 origin, 406 origin,
333 current_status, 407 current_status,
334 base::Bind(&PermissionDispatcher::OnPermissionChanged, 408 base::Bind(&PermissionDispatcher::OnPermissionChanged,
335 base::Unretained(this), 409 base::Unretained(this),
336 type, 410 type,
337 origin, 411 origin,
338 base::Unretained(observer))); 412 base::Unretained(observer)));
339 } 413 }
340 414
341 } // namespace content 415 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698