| 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 |