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

Side by Side Diff: chrome/browser/permissions/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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/permissions/permission_manager.h" 5 #include "chrome/browser/permissions/permission_manager.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "chrome/browser/permissions/permission_context.h" 8 #include "chrome/browser/permissions/permission_context.h"
9 #include "chrome/browser/permissions/permission_context_base.h" 9 #include "chrome/browser/permissions/permission_context_base.h"
10 #include "chrome/browser/permissions/permission_request_id.h" 10 #include "chrome/browser/permissions/permission_request_id.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 case PermissionType::NUM: 71 case PermissionType::NUM:
72 // This will hit the NOTREACHED below. 72 // This will hit the NOTREACHED below.
73 break; 73 break;
74 } 74 }
75 75
76 NOTREACHED() << "Unknown content setting for permission " 76 NOTREACHED() << "Unknown content setting for permission "
77 << static_cast<int>(permission); 77 << static_cast<int>(permission);
78 return CONTENT_SETTINGS_TYPE_DEFAULT; 78 return CONTENT_SETTINGS_TYPE_DEFAULT;
79 } 79 }
80 80
81 // Helper method that wraps a callback a void(PermissionStatus)
82 // callback into a void(ContentSetting) callback.
83 void PermissionStatusCallbackWrapper(
84 const base::Callback<void(PermissionStatus)>& callback,
85 ContentSetting content_setting) {
86 callback.Run(ContentSettingToPermissionStatus(content_setting));
87 }
88
89 // Returns whether the permission has a constant PermissionStatus value (i.e. 81 // Returns whether the permission has a constant PermissionStatus value (i.e.
90 // always approved or always denied) 82 // always approved or always denied)
91 // The PermissionTypes for which true is returned should be exactly those which 83 // The PermissionTypes for which true is returned should be exactly those which
92 // return nullptr in PermissionContext::Get since they don't have a context. 84 // return nullptr in PermissionContext::Get since they don't have a context.
93 bool IsConstantPermission(PermissionType type) { 85 bool IsConstantPermission(PermissionType type) {
94 switch (type) { 86 switch (type) {
95 case PermissionType::MIDI: 87 case PermissionType::MIDI:
96 return true; 88 return true;
97 default: 89 default:
98 return false; 90 return false;
(...skipping 15 matching lines...) Expand all
114 } 106 }
115 } 107 }
116 108
117 PermissionStatus GetPermissionStatusForConstantPermission(PermissionType type) { 109 PermissionStatus GetPermissionStatusForConstantPermission(PermissionType type) {
118 return ContentSettingToPermissionStatus( 110 return ContentSettingToPermissionStatus(
119 GetContentSettingForConstantPermission(type)); 111 GetContentSettingForConstantPermission(type));
120 } 112 }
121 113
122 } // anonymous namespace 114 } // anonymous namespace
123 115
116 struct PermissionManager::PendingRequest {
117 PermissionType permission;
118 };
119
124 struct PermissionManager::Subscription { 120 struct PermissionManager::Subscription {
125 PermissionType permission; 121 PermissionType permission;
126 GURL requesting_origin; 122 GURL requesting_origin;
127 GURL embedding_origin; 123 GURL embedding_origin;
128 base::Callback<void(PermissionStatus)> callback; 124 base::Callback<void(PermissionStatus)> callback;
129 ContentSetting current_value; 125 ContentSetting current_value;
130 }; 126 };
131 127
132 PermissionManager::PermissionManager(Profile* profile) 128 PermissionManager::PermissionManager(Profile* profile)
133 : profile_(profile) { 129 : profile_(profile),
130 weak_ptr_factory_(this) {
134 } 131 }
135 132
136 PermissionManager::~PermissionManager() { 133 PermissionManager::~PermissionManager() {
137 if (!subscriptions_.IsEmpty()) 134 if (!subscriptions_.IsEmpty())
138 profile_->GetHostContentSettingsMap()->RemoveObserver(this); 135 profile_->GetHostContentSettingsMap()->RemoveObserver(this);
139 } 136 }
140 137
141 void PermissionManager::RequestPermission( 138 int PermissionManager::RequestPermission(
142 PermissionType permission, 139 PermissionType permission,
143 content::RenderFrameHost* render_frame_host, 140 content::RenderFrameHost* render_frame_host,
144 int request_id,
145 const GURL& requesting_origin, 141 const GURL& requesting_origin,
146 bool user_gesture, 142 bool user_gesture,
147 const base::Callback<void(PermissionStatus)>& callback) { 143 const base::Callback<void(PermissionStatus)>& callback) {
148 if (IsConstantPermission(permission)) { 144 if (IsConstantPermission(permission)) {
149 callback.Run(GetPermissionStatusForConstantPermission(permission)); 145 callback.Run(GetPermissionStatusForConstantPermission(permission));
150 return; 146 return -1;
151 } 147 }
152 148
153 PermissionContextBase* context = PermissionContext::Get(profile_, permission); 149 PermissionContextBase* context = PermissionContext::Get(profile_, permission);
154 if (!context) { 150 if (!context) {
155 callback.Run(content::PERMISSION_STATUS_DENIED); 151 callback.Run(content::PERMISSION_STATUS_DENIED);
156 return; 152 return -1;
157 } 153 }
158 154
159 content::WebContents* web_contents = 155 content::WebContents* web_contents =
160 content::WebContents::FromRenderFrameHost(render_frame_host); 156 content::WebContents::FromRenderFrameHost(render_frame_host);
161 if (IsPermissionBubbleManagerMissing(web_contents)) { 157 if (IsPermissionBubbleManagerMissing(web_contents)) {
162 callback.Run( 158 callback.Run(
163 GetPermissionStatus(permission, requesting_origin, 159 GetPermissionStatus(permission, requesting_origin,
164 web_contents->GetLastCommittedURL().GetOrigin())); 160 web_contents->GetLastCommittedURL().GetOrigin()));
165 return; 161 return -1;
166 } 162 }
167 163
164 PendingRequest* pending_request = new PendingRequest();
165 pending_request->permission = permission;
166 int request_id = pending_requests_.Add(pending_request);
167
168 int render_process_id = render_frame_host->GetProcess()->GetID(); 168 int render_process_id = render_frame_host->GetProcess()->GetID();
169 int render_frame_id = render_frame_host->GetRoutingID(); 169 int render_frame_id = render_frame_host->GetRoutingID();
170 const PermissionRequestID request(render_process_id, 170 const PermissionRequestID request(render_process_id,
171 render_frame_id, 171 render_frame_id,
172 request_id); 172 request_id);
173 173
174 context->RequestPermission( 174 context->RequestPermission(
175 web_contents, request, requesting_origin, user_gesture, 175 web_contents, request, requesting_origin, user_gesture,
176 base::Bind(&PermissionStatusCallbackWrapper, callback)); 176 base::Bind(&PermissionManager::OnPermissionRequestResponse,
177 weak_ptr_factory_.GetWeakPtr(),
178 request_id,
179 callback));
180 return request_id;
181 }
182
183 void PermissionManager::OnPermissionRequestResponse(
184 int request_id,
185 const base::Callback<void(PermissionStatus)>& callback,
186 ContentSetting content_setting) {
187 pending_requests_.Remove(request_id);
188 callback.Run(ContentSettingToPermissionStatus(content_setting));
177 } 189 }
178 190
179 void PermissionManager::CancelPermissionRequest( 191 void PermissionManager::CancelPermissionRequest(
180 PermissionType permission,
181 content::RenderFrameHost* render_frame_host, 192 content::RenderFrameHost* render_frame_host,
182 int request_id, 193 int request_id) {
183 const GURL& requesting_origin) { 194 PendingRequest* pending_request = pending_requests_.Lookup(request_id);
184 PermissionContextBase* context = PermissionContext::Get(profile_, permission); 195 if (!pending_request)
196 return;
197
198 PermissionContextBase* context = PermissionContext::Get(
199 profile_, pending_request->permission);
200 pending_requests_.Remove(request_id);
185 if (!context) 201 if (!context)
186 return; 202 return;
187 203
188 content::WebContents* web_contents = 204 content::WebContents* web_contents =
189 content::WebContents::FromRenderFrameHost(render_frame_host); 205 content::WebContents::FromRenderFrameHost(render_frame_host);
190 if (IsPermissionBubbleManagerMissing(web_contents)) 206 if (IsPermissionBubbleManagerMissing(web_contents))
191 return; 207 return;
192 208
193 int render_process_id = render_frame_host->GetProcess()->GetID(); 209 int render_process_id = render_frame_host->GetProcess()->GetID();
194 int render_frame_id = render_frame_host->GetRoutingID(); 210 int render_frame_id = render_frame_host->GetRoutingID();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 // Add the callback to |callbacks| which will be run after the loop to 332 // Add the callback to |callbacks| which will be run after the loop to
317 // prevent re-entrance issues. 333 // prevent re-entrance issues.
318 callbacks.push_back( 334 callbacks.push_back(
319 base::Bind(subscription->callback, 335 base::Bind(subscription->callback,
320 ContentSettingToPermissionStatus(new_value))); 336 ContentSettingToPermissionStatus(new_value)));
321 } 337 }
322 338
323 for (const auto& callback : callbacks) 339 for (const auto& callback : callbacks)
324 callback.Run(); 340 callback.Run();
325 } 341 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698