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 6fe1e1e400a906ab5816b4c019c3057bae5bda3f..7cafe3685ae90d718b240d9677b216f896c2be19 100644 |
--- a/android_webview/browser/aw_permission_manager.cc |
+++ b/android_webview/browser/aw_permission_manager.cc |
@@ -10,7 +10,6 @@ |
#include "base/callback.h" |
#include "base/containers/hash_tables.h" |
#include "base/logging.h" |
-#include "base/memory/weak_ptr.h" |
#include "content/public/browser/permission_type.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
@@ -138,39 +137,24 @@ class LastRequestResultCache { |
DISALLOW_COPY_AND_ASSIGN(LastRequestResultCache); |
}; |
-namespace { |
- |
-void CallbackPermisisonStatusWrapper( |
- const base::WeakPtr<LastRequestResultCache>& result_cache, |
- const base::Callback<void(PermissionStatus)>& callback, |
- PermissionType permission, |
- const GURL& requesting_origin, |
- const GURL& embedding_origin, |
- bool allowed) { |
- PermissionStatus status = allowed ? content::PERMISSION_STATUS_GRANTED |
- : content::PERMISSION_STATUS_DENIED; |
- if (result_cache.get()) { |
- result_cache->SetResult(permission, requesting_origin, embedding_origin, |
- status); |
- } |
- |
- callback.Run(status); |
-} |
- |
-} // anonymous namespace |
+struct AwPermissionManager::PendingRequest { |
+ PermissionType permission; |
+ GURL requesting_origin; |
+}; |
AwPermissionManager::AwPermissionManager() |
- : content::PermissionManager(), result_cache_(new LastRequestResultCache) { |
+ : content::PermissionManager(), |
+ result_cache_(new LastRequestResultCache), |
+ weak_ptr_factory_(this) { |
} |
AwPermissionManager::~AwPermissionManager() { |
} |
-void AwPermissionManager::RequestPermission( |
+int AwPermissionManager::RequestPermission( |
PermissionType permission, |
content::RenderFrameHost* render_frame_host, |
- int request_id, |
- const GURL& origin, |
+ const GURL& requesting_origin, |
bool user_gesture, |
const base::Callback<void(PermissionStatus)>& callback) { |
int render_process_id = render_frame_host->GetProcess()->GetID(); |
@@ -182,31 +166,41 @@ void AwPermissionManager::RequestPermission( |
DVLOG(0) << "Dropping permission request for " |
<< static_cast<int>(permission); |
callback.Run(content::PERMISSION_STATUS_DENIED); |
- return; |
+ return -1; |
} |
const GURL& embedding_origin = |
content::WebContents::FromRenderFrameHost(render_frame_host) |
->GetLastCommittedURL().GetOrigin(); |
+ int request_id = -1; |
switch (permission) { |
case PermissionType::GEOLOCATION: |
+ request_id = AddPendingRequestToMap(permission, requesting_origin); |
delegate->RequestGeolocationPermission( |
- origin, base::Bind(&CallbackPermisisonStatusWrapper, |
- result_cache_->GetWeakPtr(), callback, permission, |
- origin, embedding_origin)); |
+ requesting_origin, |
+ base::Bind(&AwPermissionManager::OnRequestResponse, |
+ weak_ptr_factory_.GetWeakPtr(), request_id, |
+ result_cache_->GetWeakPtr(), callback, permission, |
+ requesting_origin, embedding_origin)); |
break; |
case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
+ request_id = AddPendingRequestToMap(permission, requesting_origin); |
delegate->RequestProtectedMediaIdentifierPermission( |
- origin, base::Bind(&CallbackPermisisonStatusWrapper, |
- result_cache_->GetWeakPtr(), callback, permission, |
- origin, embedding_origin)); |
+ requesting_origin, |
+ base::Bind(&AwPermissionManager::OnRequestResponse, |
+ weak_ptr_factory_.GetWeakPtr(), request_id, |
+ result_cache_->GetWeakPtr(), callback, permission, |
+ requesting_origin, embedding_origin)); |
break; |
case PermissionType::MIDI_SYSEX: |
+ request_id = AddPendingRequestToMap(permission, requesting_origin); |
delegate->RequestMIDISysexPermission( |
- origin, base::Bind(&CallbackPermisisonStatusWrapper, |
- result_cache_->GetWeakPtr(), callback, permission, |
- origin, embedding_origin)); |
+ requesting_origin, |
+ base::Bind(&AwPermissionManager::OnRequestResponse, |
+ weak_ptr_factory_.GetWeakPtr(), request_id, |
+ result_cache_->GetWeakPtr(), callback, permission, |
+ requesting_origin, embedding_origin)); |
break; |
case PermissionType::AUDIO_CAPTURE: |
case PermissionType::VIDEO_CAPTURE: |
@@ -225,20 +219,58 @@ void AwPermissionManager::RequestPermission( |
callback.Run(content::PERMISSION_STATUS_DENIED); |
break; |
} |
+ return request_id; |
} |
-void AwPermissionManager::CancelPermissionRequest( |
+// static |
+void AwPermissionManager::OnRequestResponse( |
+ const base::WeakPtr<AwPermissionManager>& manager, |
+ int request_id, |
+ const base::WeakPtr<LastRequestResultCache>& result_cache, |
+ const base::Callback<void(PermissionStatus)>& callback, |
+ PermissionType permission, |
+ const GURL& requesting_origin, |
+ const GURL& embedding_origin, |
+ bool allowed) { |
+ PermissionStatus status = allowed ? content::PERMISSION_STATUS_GRANTED |
+ : content::PERMISSION_STATUS_DENIED; |
+ if (result_cache.get()) { |
+ result_cache->SetResult(permission, requesting_origin, embedding_origin, |
+ status); |
+ } |
+ if (manager.get()) { |
+ manager->pending_requests_.Remove(request_id); |
+ } |
+ |
+ callback.Run(status); |
+} |
+ |
+int AwPermissionManager::AddPendingRequestToMap( |
PermissionType permission, |
+ const GURL& requesting_origin) { |
+ PendingRequest* request = new PendingRequest(); |
+ request->permission = permission; |
+ request->requesting_origin = requesting_origin; |
+ return pending_requests_.Add(request); |
+} |
+ |
+void AwPermissionManager::CancelPermissionRequest( |
content::RenderFrameHost* render_frame_host, |
- int request_id, |
- const GURL& origin) { |
+ int request_id) { |
+ PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
+ if (!pending_request) |
+ return; |
+ |
// The caller is canceling (presumably) the most recent request. Assuming the |
// request did not complete, the user did not respond to the requset. |
// Thus, assume we do not know the result. |
const GURL& embedding_origin = |
content::WebContents::FromRenderFrameHost(render_frame_host) |
->GetLastCommittedURL().GetOrigin(); |
- result_cache_->ClearResult(permission, origin, embedding_origin); |
+ result_cache_->ClearResult( |
+ pending_request->permission, |
+ pending_request->requesting_origin, |
+ embedding_origin); |
int render_process_id = render_frame_host->GetProcess()->GetID(); |
int render_frame_id = render_frame_host->GetRoutingID(); |
@@ -248,15 +280,18 @@ void AwPermissionManager::CancelPermissionRequest( |
if (!delegate) |
return; |
- switch (permission) { |
+ switch (pending_request->permission) { |
case PermissionType::GEOLOCATION: |
- delegate->CancelGeolocationPermissionRequests(origin); |
+ delegate->CancelGeolocationPermissionRequests( |
+ pending_request->requesting_origin); |
break; |
case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
- delegate->CancelProtectedMediaIdentifierPermissionRequests(origin); |
+ delegate->CancelProtectedMediaIdentifierPermissionRequests( |
+ pending_request->requesting_origin); |
break; |
case PermissionType::MIDI_SYSEX: |
- delegate->CancelMIDISysexPermissionRequests(origin); |
+ delegate->CancelMIDISysexPermissionRequests( |
+ pending_request->requesting_origin); |
break; |
case PermissionType::NOTIFICATIONS: |
case PermissionType::PUSH_MESSAGING: |
@@ -264,7 +299,7 @@ void AwPermissionManager::CancelPermissionRequest( |
case PermissionType::AUDIO_CAPTURE: |
case PermissionType::VIDEO_CAPTURE: |
NOTIMPLEMENTED() << "CancelPermission not implemented for " |
- << static_cast<int>(permission); |
+ << static_cast<int>(pending_request->permission); |
break; |
case PermissionType::MIDI: |
// There is nothing to cancel so this is simply ignored. |