Index: android_webview/browser/aw_permission_manager.cc |
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc |
index 12a6cdd1a840377462fddf9adcff9e1515145945..88dd1f15104cb2251c6d87a50fe9950ef712f78d 100644 |
--- a/android_webview/browser/aw_permission_manager.cc |
+++ b/android_webview/browser/aw_permission_manager.cc |
@@ -4,7 +4,9 @@ |
#include "android_webview/browser/aw_permission_manager.h" |
+#include <memory> |
#include <string> |
+#include <utility> |
#include "android_webview/browser/aw_browser_permission_request_delegate.h" |
#include "base/callback.h" |
@@ -253,10 +255,10 @@ int AwPermissionManager::RequestPermissions( |
const GURL& embedding_origin = LastCommittedOrigin(render_frame_host); |
- PendingRequest* pending_request = |
- new PendingRequest(permissions, requesting_origin, embedding_origin, |
- GetRenderProcessID(render_frame_host), |
- GetRenderFrameID(render_frame_host), callback); |
+ auto pending_request = base::MakeUnique<PendingRequest>( |
+ permissions, requesting_origin, embedding_origin, |
+ GetRenderProcessID(render_frame_host), |
+ GetRenderFrameID(render_frame_host), callback); |
std::vector<bool> should_delegate_requests = |
std::vector<bool>(permissions.size(), true); |
for (size_t i = 0; i < permissions.size(); ++i) { |
@@ -275,10 +277,14 @@ int AwPermissionManager::RequestPermissions( |
} |
} |
- int request_id = pending_requests_.Add(pending_request); |
+ // Keep copy of pointer for performing further operations after ownership is |
+ // transferred to pending_requests_ |
+ PendingRequest* pending_request_raw = pending_request.get(); |
+ int request_id = pending_requests_.Add(std::move(pending_request)); |
- AwBrowserPermissionRequestDelegate* delegate = GetDelegate( |
- pending_request->render_process_id, pending_request->render_frame_id); |
+ AwBrowserPermissionRequestDelegate* delegate = |
+ GetDelegate(pending_request_raw->render_process_id, |
+ pending_request_raw->render_frame_id); |
for (size_t i = 0; i < permissions.size(); ++i) { |
if (!should_delegate_requests[i]) |
@@ -287,27 +293,27 @@ int AwPermissionManager::RequestPermissions( |
if (!delegate) { |
DVLOG(0) << "Dropping permissions request for " |
<< static_cast<int>(permissions[i]); |
- pending_request->SetPermissionStatus(permissions[i], |
- PermissionStatus::DENIED); |
+ pending_request_raw->SetPermissionStatus(permissions[i], |
+ PermissionStatus::DENIED); |
continue; |
} |
switch (permissions[i]) { |
case PermissionType::GEOLOCATION: |
delegate->RequestGeolocationPermission( |
- pending_request->requesting_origin, |
+ pending_request_raw->requesting_origin, |
base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
request_id, permissions[i])); |
break; |
case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
delegate->RequestProtectedMediaIdentifierPermission( |
- pending_request->requesting_origin, |
+ pending_request_raw->requesting_origin, |
base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
request_id, permissions[i])); |
break; |
case PermissionType::MIDI_SYSEX: |
delegate->RequestMIDISysexPermission( |
- pending_request->requesting_origin, |
+ pending_request_raw->requesting_origin, |
base::Bind(&OnRequestResponse, weak_ptr_factory_.GetWeakPtr(), |
request_id, permissions[i])); |
break; |
@@ -320,17 +326,17 @@ int AwPermissionManager::RequestPermissions( |
case PermissionType::FLASH: |
NOTIMPLEMENTED() << "RequestPermissions is not implemented for " |
<< static_cast<int>(permissions[i]); |
- pending_request->SetPermissionStatus(permissions[i], |
- PermissionStatus::DENIED); |
+ pending_request_raw->SetPermissionStatus(permissions[i], |
+ PermissionStatus::DENIED); |
break; |
case PermissionType::MIDI: |
- pending_request->SetPermissionStatus(permissions[i], |
- PermissionStatus::GRANTED); |
+ pending_request_raw->SetPermissionStatus(permissions[i], |
+ PermissionStatus::GRANTED); |
break; |
case PermissionType::NUM: |
NOTREACHED() << "PermissionType::NUM was not expected here."; |
- pending_request->SetPermissionStatus(permissions[i], |
- PermissionStatus::DENIED); |
+ pending_request_raw->SetPermissionStatus(permissions[i], |
+ PermissionStatus::DENIED); |
break; |
} |
} |
@@ -344,8 +350,8 @@ int AwPermissionManager::RequestPermissions( |
// PermissionType::MIDI is permitted within the previous for-loop, all |
// requests could be already resolved, but still in the |pending_requests_| |
// without invoking the callback. |
- if (pending_request->IsCompleted()) { |
- std::vector<PermissionStatus> results = pending_request->results; |
+ if (pending_request_raw->IsCompleted()) { |
+ std::vector<PermissionStatus> results = pending_request_raw->results; |
pending_requests_.Remove(request_id); |
callback.Run(results); |
return kNoPendingOperation; |