Index: chrome/browser/permissions/permission_manager.cc |
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc |
index f5564e6ec45908ef4f39e89e80cbf380f6391e97..2422d1b170b59ff58ed59115b00421499874be8f 100644 |
--- a/chrome/browser/permissions/permission_manager.cc |
+++ b/chrome/browser/permissions/permission_manager.cc |
@@ -78,14 +78,6 @@ ContentSettingsType PermissionTypeToContentSetting(PermissionType permission) { |
return CONTENT_SETTINGS_TYPE_DEFAULT; |
} |
-// Helper method that wraps a callback a void(PermissionStatus) |
-// callback into a void(ContentSetting) callback. |
-void PermissionStatusCallbackWrapper( |
- const base::Callback<void(PermissionStatus)>& callback, |
- ContentSetting content_setting) { |
- callback.Run(ContentSettingToPermissionStatus(content_setting)); |
-} |
- |
// Returns whether the permission has a constant PermissionStatus value (i.e. |
// always approved or always denied) |
// The PermissionTypes for which true is returned should be exactly those which |
@@ -121,6 +113,10 @@ PermissionStatus GetPermissionStatusForConstantPermission(PermissionType type) { |
} // anonymous namespace |
+struct PermissionManager::PendingRequest { |
+ PermissionType permission; |
+}; |
+ |
struct PermissionManager::Subscription { |
PermissionType permission; |
GURL requesting_origin; |
@@ -130,7 +126,8 @@ struct PermissionManager::Subscription { |
}; |
PermissionManager::PermissionManager(Profile* profile) |
- : profile_(profile) { |
+ : profile_(profile), |
+ weak_ptr_factory_(this) { |
} |
PermissionManager::~PermissionManager() { |
@@ -138,22 +135,21 @@ PermissionManager::~PermissionManager() { |
profile_->GetHostContentSettingsMap()->RemoveObserver(this); |
} |
-void PermissionManager::RequestPermission( |
+int PermissionManager::RequestPermission( |
PermissionType permission, |
content::RenderFrameHost* render_frame_host, |
- int request_id, |
const GURL& requesting_origin, |
bool user_gesture, |
const base::Callback<void(PermissionStatus)>& callback) { |
if (IsConstantPermission(permission)) { |
callback.Run(GetPermissionStatusForConstantPermission(permission)); |
- return; |
+ return -1; |
} |
PermissionContextBase* context = PermissionContext::Get(profile_, permission); |
if (!context) { |
callback.Run(content::PERMISSION_STATUS_DENIED); |
- return; |
+ return -1; |
} |
content::WebContents* web_contents = |
@@ -162,9 +158,13 @@ void PermissionManager::RequestPermission( |
callback.Run( |
GetPermissionStatus(permission, requesting_origin, |
web_contents->GetLastCommittedURL().GetOrigin())); |
- return; |
+ return -1; |
} |
+ PendingRequest* pending_request = new PendingRequest(); |
+ pending_request->permission = permission; |
+ int request_id = pending_requests_.Add(pending_request); |
+ |
int render_process_id = render_frame_host->GetProcess()->GetID(); |
int render_frame_id = render_frame_host->GetRoutingID(); |
const PermissionRequestID request(render_process_id, |
@@ -173,15 +173,31 @@ void PermissionManager::RequestPermission( |
context->RequestPermission( |
web_contents, request, requesting_origin, user_gesture, |
- base::Bind(&PermissionStatusCallbackWrapper, callback)); |
+ base::Bind(&PermissionManager::OnPermissionRequestResponse, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ request_id, |
+ callback)); |
+ return request_id; |
+} |
+ |
+void PermissionManager::OnPermissionRequestResponse( |
+ int request_id, |
+ const base::Callback<void(PermissionStatus)>& callback, |
+ ContentSetting content_setting) { |
+ pending_requests_.Remove(request_id); |
+ callback.Run(ContentSettingToPermissionStatus(content_setting)); |
} |
void PermissionManager::CancelPermissionRequest( |
- PermissionType permission, |
content::RenderFrameHost* render_frame_host, |
- int request_id, |
- const GURL& requesting_origin) { |
- PermissionContextBase* context = PermissionContext::Get(profile_, permission); |
+ int request_id) { |
+ PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
+ if (!pending_request) |
+ return; |
+ |
+ PermissionContextBase* context = PermissionContext::Get( |
+ profile_, pending_request->permission); |
+ pending_requests_.Remove(request_id); |
if (!context) |
return; |