OLD | NEW |
---|---|
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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
92 } | 92 } |
93 | 93 |
94 blink::WebPermissionCallback* | 94 blink::WebPermissionCallback* |
95 PermissionDispatcher::CallbackInformation::ReleaseCallback() { | 95 PermissionDispatcher::CallbackInformation::ReleaseCallback() { |
96 return callback_.release(); | 96 return callback_.release(); |
97 } | 97 } |
98 | 98 |
99 PermissionDispatcher::CallbackInformation::~CallbackInformation() { | 99 PermissionDispatcher::CallbackInformation::~CallbackInformation() { |
100 } | 100 } |
101 | 101 |
102 PermissionDispatcher::MultipleCallbackInformation::MultipleCallbackInformation( | |
Lalit Maganti (personal)
2015/08/03 23:10:26
Consider merging this with the Callback informatio
| |
103 blink::WebPermissionsCallback* callback, | |
104 int worker_thread_id) | |
105 : callback_(callback), | |
106 worker_thread_id_(worker_thread_id) { | |
107 } | |
108 | |
109 blink::WebPermissionsCallback* | |
110 PermissionDispatcher::MultipleCallbackInformation::callback() const { | |
111 return callback_.get(); | |
112 } | |
113 | |
114 int | |
115 PermissionDispatcher::MultipleCallbackInformation::worker_thread_id() const { | |
116 return worker_thread_id_; | |
117 } | |
118 | |
119 blink::WebPermissionsCallback* | |
120 PermissionDispatcher::MultipleCallbackInformation::ReleaseCallback() { | |
121 return callback_.release(); | |
122 } | |
123 | |
124 PermissionDispatcher:: | |
125 MultipleCallbackInformation::~MultipleCallbackInformation() { | |
126 } | |
127 | |
102 PermissionDispatcher::PermissionDispatcher(ServiceRegistry* service_registry) | 128 PermissionDispatcher::PermissionDispatcher(ServiceRegistry* service_registry) |
103 : service_registry_(service_registry) { | 129 : service_registry_(service_registry) { |
104 } | 130 } |
105 | 131 |
106 PermissionDispatcher::~PermissionDispatcher() { | 132 PermissionDispatcher::~PermissionDispatcher() { |
107 } | 133 } |
108 | 134 |
109 void PermissionDispatcher::queryPermission( | 135 void PermissionDispatcher::queryPermission( |
110 blink::WebPermissionType type, | 136 blink::WebPermissionType type, |
111 const blink::WebURL& origin, | 137 const blink::WebURL& origin, |
112 blink::WebPermissionCallback* callback) { | 138 blink::WebPermissionCallback* callback) { |
113 QueryPermissionInternal( | 139 QueryPermissionInternal( |
114 type, origin.string().utf8(), callback, kNoWorkerThread); | 140 type, origin.string().utf8(), callback, kNoWorkerThread); |
115 } | 141 } |
116 | 142 |
117 void PermissionDispatcher::requestPermission( | 143 void PermissionDispatcher::requestPermission( |
118 blink::WebPermissionType type, | 144 blink::WebPermissionType type, |
119 const blink::WebURL& origin, | 145 const blink::WebURL& origin, |
120 blink::WebPermissionCallback* callback) { | 146 blink::WebPermissionCallback* callback) { |
121 RequestPermissionInternal( | 147 RequestPermissionInternal( |
122 type, origin.string().utf8(), callback, kNoWorkerThread); | 148 type, origin.string().utf8(), callback, kNoWorkerThread); |
123 } | 149 } |
124 | 150 |
151 void PermissionDispatcher::requestPermissions( | |
152 const blink::WebVector<blink::WebPermissionType>& types, | |
153 const blink::WebURL& origin, | |
154 blink::WebPermissionsCallback* callback) { | |
155 RequestPermissionsInternal( | |
156 types, origin.string().utf8(), callback, kNoWorkerThread); | |
157 } | |
158 | |
125 void PermissionDispatcher::revokePermission( | 159 void PermissionDispatcher::revokePermission( |
126 blink::WebPermissionType type, | 160 blink::WebPermissionType type, |
127 const blink::WebURL& origin, | 161 const blink::WebURL& origin, |
128 blink::WebPermissionCallback* callback) { | 162 blink::WebPermissionCallback* callback) { |
129 RevokePermissionInternal( | 163 RevokePermissionInternal( |
130 type, origin.string().utf8(), callback, kNoWorkerThread); | 164 type, origin.string().utf8(), callback, kNoWorkerThread); |
131 } | 165 } |
132 | 166 |
133 void PermissionDispatcher::startListening( | 167 void PermissionDispatcher::startListening( |
134 blink::WebPermissionType type, | 168 blink::WebPermissionType type, |
(...skipping 29 matching lines...) Expand all Loading... | |
164 } | 198 } |
165 | 199 |
166 void PermissionDispatcher::RequestPermissionForWorker( | 200 void PermissionDispatcher::RequestPermissionForWorker( |
167 blink::WebPermissionType type, | 201 blink::WebPermissionType type, |
168 const std::string& origin, | 202 const std::string& origin, |
169 blink::WebPermissionCallback* callback, | 203 blink::WebPermissionCallback* callback, |
170 int worker_thread_id) { | 204 int worker_thread_id) { |
171 RequestPermissionInternal(type, origin, callback, worker_thread_id); | 205 RequestPermissionInternal(type, origin, callback, worker_thread_id); |
172 } | 206 } |
173 | 207 |
208 void PermissionDispatcher::RequestPermissionsForWorker( | |
209 const blink::WebVector<blink::WebPermissionType>& types, | |
210 const std::string& origin, | |
211 blink::WebPermissionsCallback* callback, | |
212 int worker_thread_id) { | |
213 RequestPermissionsInternal(types, origin, callback, worker_thread_id); | |
214 } | |
215 | |
174 void PermissionDispatcher::RevokePermissionForWorker( | 216 void PermissionDispatcher::RevokePermissionForWorker( |
175 blink::WebPermissionType type, | 217 blink::WebPermissionType type, |
176 const std::string& origin, | 218 const std::string& origin, |
177 blink::WebPermissionCallback* callback, | 219 blink::WebPermissionCallback* callback, |
178 int worker_thread_id) { | 220 int worker_thread_id) { |
179 RevokePermissionInternal(type, origin, callback, worker_thread_id); | 221 RevokePermissionInternal(type, origin, callback, worker_thread_id); |
180 } | 222 } |
181 | 223 |
182 void PermissionDispatcher::StartListeningForWorker( | 224 void PermissionDispatcher::StartListeningForWorker( |
183 blink::WebPermissionType type, | 225 blink::WebPermissionType type, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
215 } | 257 } |
216 | 258 |
217 // static | 259 // static |
218 void PermissionDispatcher::RunCallbackOnWorkerThread( | 260 void PermissionDispatcher::RunCallbackOnWorkerThread( |
219 blink::WebPermissionCallback* callback, | 261 blink::WebPermissionCallback* callback, |
220 scoped_ptr<blink::WebPermissionStatus> status) { | 262 scoped_ptr<blink::WebPermissionStatus> status) { |
221 callback->onSuccess(status.release()); | 263 callback->onSuccess(status.release()); |
222 delete callback; | 264 delete callback; |
223 } | 265 } |
224 | 266 |
267 void PermissionDispatcher::RunMultiCallbackOnWorkerThread( | |
Lalit Maganti (personal)
2015/08/03 23:10:26
Template method?
| |
268 blink::WebPermissionsCallback* callback, | |
269 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) { | |
270 callback->onSuccess(statuses.release()); | |
271 delete callback; | |
272 } | |
273 | |
225 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { | 274 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { |
226 if (!permission_service_.get()) { | 275 if (!permission_service_.get()) { |
227 service_registry_->ConnectToRemoteService( | 276 service_registry_->ConnectToRemoteService( |
228 mojo::GetProxy(&permission_service_)); | 277 mojo::GetProxy(&permission_service_)); |
229 } | 278 } |
230 return permission_service_; | 279 return permission_service_; |
231 } | 280 } |
232 | 281 |
233 void PermissionDispatcher::QueryPermissionInternal( | 282 void PermissionDispatcher::QueryPermissionInternal( |
234 blink::WebPermissionType type, | 283 blink::WebPermissionType type, |
(...skipping 27 matching lines...) Expand all Loading... | |
262 new CallbackInformation(callback, worker_thread_id)); | 311 new CallbackInformation(callback, worker_thread_id)); |
263 GetPermissionServicePtr()->RequestPermission( | 312 GetPermissionServicePtr()->RequestPermission( |
264 GetPermissionName(type), | 313 GetPermissionName(type), |
265 origin, | 314 origin, |
266 blink::WebUserGestureIndicator::isProcessingUserGesture(), | 315 blink::WebUserGestureIndicator::isProcessingUserGesture(), |
267 base::Bind(&PermissionDispatcher::OnPermissionResponse, | 316 base::Bind(&PermissionDispatcher::OnPermissionResponse, |
268 base::Unretained(this), | 317 base::Unretained(this), |
269 request_id)); | 318 request_id)); |
270 } | 319 } |
271 | 320 |
321 void PermissionDispatcher::RequestPermissionsInternal( | |
322 const blink::WebVector<blink::WebPermissionType>& types, | |
323 const std::string& origin, | |
324 blink::WebPermissionsCallback* callback, | |
325 int worker_thread_id) { | |
326 // We need to save the |callback| in an IDMap so if |this| gets deleted, the | |
327 // callback will not leak. In the case of |this| gets deleted, the | |
328 // |permission_service_| pipe will be destroyed too so OnQueryPermission will | |
329 // not be called. | |
330 int request_id = multiple_pending_callbacks_.Add( | |
331 new MultipleCallbackInformation(callback, worker_thread_id)); | |
332 | |
333 mojo::Array<PermissionName> names(types.size()); | |
334 for (size_t i = 0; i < types.size(); ++i) { | |
335 names[i] = GetPermissionName(types[i]); | |
336 } | |
337 | |
338 GetPermissionServicePtr()->RequestPermissions( | |
339 names.Pass(), | |
340 origin, | |
341 blink::WebUserGestureIndicator::isProcessingUserGesture(), | |
342 base::Bind(&PermissionDispatcher::OnPermissionsResponse, | |
343 base::Unretained(this), | |
344 request_id)); | |
345 } | |
346 | |
272 void PermissionDispatcher::RevokePermissionInternal( | 347 void PermissionDispatcher::RevokePermissionInternal( |
273 blink::WebPermissionType type, | 348 blink::WebPermissionType type, |
274 const std::string& origin, | 349 const std::string& origin, |
275 blink::WebPermissionCallback* callback, | 350 blink::WebPermissionCallback* callback, |
276 int worker_thread_id) { | 351 int worker_thread_id) { |
277 // We need to save the |callback| in an IDMap so if |this| gets deleted, the | 352 // We need to save the |callback| in an IDMap so if |this| gets deleted, the |
278 // callback will not leak. In the case of |this| gets deleted, the | 353 // callback will not leak. In the case of |this| gets deleted, the |
279 // |permission_service_| pipe will be destroyed too so OnQueryPermission will | 354 // |permission_service_| pipe will be destroyed too so OnQueryPermission will |
280 // not be called. | 355 // not be called. |
281 int request_id = pending_callbacks_.Add( | 356 int request_id = pending_callbacks_.Add( |
(...skipping 27 matching lines...) Expand all Loading... | |
309 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread, | 384 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread, |
310 base::Unretained(callback), | 385 base::Unretained(callback), |
311 base::Passed(&status))); | 386 base::Passed(&status))); |
312 return; | 387 return; |
313 } | 388 } |
314 | 389 |
315 callback_information->callback()->onSuccess(status.release()); | 390 callback_information->callback()->onSuccess(status.release()); |
316 pending_callbacks_.Remove(request_id); | 391 pending_callbacks_.Remove(request_id); |
317 } | 392 } |
318 | 393 |
394 void PermissionDispatcher::OnPermissionsResponse( | |
395 int request_id, | |
396 const mojo::Array<PermissionStatus>& result) { | |
397 MultipleCallbackInformation* callback_information = | |
398 multiple_pending_callbacks_.Lookup(request_id); | |
399 DCHECK(callback_information && callback_information->callback()); | |
400 | |
401 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> status( | |
402 new blink::WebVector<blink::WebPermissionStatus>(result.size())); | |
403 for (size_t i = 0; i < result.size(); i++) { | |
404 (*status)[i] = GetWebPermissionStatus(result[i]); | |
405 } | |
406 | |
407 if (callback_information->worker_thread_id() != kNoWorkerThread) { | |
408 blink::WebPermissionsCallback* callback = | |
409 callback_information->ReleaseCallback(); | |
410 int worker_thread_id = callback_information->worker_thread_id(); | |
411 multiple_pending_callbacks_.Remove(request_id); | |
412 | |
413 // If the worker is no longer running, ::PostTask() will return false and | |
414 // gracefully fail, destroying the callback too. | |
415 WorkerTaskRunner::Instance()->PostTask( | |
416 worker_thread_id, | |
417 base::Bind(&PermissionDispatcher::RunMultiCallbackOnWorkerThread, | |
418 base::Unretained(callback), | |
419 base::Passed(&status))); | |
420 return; | |
421 } | |
422 | |
423 callback_information->callback()->onSuccess(status.release()); | |
424 multiple_pending_callbacks_.Remove(request_id); | |
425 } | |
426 | |
319 void PermissionDispatcher::OnPermissionChanged( | 427 void PermissionDispatcher::OnPermissionChanged( |
320 blink::WebPermissionType type, | 428 blink::WebPermissionType type, |
321 const std::string& origin, | 429 const std::string& origin, |
322 WebPermissionObserver* observer, | 430 WebPermissionObserver* observer, |
323 PermissionStatus status) { | 431 PermissionStatus status) { |
324 if (!IsObserverRegistered(observer)) | 432 if (!IsObserverRegistered(observer)) |
325 return; | 433 return; |
326 | 434 |
327 observer->permissionChanged(type, GetWebPermissionStatus(status)); | 435 observer->permissionChanged(type, GetWebPermissionStatus(status)); |
328 | 436 |
(...skipping 20 matching lines...) Expand all Loading... | |
349 origin, | 457 origin, |
350 current_status, | 458 current_status, |
351 base::Bind(&PermissionDispatcher::OnPermissionChanged, | 459 base::Bind(&PermissionDispatcher::OnPermissionChanged, |
352 base::Unretained(this), | 460 base::Unretained(this), |
353 type, | 461 type, |
354 origin, | 462 origin, |
355 base::Unretained(observer))); | 463 base::Unretained(observer))); |
356 } | 464 } |
357 | 465 |
358 } // namespace content | 466 } // namespace content |
OLD | NEW |