Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1988)

Unified Diff: android_webview/browser/aw_permission_manager.cc

Issue 1342833002: permissions: handle request ids for permissions in permission manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698