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

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

Issue 2952003003: Log site engagement scores for permission actions (Closed)
Patch Set: address comments Created 3 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_request_manager.h" 5 #include "chrome/browser/permissions/permission_request_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/feature_list.h" 10 #include "base/feature_list.h"
(...skipping 13 matching lines...) Expand all
24 namespace { 24 namespace {
25 25
26 class CancelledRequest : public PermissionRequest { 26 class CancelledRequest : public PermissionRequest {
27 public: 27 public:
28 explicit CancelledRequest(PermissionRequest* cancelled) 28 explicit CancelledRequest(PermissionRequest* cancelled)
29 : icon_(cancelled->GetIconId()), 29 : icon_(cancelled->GetIconId()),
30 #if defined(OS_ANDROID) 30 #if defined(OS_ANDROID)
31 message_(cancelled->GetMessageText()), 31 message_(cancelled->GetMessageText()),
32 #endif 32 #endif
33 message_fragment_(cancelled->GetMessageTextFragment()), 33 message_fragment_(cancelled->GetMessageTextFragment()),
34 origin_(cancelled->GetOrigin()) { 34 origin_(cancelled->GetOrigin()),
35 request_type_(cancelled->GetPermissionRequestType()) {
35 } 36 }
36 ~CancelledRequest() override {} 37 ~CancelledRequest() override {}
37 38
38 IconId GetIconId() const override { return icon_; } 39 IconId GetIconId() const override { return icon_; }
39 #if defined(OS_ANDROID) 40 #if defined(OS_ANDROID)
40 base::string16 GetMessageText() const override { return message_; } 41 base::string16 GetMessageText() const override { return message_; }
41 #endif 42 #endif
42 base::string16 GetMessageTextFragment() const override { 43 base::string16 GetMessageTextFragment() const override {
43 return message_fragment_; 44 return message_fragment_;
44 } 45 }
45 GURL GetOrigin() const override { return origin_; } 46 GURL GetOrigin() const override { return origin_; }
46 47
47 // These are all no-ops since the placeholder is non-forwarding. 48 // These are all no-ops since the placeholder is non-forwarding.
48 void PermissionGranted() override {} 49 void PermissionGranted() override {}
49 void PermissionDenied() override {} 50 void PermissionDenied() override {}
50 void Cancelled() override {} 51 void Cancelled() override {}
51 52
52 void RequestFinished() override { delete this; } 53 void RequestFinished() override { delete this; }
53 54
55 PermissionRequestType GetPermissionRequestType() const override {
56 return request_type_;
57 }
58
54 private: 59 private:
55 IconId icon_; 60 IconId icon_;
56 #if defined(OS_ANDROID) 61 #if defined(OS_ANDROID)
57 base::string16 message_; 62 base::string16 message_;
58 #endif 63 #endif
59 base::string16 message_fragment_; 64 base::string16 message_fragment_;
60 GURL origin_; 65 GURL origin_;
66 PermissionRequestType request_type_;
61 }; 67 };
62 68
63 bool IsMessageTextEqual(PermissionRequest* a, 69 bool IsMessageTextEqual(PermissionRequest* a,
64 PermissionRequest* b) { 70 PermissionRequest* b) {
65 if (a == b) 71 if (a == b)
66 return true; 72 return true;
67 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && 73 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() &&
68 a->GetOrigin() == b->GetOrigin()) { 74 a->GetOrigin() == b->GetOrigin()) {
69 return true; 75 return true;
70 } 76 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 std::deque<PermissionRequest*>::iterator queued_requests_iter; 186 std::deque<PermissionRequest*>::iterator queued_requests_iter;
181 for (queued_requests_iter = queued_requests_.begin(); 187 for (queued_requests_iter = queued_requests_.begin();
182 queued_requests_iter != queued_requests_.end(); queued_requests_iter++) { 188 queued_requests_iter != queued_requests_.end(); queued_requests_iter++) {
183 if (*queued_requests_iter == request) { 189 if (*queued_requests_iter == request) {
184 RequestFinishedIncludingDuplicates(*queued_requests_iter); 190 RequestFinishedIncludingDuplicates(*queued_requests_iter);
185 queued_requests_.erase(queued_requests_iter); 191 queued_requests_.erase(queued_requests_iter);
186 return; 192 return;
187 } 193 }
188 } 194 }
189 195
190 std::vector<PermissionRequest*>::iterator requests_iter; 196 if (!requests_.empty() && requests_[0] == request) {
191 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); 197 // TODO(timloh): We should fix this at some point.
192 requests_iter++) { 198 // Grouped (mic+camera) requests are currently never cancelled.
raymes 2017/07/20 05:21:17 nit: these comments are probably in the reverse or
Timothy Loh 2017/07/20 06:09:33 Done.
193 if (*requests_iter != request) 199 DCHECK_EQ(static_cast<size_t>(1), requests_.size());
raymes 2017/07/20 05:21:17 nit: 1u? optional: may want to move this up above
Timothy Loh 2017/07/20 06:09:33 Don't think 1u works on 64 bit platforms? But we c
194 continue;
195 200
196 // We can simply erase the current entry in the request table if we aren't 201 // We can finalize the prompt if we aren't showing the dialog (because we
197 // showing the dialog (because we switched tabs with an active prompt), or 202 // switched tabs with an active prompt), or if we are showing it and it
198 // if we are showing it and it can accept the update. 203 // can accept the update.
199 if (!view_ || view_->CanAcceptRequestUpdate()) { 204 if (!view_ || view_->CanAcceptRequestUpdate()) {
200 // TODO(timloh): We should fix this at some point. 205 FinalizeBubble(PermissionAction::IGNORED);
201 // Grouped (mic+camera) requests are currently never cancelled.
202 DCHECK_EQ(static_cast<size_t>(1), requests_.size());
203
204 if (view_)
205 DeleteBubble();
206
207 RequestFinishedIncludingDuplicates(*requests_iter);
208 requests_.erase(requests_iter);
209
210 DequeueRequestsAndShowBubble();
211 return; 206 return;
212 } 207 }
213 208
214 // Cancel the existing request and replace it with a dummy. 209 // Cancel the existing request and replace it with a dummy.
215 PermissionRequest* cancelled_request = 210 PermissionRequest* cancelled_request = new CancelledRequest(request);
216 new CancelledRequest(*requests_iter); 211 RequestFinishedIncludingDuplicates(request);
217 RequestFinishedIncludingDuplicates(*requests_iter); 212 requests_[0] = cancelled_request;
218 *requests_iter = cancelled_request;
219 return; 213 return;
220 } 214 }
221 215
222 // Since |request| wasn't found in queued_requests_ or 216 // Since |request| wasn't found in queued_requests_ or
223 // requests_ it must have been marked as a duplicate. We can't search 217 // requests_ it must have been marked as a duplicate. We can't search
224 // duplicate_requests_ by value, so instead use GetExistingRequest to find the 218 // duplicate_requests_ by value, so instead use GetExistingRequest to find the
225 // key (request it was duped against), and iterate through duplicates of that. 219 // key (request it was duped against), and iterate through duplicates of that.
226 PermissionRequest* existing_request = GetExistingRequest(request); 220 PermissionRequest* existing_request = GetExistingRequest(request);
227 auto range = duplicate_requests_.equal_range(existing_request); 221 auto range = duplicate_requests_.equal_range(existing_request);
228 for (auto it = range.first; it != range.second; ++it) { 222 for (auto it = range.first; it != range.second; ++it) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 316
323 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() { 317 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() {
324 return requests_; 318 return requests_;
325 } 319 }
326 320
327 void PermissionRequestManager::TogglePersist(bool new_value) { 321 void PermissionRequestManager::TogglePersist(bool new_value) {
328 persist_ = new_value; 322 persist_ = new_value;
329 } 323 }
330 324
331 void PermissionRequestManager::Accept() { 325 void PermissionRequestManager::Accept() {
332 PermissionUmaUtil::PermissionPromptAccepted(requests_);
333
334 std::vector<PermissionRequest*>::iterator requests_iter; 326 std::vector<PermissionRequest*>::iterator requests_iter;
335 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); 327 for (requests_iter = requests_.begin(); requests_iter != requests_.end();
336 requests_iter++) { 328 requests_iter++) {
337 PermissionGrantedIncludingDuplicates(*requests_iter); 329 PermissionGrantedIncludingDuplicates(*requests_iter);
338 } 330 }
339 FinalizeBubble(); 331 FinalizeBubble(PermissionAction::GRANTED);
340 } 332 }
341 333
342 void PermissionRequestManager::Deny() { 334 void PermissionRequestManager::Deny() {
343 PermissionUmaUtil::PermissionPromptDenied(requests_);
344
345 std::vector<PermissionRequest*>::iterator requests_iter; 335 std::vector<PermissionRequest*>::iterator requests_iter;
346 for (requests_iter = requests_.begin(); 336 for (requests_iter = requests_.begin();
347 requests_iter != requests_.end(); 337 requests_iter != requests_.end();
348 requests_iter++) { 338 requests_iter++) {
349 PermissionDeniedIncludingDuplicates(*requests_iter); 339 PermissionDeniedIncludingDuplicates(*requests_iter);
350 } 340 }
351 FinalizeBubble(); 341 FinalizeBubble(PermissionAction::DENIED);
352 } 342 }
353 343
354 void PermissionRequestManager::Closing() { 344 void PermissionRequestManager::Closing() {
355 #if defined(OS_MACOSX) 345 #if defined(OS_MACOSX)
356 // Mac calls this whenever you press Esc. 346 // Mac calls this whenever you press Esc.
357 if (!view_) 347 if (!view_)
358 return; 348 return;
359 #endif 349 #endif
350
360 std::vector<PermissionRequest*>::iterator requests_iter; 351 std::vector<PermissionRequest*>::iterator requests_iter;
361 for (requests_iter = requests_.begin(); 352 for (requests_iter = requests_.begin();
362 requests_iter != requests_.end(); 353 requests_iter != requests_.end();
363 requests_iter++) { 354 requests_iter++) {
364 CancelledIncludingDuplicates(*requests_iter); 355 CancelledIncludingDuplicates(*requests_iter);
365 } 356 }
366 FinalizeBubble(); 357 FinalizeBubble(PermissionAction::DISMISSED);
367 } 358 }
368 359
369 void PermissionRequestManager::ScheduleShowBubble() { 360 void PermissionRequestManager::ScheduleShowBubble() {
370 // ::ScheduleShowBubble() will be called again when the main frame will be 361 // ::ScheduleShowBubble() will be called again when the main frame will be
371 // loaded. 362 // loaded.
372 if (!main_frame_has_fully_loaded_) 363 if (!main_frame_has_fully_loaded_)
373 return; 364 return;
374 365
375 content::BrowserThread::PostTask( 366 content::BrowserThread::PostTask(
376 content::BrowserThread::UI, FROM_HERE, 367 content::BrowserThread::UI, FROM_HERE,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 // If in testing mode, automatically respond to the bubble that was shown. 403 // If in testing mode, automatically respond to the bubble that was shown.
413 if (auto_response_for_test_ != NONE) 404 if (auto_response_for_test_ != NONE)
414 DoAutoResponseForTesting(); 405 DoAutoResponseForTesting();
415 } 406 }
416 407
417 void PermissionRequestManager::DeleteBubble() { 408 void PermissionRequestManager::DeleteBubble() {
418 DCHECK(view_); 409 DCHECK(view_);
419 view_.reset(); 410 view_.reset();
420 } 411 }
421 412
422 void PermissionRequestManager::FinalizeBubble() { 413 void PermissionRequestManager::FinalizeBubble(
423 DCHECK(view_); 414 PermissionAction permission_action) {
raymes 2017/07/20 05:21:17 nit: I think it would be useful to hoist this DCHE
Timothy Loh 2017/07/20 06:09:33 Done.
424 DCHECK(!requests_.empty()); 415 DCHECK(!requests_.empty());
425 416
426 DeleteBubble(); 417 if (view_)
418 DeleteBubble();
419
420 PermissionUmaUtil::PermissionPromptResolved(requests_, web_contents(),
421 permission_action);
427 422
428 std::vector<PermissionRequest*>::iterator requests_iter; 423 std::vector<PermissionRequest*>::iterator requests_iter;
429 for (requests_iter = requests_.begin(); 424 for (requests_iter = requests_.begin();
430 requests_iter != requests_.end(); 425 requests_iter != requests_.end();
431 requests_iter++) { 426 requests_iter++) {
432 RequestFinishedIncludingDuplicates(*requests_iter); 427 RequestFinishedIncludingDuplicates(*requests_iter);
433 } 428 }
434 requests_.clear(); 429 requests_.clear();
435 if (queued_requests_.size()) 430 if (queued_requests_.size())
436 DequeueRequestsAndShowBubble(); 431 DequeueRequestsAndShowBubble();
437 } 432 }
438 433
439 void PermissionRequestManager::CleanUpRequests() { 434 void PermissionRequestManager::CleanUpRequests() {
440 std::deque<PermissionRequest*>::iterator requests_iter; 435 std::deque<PermissionRequest*>::iterator requests_iter;
441 for (requests_iter = queued_requests_.begin(); 436 for (requests_iter = queued_requests_.begin();
442 requests_iter != queued_requests_.end(); 437 requests_iter != queued_requests_.end();
443 requests_iter++) { 438 requests_iter++) {
444 RequestFinishedIncludingDuplicates(*requests_iter); 439 RequestFinishedIncludingDuplicates(*requests_iter);
445 } 440 }
446 queued_requests_.clear(); 441 queued_requests_.clear();
447 442
448 if (view_) 443 if (view_)
449 FinalizeBubble(); 444 FinalizeBubble(PermissionAction::IGNORED);
450 } 445 }
451 446
452 PermissionRequest* PermissionRequestManager::GetExistingRequest( 447 PermissionRequest* PermissionRequestManager::GetExistingRequest(
453 PermissionRequest* request) { 448 PermissionRequest* request) {
454 for (PermissionRequest* existing_request : requests_) 449 for (PermissionRequest* existing_request : requests_)
455 if (IsMessageTextEqual(existing_request, request)) 450 if (IsMessageTextEqual(existing_request, request))
456 return existing_request; 451 return existing_request;
457 for (PermissionRequest* existing_request : queued_requests_) 452 for (PermissionRequest* existing_request : queued_requests_)
458 if (IsMessageTextEqual(existing_request, request)) 453 if (IsMessageTextEqual(existing_request, request))
459 return existing_request; 454 return existing_request;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 case DENY_ALL: 526 case DENY_ALL:
532 Deny(); 527 Deny();
533 break; 528 break;
534 case DISMISS: 529 case DISMISS:
535 Closing(); 530 Closing();
536 break; 531 break;
537 case NONE: 532 case NONE:
538 NOTREACHED(); 533 NOTREACHED();
539 } 534 }
540 } 535 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698