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

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 test failures 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..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(

Powered by Google App Engine
This is Rietveld 408576698