Chromium Code Reviews| 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..f4777753a80d66d6c569ff81ef997aba26bc08b1 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" |
| @@ -23,7 +22,7 @@ namespace android_webview { |
| class LastRequestResultCache { |
| public: |
| - LastRequestResultCache() : weak_factory_(this) {} |
| + LastRequestResultCache() = default; |
| void SetResult(PermissionType permission, |
| const GURL& requesting_origin, |
| @@ -114,10 +113,6 @@ class LastRequestResultCache { |
| pmi_result_cache_.erase(key); |
| } |
| - base::WeakPtr<LastRequestResultCache> GetWeakPtr() { |
| - return weak_factory_.GetWeakPtr(); |
| - } |
| - |
| private: |
| // Returns a concatenation of the origins to be used as the index. |
| // Returns the empty string if either origin is invalid or empty. |
| @@ -133,44 +128,29 @@ class LastRequestResultCache { |
| using StatusMap = base::hash_map<std::string, PermissionStatus>; |
| StatusMap pmi_result_cache_; |
| - base::WeakPtrFactory<LastRequestResultCache> weak_factory_; |
| - |
| 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; |
| + int render_process_id; |
| + int render_frame_id; |
| +}; |
| 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 +162,44 @@ void AwPermissionManager::RequestPermission( |
| DVLOG(0) << "Dropping permission request for " |
| << static_cast<int>(permission); |
| callback.Run(content::PERMISSION_STATUS_DENIED); |
| - return; |
| + return kCancelUnsubscribeNoOp; |
| } |
| const GURL& embedding_origin = |
| content::WebContents::FromRenderFrameHost(render_frame_host) |
| ->GetLastCommittedURL().GetOrigin(); |
| + int request_id = kCancelUnsubscribeNoOp; |
| switch (permission) { |
| case PermissionType::GEOLOCATION: |
| + request_id = AddPendingRequestToMap(render_process_id, render_frame_id, |
| + 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, |
| + callback, permission, |
| + requesting_origin, embedding_origin)); |
| break; |
| case PermissionType::PROTECTED_MEDIA_IDENTIFIER: |
| + request_id = AddPendingRequestToMap(render_process_id, render_frame_id, |
| + 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, |
| + callback, permission, |
| + requesting_origin, embedding_origin)); |
| break; |
| case PermissionType::MIDI_SYSEX: |
| + request_id = AddPendingRequestToMap(render_process_id, render_frame_id, |
| + 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, |
| + callback, permission, |
| + requesting_origin, embedding_origin)); |
| break; |
| case PermissionType::AUDIO_CAPTURE: |
| case PermissionType::VIDEO_CAPTURE: |
| @@ -225,38 +218,86 @@ void AwPermissionManager::RequestPermission( |
| callback.Run(content::PERMISSION_STATUS_DENIED); |
| break; |
| } |
| + return request_id; |
| } |
| -void AwPermissionManager::CancelPermissionRequest( |
| - PermissionType permission, |
| - content::RenderFrameHost* render_frame_host, |
| +// static |
| +void AwPermissionManager::OnRequestResponse( |
| + const base::WeakPtr<AwPermissionManager>& manager, |
| int request_id, |
| - const GURL& origin) { |
| + const base::Callback<void(PermissionStatus)>& callback, |
| + PermissionType permission, |
| + const GURL& requesting_origin, |
| + const GURL& embedding_origin, |
|
mlamouri (slow - plz ping)
2015/09/16 14:42:56
Why do you pass |request_id| with all the other va
Lalit Maganti
2015/09/16 16:41:10
Good point. Fixed.
|
| + bool allowed) { |
| + PermissionStatus status = allowed ? content::PERMISSION_STATUS_GRANTED |
| + : content::PERMISSION_STATUS_DENIED; |
| + if (manager.get()) { |
| + manager->pending_requests_.Remove(request_id); |
| + manager->result_cache_->SetResult( |
| + permission, requesting_origin, embedding_origin, status); |
| + } |
| + callback.Run(status); |
| +} |
| + |
| +int AwPermissionManager::AddPendingRequestToMap( |
| + int render_process_id, |
| + int render_frame_id, |
| + PermissionType permission, |
| + const GURL& requesting_origin) { |
| + PendingRequest* request = new PendingRequest(); |
| + request->render_process_id = render_process_id; |
| + request->render_frame_id = render_frame_id; |
| + request->permission = permission; |
| + request->requesting_origin = requesting_origin; |
| + return pending_requests_.Add(request); |
|
mlamouri (slow - plz ping)
2015/09/16 14:42:56
Is having that helper method really better than do
Lalit Maganti
2015/09/16 16:41:10
Done.
|
| +} |
| + |
| +void AwPermissionManager::CancelPermissionRequest(int request_id) { |
| + PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
| + if (!pending_request) |
| + return; |
| + |
| + content::RenderFrameHost* render_frame_host = |
| + content::RenderFrameHost::FromID(pending_request->render_process_id, |
| + pending_request->render_frame_id); |
| + DCHECK(render_frame_host); |
| + |
| + content::WebContents* web_contents = |
| + content::WebContents::FromRenderFrameHost(render_frame_host); |
| + DCHECK(web_contents); |
| + |
| // 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) |
| + const GURL& embedding_origin = web_contents |
| ->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(); |
| AwBrowserPermissionRequestDelegate* delegate = |
| - AwBrowserPermissionRequestDelegate::FromID(render_process_id, |
| - render_frame_id); |
| - if (!delegate) |
| + AwBrowserPermissionRequestDelegate::FromID( |
| + pending_request->render_process_id, |
| + pending_request->render_frame_id); |
| + if (!delegate) { |
| + pending_requests_.Remove(request_id); |
| 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 +305,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. |
| @@ -273,6 +314,8 @@ void AwPermissionManager::CancelPermissionRequest( |
| NOTREACHED() << "PermissionType::NUM was not expected here."; |
| break; |
| } |
| + |
| + pending_requests_.Remove(request_id); |
| } |
| void AwPermissionManager::ResetPermission(PermissionType permission, |
| @@ -307,7 +350,7 @@ int AwPermissionManager::SubscribePermissionStatusChange( |
| const GURL& requesting_origin, |
| const GURL& embedding_origin, |
| const base::Callback<void(PermissionStatus)>& callback) { |
| - return -1; |
| + return kCancelUnsubscribeNoOp; |
| } |
| void AwPermissionManager::UnsubscribePermissionStatusChange( |