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

Side by Side Diff: chrome/browser/permissions/permission_queue_controller.cc

Issue 2226633002: Add a feature to display a persistence toggle for permission prompts on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile Created 4 years, 4 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_queue_controller.h" 5 #include "chrome/browser/permissions/permission_queue_controller.h"
6 6
7 #include "chrome/browser/chrome_notification_types.h" 7 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 8 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
9 #include "chrome/browser/geolocation/geolocation_infobar_delegate_android.h" 9 #include "chrome/browser/geolocation/geolocation_infobar_delegate_android.h"
10 #include "chrome/browser/infobars/infobar_service.h" 10 #include "chrome/browser/infobars/infobar_service.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 pending_infobar_requests_.erase(i); 202 pending_infobar_requests_.erase(i);
203 return; 203 return;
204 } 204 }
205 } 205 }
206 206
207 void PermissionQueueController::OnPermissionSet(const PermissionRequestID& id, 207 void PermissionQueueController::OnPermissionSet(const PermissionRequestID& id,
208 const GURL& requesting_frame, 208 const GURL& requesting_frame,
209 const GURL& embedder, 209 const GURL& embedder,
210 bool user_gesture, 210 bool user_gesture,
211 bool update_content_setting, 211 bool update_content_setting,
212 bool allowed) { 212 PermissionAction decision) {
213 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 213 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
214 214
215 // TODO(miguelg): move the permission persistence to 215 // TODO(miguelg): move the permission persistence to
216 // PermissionContextBase once all the types are moved there. 216 // PermissionContextBase once all the types are moved there.
217 PermissionRequestGestureType gesture_type = 217 PermissionRequestGestureType gesture_type =
218 user_gesture ? PermissionRequestGestureType::GESTURE 218 user_gesture ? PermissionRequestGestureType::GESTURE
219 : PermissionRequestGestureType::NO_GESTURE; 219 : PermissionRequestGestureType::NO_GESTURE;
220 if (update_content_setting) { 220 switch (decision) {
221 UpdateContentSetting(requesting_frame, embedder, allowed); 221 case GRANTED:
222 if (allowed) {
223 PermissionUmaUtil::PermissionGranted(permission_type_, gesture_type, 222 PermissionUmaUtil::PermissionGranted(permission_type_, gesture_type,
224 requesting_frame, profile_); 223 requesting_frame, profile_);
225 } else { 224 break;
225 case DENIED:
226 PermissionUmaUtil::PermissionDenied(permission_type_, gesture_type, 226 PermissionUmaUtil::PermissionDenied(permission_type_, gesture_type,
227 requesting_frame, profile_); 227 requesting_frame, profile_);
228 } 228 break;
229 } else { 229 case DISMISSED:
230 PermissionUmaUtil::PermissionDismissed(permission_type_, gesture_type, 230 PermissionUmaUtil::PermissionDismissed(permission_type_, gesture_type,
231 requesting_frame, profile_); 231 requesting_frame, profile_);
232 break;
233 default:
234 NOTREACHED();
232 } 235 }
raymes 2016/08/16 01:44:53 The switch statement here seems kind of redundant.
dominickn 2016/08/16 03:06:50 I'd like to deal with this in a follow up - there'
raymes 2016/08/16 03:39:29 sgtm, thanks!
233 236
237 if (decision != DISMISSED && update_content_setting)
raymes 2016/08/16 01:44:53 Should this be a DCHECK instead? Actually I think
dominickn 2016/08/16 03:06:50 Done.
238 UpdateContentSetting(requesting_frame, embedder, decision);
239
234 // Cancel this request first, then notify listeners. TODO(pkasting): Why 240 // Cancel this request first, then notify listeners. TODO(pkasting): Why
235 // is this order important? 241 // is this order important?
236 PendingInfobarRequests requests_to_notify; 242 PendingInfobarRequests requests_to_notify;
237 PendingInfobarRequests infobars_to_remove; 243 PendingInfobarRequests infobars_to_remove;
238 std::vector<PendingInfobarRequests::iterator> pending_requests_to_remove; 244 std::vector<PendingInfobarRequests::iterator> pending_requests_to_remove;
239 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin(); 245 for (PendingInfobarRequests::iterator i = pending_infobar_requests_.begin();
240 i != pending_infobar_requests_.end(); ++i) { 246 i != pending_infobar_requests_.end(); ++i) {
241 if (!i->IsForPair(requesting_frame, embedder)) 247 if (!i->IsForPair(requesting_frame, embedder))
242 continue; 248 continue;
243 requests_to_notify.push_back(*i); 249 requests_to_notify.push_back(*i);
(...skipping 16 matching lines...) Expand all
260 infobars_to_remove.push_back(*i); 266 infobars_to_remove.push_back(*i);
261 } 267 }
262 268
263 // Remove all infobars for the same |requesting_frame| and |embedder|. 269 // Remove all infobars for the same |requesting_frame| and |embedder|.
264 for (PendingInfobarRequests::iterator i = infobars_to_remove.begin(); 270 for (PendingInfobarRequests::iterator i = infobars_to_remove.begin();
265 i != infobars_to_remove.end(); ++i) 271 i != infobars_to_remove.end(); ++i)
266 GetInfoBarService(i->id())->RemoveInfoBar(i->infobar()); 272 GetInfoBarService(i->id())->RemoveInfoBar(i->infobar());
267 273
268 // PermissionContextBase needs to know about the new ContentSetting value, 274 // PermissionContextBase needs to know about the new ContentSetting value,
269 // CONTENT_SETTING_DEFAULT being the value for nothing happened. The callers 275 // CONTENT_SETTING_DEFAULT being the value for nothing happened. The callers
270 // of ::OnPermissionSet passes { true, true } for allow, { true, false } for 276 // of ::OnPermissionSet passes { bool, GRANTED } for allow, { bool, DENIED }
271 // block and { false, * } for dismissed. The tuple being 277 // for block and { false, DISMISSED } for dismissed. The tuple being
272 // { update_content_setting, allowed }. 278 // { update_content_setting, decision }.
273 ContentSetting content_setting = CONTENT_SETTING_DEFAULT; 279 ContentSetting content_setting = CONTENT_SETTING_DEFAULT;
274 if (update_content_setting) { 280 if (decision == GRANTED)
275 content_setting = allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 281 content_setting = CONTENT_SETTING_ALLOW;
276 } 282 else if (decision == DENIED)
283 content_setting = CONTENT_SETTING_BLOCK;
raymes 2016/08/16 01:44:53 optionally: else DCHECK_EQ(DISMISSED, decision);
dominickn 2016/08/16 03:06:50 Done.
277 284
278 // Send out the permission notifications. 285 // Send out the permission notifications.
279 for (PendingInfobarRequests::iterator i = requests_to_notify.begin(); 286 for (PendingInfobarRequests::iterator i = requests_to_notify.begin();
280 i != requests_to_notify.end(); ++i) 287 i != requests_to_notify.end(); ++i)
281 i->RunCallback(content_setting); 288 i->RunCallback(content_setting);
282 289
283 // Remove the pending requests in reverse order. 290 // Remove the pending requests in reverse order.
284 for (int i = pending_requests_to_remove.size() - 1; i >= 0; --i) 291 for (int i = pending_requests_to_remove.size() - 1; i >= 0; --i)
285 pending_infobar_requests_.erase(pending_requests_to_remove[i]); 292 pending_infobar_requests_.erase(pending_requests_to_remove[i]);
286 } 293 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 content::Source<InfoBarService>(infobar_service))) { 392 content::Source<InfoBarService>(infobar_service))) {
386 registrar_.Remove(this, 393 registrar_.Remove(this,
387 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 394 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
388 content::Source<InfoBarService>(infobar_service)); 395 content::Source<InfoBarService>(infobar_service));
389 } 396 }
390 } 397 }
391 398
392 void PermissionQueueController::UpdateContentSetting( 399 void PermissionQueueController::UpdateContentSetting(
393 const GURL& requesting_frame, 400 const GURL& requesting_frame,
394 const GURL& embedder, 401 const GURL& embedder,
395 bool allowed) { 402 PermissionAction decision) {
396 if (requesting_frame.GetOrigin().SchemeIsFile()) { 403 if (requesting_frame.GetOrigin().SchemeIsFile()) {
397 // Chrome can be launched with --disable-web-security which allows 404 // Chrome can be launched with --disable-web-security which allows
398 // geolocation requests from file:// URLs. We don't want to store these 405 // geolocation requests from file:// URLs. We don't want to store these
399 // in the host content settings map. 406 // in the host content settings map.
400 return; 407 return;
401 } 408 }
402 409
403 ContentSetting content_setting = 410 ContentSetting content_setting =
404 allowed ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 411 (decision == GRANTED) ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
405 412
406 HostContentSettingsMapFactory::GetForProfile(profile_) 413 HostContentSettingsMapFactory::GetForProfile(profile_)
407 ->SetContentSettingDefaultScope( 414 ->SetContentSettingDefaultScope(
408 requesting_frame.GetOrigin(), embedder.GetOrigin(), 415 requesting_frame.GetOrigin(), embedder.GetOrigin(),
409 content_settings_type_, std::string(), content_setting); 416 content_settings_type_, std::string(), content_setting);
410 } 417 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698