Index: chrome/browser/permissions/permission_manager.cc |
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc |
index 6aa0728dc9bd125e6a6276451fee58a22201bb8a..ff670c218d814c63055b102e700079476397b1e5 100644 |
--- a/chrome/browser/permissions/permission_manager.cc |
+++ b/chrome/browser/permissions/permission_manager.cc |
@@ -10,6 +10,7 @@ |
#include "chrome/browser/permissions/permission_context_base.h" |
#include "chrome/browser/permissions/permission_request_id.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/tab_contents/tab_util.h" |
#include "chrome/browser/ui/website_settings/permission_bubble_manager.h" |
#include "components/content_settings/core/browser/host_content_settings_map.h" |
#include "content/public/browser/permission_type.h" |
@@ -79,14 +80,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 |
@@ -122,6 +115,12 @@ PermissionStatus GetPermissionStatusForConstantPermission(PermissionType type) { |
} // anonymous namespace |
+struct PermissionManager::PendingRequest { |
+ PermissionType permission; |
+ int render_process_id; |
+ int render_frame_id; |
+}; |
+ |
struct PermissionManager::Subscription { |
PermissionType permission; |
GURL requesting_origin; |
@@ -131,7 +130,8 @@ struct PermissionManager::Subscription { |
}; |
PermissionManager::PermissionManager(Profile* profile) |
- : profile_(profile) { |
+ : profile_(profile), |
+ weak_ptr_factory_(this) { |
} |
PermissionManager::~PermissionManager() { |
@@ -140,22 +140,21 @@ PermissionManager::~PermissionManager() { |
->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 kNoPendingRequestOrSubscription; |
} |
PermissionContextBase* context = PermissionContext::Get(profile_, permission); |
if (!context) { |
callback.Run(content::PERMISSION_STATUS_DENIED); |
- return; |
+ return kNoPendingRequestOrSubscription; |
} |
content::WebContents* web_contents = |
@@ -164,41 +163,62 @@ void PermissionManager::RequestPermission( |
callback.Run( |
GetPermissionStatus(permission, requesting_origin, |
web_contents->GetLastCommittedURL().GetOrigin())); |
- return; |
+ return kNoPendingRequestOrSubscription; |
} |
int render_process_id = render_frame_host->GetProcess()->GetID(); |
int render_frame_id = render_frame_host->GetRoutingID(); |
+ |
+ PendingRequest* pending_request = new PendingRequest(); |
+ pending_request->render_process_id = render_process_id; |
+ pending_request->render_frame_id = render_frame_id; |
+ pending_request->permission = permission; |
mlamouri (slow - plz ping)
2015/09/23 14:46:00
Could you add a ctor to PendingRequest?
Lalit Maganti
2015/09/23 15:24:30
Done.
|
+ |
+ int request_id = pending_requests_.Add(pending_request); |
mlamouri (slow - plz ping)
2015/09/23 14:46:00
... you could even call new PendingRequest() here
Lalit Maganti
2015/09/23 15:24:30
The way I did the constructor means that I need th
|
const PermissionRequestID request(render_process_id, |
render_frame_id, |
request_id); |
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::CancelPermissionRequest( |
- PermissionType permission, |
- content::RenderFrameHost* render_frame_host, |
+void PermissionManager::OnPermissionRequestResponse( |
int request_id, |
- const GURL& requesting_origin) { |
- PermissionContextBase* context = PermissionContext::Get(profile_, permission); |
+ const base::Callback<void(PermissionStatus)>& callback, |
+ ContentSetting content_setting) { |
+ pending_requests_.Remove(request_id); |
+ callback.Run(ContentSettingToPermissionStatus(content_setting)); |
+} |
+ |
+void PermissionManager::CancelPermissionRequest(int request_id) { |
+ PendingRequest* pending_request = pending_requests_.Lookup(request_id); |
+ if (!pending_request) |
+ return; |
+ |
+ PermissionContextBase* context = PermissionContext::Get( |
+ profile_, pending_request->permission); |
if (!context) |
return; |
- content::WebContents* web_contents = |
- content::WebContents::FromRenderFrameHost(render_frame_host); |
- if (IsPermissionBubbleManagerMissing(web_contents)) |
+ content::WebContents* web_contents = tab_util::GetWebContentsByFrameID( |
+ pending_request->render_process_id, pending_request->render_frame_id); |
+ DCHECK(web_contents); |
+ if (IsPermissionBubbleManagerMissing(web_contents)) { |
+ pending_requests_.Remove(request_id); |
return; |
+ } |
- int render_process_id = render_frame_host->GetProcess()->GetID(); |
- int render_frame_id = render_frame_host->GetRoutingID(); |
- const PermissionRequestID request(render_process_id, |
- render_frame_id, |
+ const PermissionRequestID request(pending_request->render_process_id, |
+ pending_request->render_frame_id, |
request_id); |
- |
context->CancelPermissionRequest(web_contents, request); |
+ pending_requests_.Remove(request_id); |
} |
void PermissionManager::ResetPermission(PermissionType permission, |