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 "android_webview/browser/aw_permission_manager.h" | 5 #include "android_webview/browser/aw_permission_manager.h" |
6 | 6 |
| 7 #include <memory> |
7 #include <string> | 8 #include <string> |
| 9 #include <utility> |
8 | 10 |
9 #include "android_webview/browser/aw_browser_permission_request_delegate.h" | 11 #include "android_webview/browser/aw_browser_permission_request_delegate.h" |
10 #include "base/callback.h" | 12 #include "base/callback.h" |
11 #include "base/containers/hash_tables.h" | 13 #include "base/containers/hash_tables.h" |
12 #include "base/logging.h" | 14 #include "base/logging.h" |
13 #include "content/public/browser/permission_type.h" | 15 #include "content/public/browser/permission_type.h" |
14 #include "content/public/browser/render_frame_host.h" | 16 #include "content/public/browser/render_frame_host.h" |
15 #include "content/public/browser/render_process_host.h" | 17 #include "content/public/browser/render_process_host.h" |
16 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
17 | 19 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 bool user_gesture, | 248 bool user_gesture, |
247 const base::Callback<void(const std::vector<PermissionStatus>&)>& | 249 const base::Callback<void(const std::vector<PermissionStatus>&)>& |
248 callback) { | 250 callback) { |
249 if (permissions.empty()) { | 251 if (permissions.empty()) { |
250 callback.Run(std::vector<PermissionStatus>()); | 252 callback.Run(std::vector<PermissionStatus>()); |
251 return kNoPendingOperation; | 253 return kNoPendingOperation; |
252 } | 254 } |
253 | 255 |
254 const GURL& embedding_origin = LastCommittedOrigin(render_frame_host); | 256 const GURL& embedding_origin = LastCommittedOrigin(render_frame_host); |
255 | 257 |
256 PendingRequest* pending_request = | 258 auto pending_request = base::MakeUnique<PendingRequest>( |
257 new PendingRequest(permissions, requesting_origin, embedding_origin, | 259 permissions, requesting_origin, embedding_origin, |
258 GetRenderProcessID(render_frame_host), | 260 GetRenderProcessID(render_frame_host), |
259 GetRenderFrameID(render_frame_host), callback); | 261 GetRenderFrameID(render_frame_host), callback); |
260 std::vector<bool> should_delegate_requests = | 262 std::vector<bool> should_delegate_requests = |
261 std::vector<bool>(permissions.size(), true); | 263 std::vector<bool>(permissions.size(), true); |
262 for (size_t i = 0; i < permissions.size(); ++i) { | 264 for (size_t i = 0; i < permissions.size(); ++i) { |
263 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_); | 265 for (PendingRequestsMap::Iterator<PendingRequest> it(&pending_requests_); |
264 !it.IsAtEnd(); it.Advance()) { | 266 !it.IsAtEnd(); it.Advance()) { |
265 if (it.GetCurrentValue()->HasPermissionType(permissions[i]) && | 267 if (it.GetCurrentValue()->HasPermissionType(permissions[i]) && |
266 it.GetCurrentValue()->requesting_origin == requesting_origin) { | 268 it.GetCurrentValue()->requesting_origin == requesting_origin) { |
267 if (it.GetCurrentValue()->IsCompleted(permissions[i])) { | 269 if (it.GetCurrentValue()->IsCompleted(permissions[i])) { |
268 pending_request->SetPermissionStatus( | 270 pending_request->SetPermissionStatus( |
269 permissions[i], | 271 permissions[i], |
270 it.GetCurrentValue()->GetPermissionStatus(permissions[i])); | 272 it.GetCurrentValue()->GetPermissionStatus(permissions[i])); |
271 } | 273 } |
272 should_delegate_requests[i] = false; | 274 should_delegate_requests[i] = false; |
273 break; | 275 break; |
274 } | 276 } |
275 } | 277 } |
276 } | 278 } |
277 | 279 |
278 int request_id = pending_requests_.Add(pending_request); | 280 // Keep copy of pointer for performing further operations after ownership is |
| 281 // transferred to pending_requests_ |
| 282 PendingRequest* pending_request_raw = pending_request.get(); |
| 283 int request_id = pending_requests_.Add(std::move(pending_request)); |
279 | 284 |
280 AwBrowserPermissionRequestDelegate* delegate = GetDelegate( | 285 AwBrowserPermissionRequestDelegate* delegate = |
281 pending_request->render_process_id, pending_request->render_frame_id); | 286 GetDelegate(pending_request_raw->render_process_id, |
| 287 pending_request_raw->render_frame_id); |
282 | 288 |
283 for (size_t i = 0; i < permissions.size(); ++i) { | 289 for (size_t i = 0; i < permissions.size(); ++i) { |
284 if (!should_delegate_requests[i]) | 290 if (!should_delegate_requests[i]) |
285 continue; | 291 continue; |
286 | 292 |
287 if (!delegate) { | 293 if (!delegate) { |
288 DVLOG(0) << "Dropping permissions request for " | 294 DVLOG(0) << "Dropping permissions request for " |
289 << static_cast<int>(permissions[i]); | 295 << static_cast<int>(permissions[i]); |
290 pending_request->SetPermissionStatus(permissions[i], | 296 pending_request_raw->SetPermissionStatus(permissions[i], |
291 PermissionStatus::DENIED); | 297 PermissionStatus::DENIED); |
292 continue; | 298 continue; |
293 } | 299 } |
294 | 300 |
295 switch (permissions[i]) { | 301 switch (permissions[i]) { |
296 case PermissionType::GEOLOCATION: | 302 case PermissionType::GEOLOCATION: |
297 delegate->RequestGeolocationPermission( | 303 delegate->RequestGeolocationPermission( |
298 pending_request->requesting_origin, | 304 pending_request_raw->requesting_origin, |
299 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), | 305 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
300 request_id, permissions[i])); | 306 request_id, permissions[i])); |
301 break; | 307 break; |
302 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: | 308 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
303 delegate->RequestProtectedMediaIdentifierPermission( | 309 delegate->RequestProtectedMediaIdentifierPermission( |
304 pending_request->requesting_origin, | 310 pending_request_raw->requesting_origin, |
305 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), | 311 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
306 request_id, permissions[i])); | 312 request_id, permissions[i])); |
307 break; | 313 break; |
308 case PermissionType::MIDI_SYSEX: | 314 case PermissionType::MIDI_SYSEX: |
309 delegate->RequestMIDISysexPermission( | 315 delegate->RequestMIDISysexPermission( |
310 pending_request->requesting_origin, | 316 pending_request_raw->requesting_origin, |
311 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), | 317 base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
312 request_id, permissions[i])); | 318 request_id, permissions[i])); |
313 break; | 319 break; |
314 case PermissionType::AUDIO_CAPTURE: | 320 case PermissionType::AUDIO_CAPTURE: |
315 case PermissionType::VIDEO_CAPTURE: | 321 case PermissionType::VIDEO_CAPTURE: |
316 case PermissionType::NOTIFICATIONS: | 322 case PermissionType::NOTIFICATIONS: |
317 case PermissionType::PUSH_MESSAGING: | 323 case PermissionType::PUSH_MESSAGING: |
318 case PermissionType::DURABLE_STORAGE: | 324 case PermissionType::DURABLE_STORAGE: |
319 case PermissionType::BACKGROUND_SYNC: | 325 case PermissionType::BACKGROUND_SYNC: |
320 case PermissionType::FLASH: | 326 case PermissionType::FLASH: |
321 NOTIMPLEMENTED() << "RequestPermissions is not implemented for " | 327 NOTIMPLEMENTED() << "RequestPermissions is not implemented for " |
322 << static_cast<int>(permissions[i]); | 328 << static_cast<int>(permissions[i]); |
323 pending_request->SetPermissionStatus(permissions[i], | 329 pending_request_raw->SetPermissionStatus(permissions[i], |
324 PermissionStatus::DENIED); | 330 PermissionStatus::DENIED); |
325 break; | 331 break; |
326 case PermissionType::MIDI: | 332 case PermissionType::MIDI: |
327 pending_request->SetPermissionStatus(permissions[i], | 333 pending_request_raw->SetPermissionStatus(permissions[i], |
328 PermissionStatus::GRANTED); | 334 PermissionStatus::GRANTED); |
329 break; | 335 break; |
330 case PermissionType::NUM: | 336 case PermissionType::NUM: |
331 NOTREACHED() << "PermissionType::NUM was not expected here."; | 337 NOTREACHED() << "PermissionType::NUM was not expected here."; |
332 pending_request->SetPermissionStatus(permissions[i], | 338 pending_request_raw->SetPermissionStatus(permissions[i], |
333 PermissionStatus::DENIED); | 339 PermissionStatus::DENIED); |
334 break; | 340 break; |
335 } | 341 } |
336 } | 342 } |
337 | 343 |
338 // If delegate resolve the permission synchronously, all requests could be | 344 // If delegate resolve the permission synchronously, all requests could be |
339 // already resolved here. | 345 // already resolved here. |
340 if (!pending_requests_.Lookup(request_id)) | 346 if (!pending_requests_.Lookup(request_id)) |
341 return kNoPendingOperation; | 347 return kNoPendingOperation; |
342 | 348 |
343 // If requests are resolved without calling delegate functions, e.g. | 349 // If requests are resolved without calling delegate functions, e.g. |
344 // PermissionType::MIDI is permitted within the previous for-loop, all | 350 // PermissionType::MIDI is permitted within the previous for-loop, all |
345 // requests could be already resolved, but still in the |pending_requests_| | 351 // requests could be already resolved, but still in the |pending_requests_| |
346 // without invoking the callback. | 352 // without invoking the callback. |
347 if (pending_request->IsCompleted()) { | 353 if (pending_request_raw->IsCompleted()) { |
348 std::vector<PermissionStatus> results = pending_request->results; | 354 std::vector<PermissionStatus> results = pending_request_raw->results; |
349 pending_requests_.Remove(request_id); | 355 pending_requests_.Remove(request_id); |
350 callback.Run(results); | 356 callback.Run(results); |
351 return kNoPendingOperation; | 357 return kNoPendingOperation; |
352 } | 358 } |
353 | 359 |
354 return request_id; | 360 return request_id; |
355 } | 361 } |
356 | 362 |
357 // static | 363 // static |
358 void AwPermissionManager::OnRequestResponse( | 364 void AwPermissionManager::OnRequestResponse( |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 ->GetLastCommittedURL().GetOrigin(); | 548 ->GetLastCommittedURL().GetOrigin(); |
543 } | 549 } |
544 | 550 |
545 AwBrowserPermissionRequestDelegate* AwPermissionManager::GetDelegate( | 551 AwBrowserPermissionRequestDelegate* AwPermissionManager::GetDelegate( |
546 int render_process_id, int render_frame_id) { | 552 int render_process_id, int render_frame_id) { |
547 return AwBrowserPermissionRequestDelegate::FromID(render_process_id, | 553 return AwBrowserPermissionRequestDelegate::FromID(render_process_id, |
548 render_frame_id); | 554 render_frame_id); |
549 } | 555 } |
550 | 556 |
551 } // namespace android_webview | 557 } // namespace android_webview |
OLD | NEW |