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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 24 matching lines...) Expand all Loading... |
188 GetPermissionName(type), | 204 GetPermissionName(type), |
189 origin, | 205 origin, |
190 GetPermissionStatus(status), | 206 GetPermissionStatus(status), |
191 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, | 207 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, |
192 base::Unretained(this), | 208 base::Unretained(this), |
193 worker_thread_id, | 209 worker_thread_id, |
194 callback)); | 210 callback)); |
195 } | 211 } |
196 | 212 |
197 // static | 213 // static |
198 void PermissionDispatcher::RunCallbackOnWorkerThread( | 214 void PermissionDispatcher::RunPermissionCallbackOnWorkerThread( |
199 scoped_ptr<blink::WebPermissionCallback> callback, | 215 scoped_ptr<blink::WebPermissionCallback> callback, |
200 blink::WebPermissionStatus status) { | 216 blink::WebPermissionStatus status) { |
201 callback->onSuccess(status); | 217 callback->onSuccess(status); |
202 } | 218 } |
203 | 219 |
| 220 void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread( |
| 221 scoped_ptr<blink::WebPermissionsCallback> callback, |
| 222 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) { |
| 223 callback->onSuccess(blink::adoptWebPtr(statuses.release())); |
| 224 } |
| 225 |
204 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { | 226 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { |
205 if (!permission_service_.get()) { | 227 if (!permission_service_.get()) { |
206 service_registry_->ConnectToRemoteService( | 228 service_registry_->ConnectToRemoteService( |
207 mojo::GetProxy(&permission_service_)); | 229 mojo::GetProxy(&permission_service_)); |
208 } | 230 } |
209 return permission_service_; | 231 return permission_service_; |
210 } | 232 } |
211 | 233 |
212 void PermissionDispatcher::QueryPermissionInternal( | 234 void PermissionDispatcher::QueryPermissionInternal( |
213 blink::WebPermissionType type, | 235 blink::WebPermissionType type, |
214 const std::string& origin, | 236 const std::string& origin, |
215 blink::WebPermissionCallback* callback, | 237 blink::WebPermissionCallback* callback, |
216 int worker_thread_id) { | 238 int worker_thread_id) { |
217 // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets | 239 // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets |
218 // deleted, the callback will not leak. In the case of |this| gets deleted, | 240 // deleted, the callback will not leak. In the case of |this| gets deleted, |
219 // the |permission_service_| pipe will be destroyed too so OnQueryPermission | 241 // the |permission_service_| pipe will be destroyed too so OnQueryPermission |
220 // will not be called. | 242 // will not be called. |
221 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); | 243 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); |
222 pending_callbacks_.add(callback_key, | 244 permission_callbacks_.add(callback_key, |
223 scoped_ptr<blink::WebPermissionCallback>(callback)); | 245 scoped_ptr<blink::WebPermissionCallback>(callback)); |
224 | 246 |
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 callback_key)); | 253 callback_key)); |
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 ScopedPtrHashMap so if |this| gets | 261 // We need to save the |callback| in an ScopedPtrHashMap 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 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); | 265 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); |
244 pending_callbacks_.add(callback_key, | 266 permission_callbacks_.add(callback_key, |
245 scoped_ptr<blink::WebPermissionCallback>(callback)); | 267 scoped_ptr<blink::WebPermissionCallback>(callback)); |
246 | 268 |
247 GetPermissionServicePtr()->RequestPermission( | 269 GetPermissionServicePtr()->RequestPermission( |
248 GetPermissionName(type), | 270 GetPermissionName(type), |
249 origin, | 271 origin, |
250 blink::WebUserGestureIndicator::isProcessingUserGesture(), | 272 blink::WebUserGestureIndicator::isProcessingUserGesture(), |
251 base::Bind(&PermissionDispatcher::OnPermissionResponse, | 273 base::Bind(&PermissionDispatcher::OnPermissionResponse, |
252 base::Unretained(this), | 274 base::Unretained(this), |
253 worker_thread_id, | 275 worker_thread_id, |
254 callback_key)); | 276 callback_key)); |
255 } | 277 } |
256 | 278 |
| 279 void PermissionDispatcher::RequestPermissionsInternal( |
| 280 const blink::WebVector<blink::WebPermissionType>& types, |
| 281 const std::string& origin, |
| 282 blink::WebPermissionsCallback* callback, |
| 283 int worker_thread_id) { |
| 284 // We need to save the |callback| in an ScopedVector so if |this| gets |
| 285 // deleted, the callback will not leak. In the case of |this| gets deleted, |
| 286 // the |permission_service_| pipe will be destroyed too so OnQueryPermission |
| 287 // will not be called. |
| 288 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); |
| 289 permissions_callbacks_.add(callback_key, |
| 290 scoped_ptr<blink::WebPermissionsCallback>(callback)); |
| 291 |
| 292 mojo::Array<PermissionName> names(types.size()); |
| 293 for (size_t i = 0; i < types.size(); ++i) |
| 294 names[i] = GetPermissionName(types[i]); |
| 295 |
| 296 GetPermissionServicePtr()->RequestPermissions( |
| 297 names.Pass(), |
| 298 origin, |
| 299 blink::WebUserGestureIndicator::isProcessingUserGesture(), |
| 300 base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse, |
| 301 base::Unretained(this), |
| 302 worker_thread_id, |
| 303 callback_key)); |
| 304 } |
| 305 |
257 void PermissionDispatcher::RevokePermissionInternal( | 306 void PermissionDispatcher::RevokePermissionInternal( |
258 blink::WebPermissionType type, | 307 blink::WebPermissionType type, |
259 const std::string& origin, | 308 const std::string& origin, |
260 blink::WebPermissionCallback* callback, | 309 blink::WebPermissionCallback* callback, |
261 int worker_thread_id) { | 310 int worker_thread_id) { |
262 // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets | 311 // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets |
263 // deleted, the callback will not leak. In the case of |this| gets deleted, | 312 // deleted, the callback will not leak. In the case of |this| gets deleted, |
264 // the |permission_service_| pipe will be destroyed too so OnQueryPermission | 313 // the |permission_service_| pipe will be destroyed too so OnQueryPermission |
265 // will not be called. | 314 // will not be called. |
266 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); | 315 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); |
267 pending_callbacks_.add(callback_key, | 316 permission_callbacks_.add(callback_key, |
268 scoped_ptr<blink::WebPermissionCallback>(callback)); | 317 scoped_ptr<blink::WebPermissionCallback>(callback)); |
269 | 318 |
270 GetPermissionServicePtr()->RevokePermission( | 319 GetPermissionServicePtr()->RevokePermission( |
271 GetPermissionName(type), | 320 GetPermissionName(type), |
272 origin, | 321 origin, |
273 base::Bind(&PermissionDispatcher::OnPermissionResponse, | 322 base::Bind(&PermissionDispatcher::OnPermissionResponse, |
274 base::Unretained(this), | 323 base::Unretained(this), |
275 worker_thread_id, | 324 worker_thread_id, |
276 callback_key)); | 325 callback_key)); |
277 } | 326 } |
278 | 327 |
279 void PermissionDispatcher::OnPermissionResponse( | 328 void PermissionDispatcher::OnPermissionResponse( |
280 int worker_thread_id, | 329 int worker_thread_id, |
281 uintptr_t callback_key, | 330 uintptr_t callback_key, |
282 PermissionStatus result) { | 331 PermissionStatus result) { |
283 scoped_ptr<blink::WebPermissionCallback> callback = | 332 scoped_ptr<blink::WebPermissionCallback> callback = |
284 pending_callbacks_.take_and_erase(callback_key); | 333 permission_callbacks_.take_and_erase(callback_key); |
285 blink::WebPermissionStatus status = GetWebPermissionStatus(result); | 334 blink::WebPermissionStatus status = GetWebPermissionStatus(result); |
286 | 335 |
287 if (worker_thread_id != kNoWorkerThread) { | 336 if (worker_thread_id != kNoWorkerThread) { |
288 // If the worker is no longer running, ::PostTask() will return false and | 337 // If the worker is no longer running, ::PostTask() will return false and |
289 // gracefully fail, destroying the callback too. | 338 // gracefully fail, destroying the callback too. |
290 WorkerTaskRunner::Instance()->PostTask( | 339 WorkerTaskRunner::Instance()->PostTask( |
291 worker_thread_id, | 340 worker_thread_id, |
292 base::Bind(&PermissionDispatcher::RunCallbackOnWorkerThread, | 341 base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread, |
293 base::Passed(&callback), status)); | 342 base::Passed(&callback), status)); |
294 return; | 343 return; |
295 } | 344 } |
296 | 345 |
297 callback->onSuccess(status); | 346 callback->onSuccess(status); |
298 } | 347 } |
299 | 348 |
| 349 void PermissionDispatcher::OnRequestPermissionsResponse( |
| 350 int worker_thread_id, |
| 351 uintptr_t callback_key, |
| 352 const mojo::Array<PermissionStatus>& result) { |
| 353 scoped_ptr<blink::WebPermissionsCallback> callback = |
| 354 permissions_callbacks_.take_and_erase(callback_key); |
| 355 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses( |
| 356 new blink::WebVector<blink::WebPermissionStatus>(result.size())); |
| 357 |
| 358 for (size_t i = 0; i < result.size(); i++) |
| 359 statuses->operator[](i) = GetWebPermissionStatus(result[i]); |
| 360 |
| 361 if (worker_thread_id != kNoWorkerThread) { |
| 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::RunPermissionsCallbackOnWorkerThread, |
| 367 base::Passed(&callback), |
| 368 base::Passed(&statuses))); |
| 369 return; |
| 370 } |
| 371 |
| 372 callback->onSuccess(blink::adoptWebPtr(statuses.release())); |
| 373 } |
| 374 |
300 void PermissionDispatcher::OnPermissionChanged( | 375 void PermissionDispatcher::OnPermissionChanged( |
301 blink::WebPermissionType type, | 376 blink::WebPermissionType type, |
302 const std::string& origin, | 377 const std::string& origin, |
303 WebPermissionObserver* observer, | 378 WebPermissionObserver* observer, |
304 PermissionStatus status) { | 379 PermissionStatus status) { |
305 if (!IsObserverRegistered(observer)) | 380 if (!IsObserverRegistered(observer)) |
306 return; | 381 return; |
307 | 382 |
308 observer->permissionChanged(type, GetWebPermissionStatus(status)); | 383 observer->permissionChanged(type, GetWebPermissionStatus(status)); |
309 | 384 |
(...skipping 20 matching lines...) Expand all Loading... |
330 origin, | 405 origin, |
331 current_status, | 406 current_status, |
332 base::Bind(&PermissionDispatcher::OnPermissionChanged, | 407 base::Bind(&PermissionDispatcher::OnPermissionChanged, |
333 base::Unretained(this), | 408 base::Unretained(this), |
334 type, | 409 type, |
335 origin, | 410 origin, |
336 base::Unretained(observer))); | 411 base::Unretained(observer))); |
337 } | 412 } |
338 | 413 |
339 } // namespace content | 414 } // namespace content |
OLD | NEW |