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

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

Issue 2952003003: Log site engagement scores for permission actions (Closed)
Patch Set: add test 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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 if (*requests_iter != request) 199 if (*requests_iter != request)
194 continue; 200 continue;
195 201
196 // We can simply erase the current entry in the request table if we aren't 202 // We can simply erase the current entry in the request table if we aren't
197 // showing the dialog (because we switched tabs with an active prompt), or 203 // showing the dialog (because we switched tabs with an active prompt), or
198 // if we are showing it and it can accept the update. 204 // if we are showing it and it can accept the update.
199 if (!view_ || view_->CanAcceptRequestUpdate()) { 205 if (!view_ || view_->CanAcceptRequestUpdate()) {
200 // TODO(timloh): We should fix this at some point. 206 // TODO(timloh): We should fix this at some point.
201 // Grouped (mic+camera) requests are currently never cancelled. 207 // Grouped (mic+camera) requests are currently never cancelled.
202 DCHECK_EQ(static_cast<size_t>(1), requests_.size()); 208 DCHECK_EQ(static_cast<size_t>(1), requests_.size());
209 PermissionUmaUtil::PermissionPromptIgnored(requests_, web_contents());
203 210
204 if (view_) 211 if (view_)
205 DeleteBubble(); 212 DeleteBubble();
206 213
207 RequestFinishedIncludingDuplicates(*requests_iter); 214 RequestFinishedIncludingDuplicates(*requests_iter);
208 requests_.erase(requests_iter); 215 requests_.erase(requests_iter);
209 216
210 DequeueRequestsAndShowBubble(); 217 DequeueRequestsAndShowBubble();
211 return; 218 return;
212 } 219 }
213 220
214 // Cancel the existing request and replace it with a dummy. 221 // Cancel the existing request and replace it with a dummy.
215 PermissionRequest* cancelled_request = 222 PermissionRequest* cancelled_request =
216 new CancelledRequest(*requests_iter); 223 new CancelledRequest(*requests_iter);
217 RequestFinishedIncludingDuplicates(*requests_iter); 224 RequestFinishedIncludingDuplicates(*requests_iter);
218 *requests_iter = cancelled_request; 225 *requests_iter = cancelled_request;
219 return; 226 return;
220 } 227 }
raymes 2017/07/20 03:37:13 Since this should only be called with a single req
Timothy Loh 2017/07/20 04:59:54 Done, but I left CancelledRequest in (if CanAccept
221 228
222 // Since |request| wasn't found in queued_requests_ or 229 // Since |request| wasn't found in queued_requests_ or
223 // requests_ it must have been marked as a duplicate. We can't search 230 // 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 231 // duplicate_requests_ by value, so instead use GetExistingRequest to find the
225 // key (request it was duped against), and iterate through duplicates of that. 232 // key (request it was duped against), and iterate through duplicates of that.
226 PermissionRequest* existing_request = GetExistingRequest(request); 233 PermissionRequest* existing_request = GetExistingRequest(request);
227 auto range = duplicate_requests_.equal_range(existing_request); 234 auto range = duplicate_requests_.equal_range(existing_request);
228 for (auto it = range.first; it != range.second; ++it) { 235 for (auto it = range.first; it != range.second; ++it) {
229 if (request == it->second) { 236 if (request == it->second) {
230 it->second->RequestFinished(); 237 it->second->RequestFinished();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 } 289 }
283 290
284 void PermissionRequestManager::DidFinishNavigation( 291 void PermissionRequestManager::DidFinishNavigation(
285 content::NavigationHandle* navigation_handle) { 292 content::NavigationHandle* navigation_handle) {
286 if (!navigation_handle->IsInMainFrame() || 293 if (!navigation_handle->IsInMainFrame() ||
287 !navigation_handle->HasCommitted() || 294 !navigation_handle->HasCommitted() ||
288 navigation_handle->IsSameDocument()) { 295 navigation_handle->IsSameDocument()) {
289 return; 296 return;
290 } 297 }
291 298
292 CleanUpRequests(); 299 CleanUpRequests();
raymes 2017/07/20 03:37:13 nit: could we rename this to something that indica
Timothy Loh 2017/07/20 04:59:54 Ack, will do this in a separate patch. I want to c
293 main_frame_has_fully_loaded_ = false; 300 main_frame_has_fully_loaded_ = false;
294 } 301 }
295 302
296 void PermissionRequestManager::DocumentOnLoadCompletedInMainFrame() { 303 void PermissionRequestManager::DocumentOnLoadCompletedInMainFrame() {
297 main_frame_has_fully_loaded_ = true; 304 main_frame_has_fully_loaded_ = true;
298 // This is scheduled because while all calls to the browser have been 305 // This is scheduled because while all calls to the browser have been
299 // issued at DOMContentLoaded, they may be bouncing around in scheduled 306 // issued at DOMContentLoaded, they may be bouncing around in scheduled
300 // callbacks finding the UI thread still. This makes sure we allow those 307 // callbacks finding the UI thread still. This makes sure we allow those
301 // scheduled calls to AddRequest to complete before we show the page-load 308 // scheduled calls to AddRequest to complete before we show the page-load
302 // permissions bubble. 309 // permissions bubble.
(...skipping 19 matching lines...) Expand all
322 329
323 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() { 330 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() {
324 return requests_; 331 return requests_;
325 } 332 }
326 333
327 void PermissionRequestManager::TogglePersist(bool new_value) { 334 void PermissionRequestManager::TogglePersist(bool new_value) {
328 persist_ = new_value; 335 persist_ = new_value;
329 } 336 }
330 337
331 void PermissionRequestManager::Accept() { 338 void PermissionRequestManager::Accept() {
332 PermissionUmaUtil::PermissionPromptAccepted(requests_); 339 PermissionUmaUtil::PermissionPromptAccepted(requests_, web_contents());
333 340
334 std::vector<PermissionRequest*>::iterator requests_iter; 341 std::vector<PermissionRequest*>::iterator requests_iter;
335 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); 342 for (requests_iter = requests_.begin(); requests_iter != requests_.end();
336 requests_iter++) { 343 requests_iter++) {
337 PermissionGrantedIncludingDuplicates(*requests_iter); 344 PermissionGrantedIncludingDuplicates(*requests_iter);
338 } 345 }
339 FinalizeBubble(); 346 FinalizeBubble();
340 } 347 }
341 348
342 void PermissionRequestManager::Deny() { 349 void PermissionRequestManager::Deny() {
343 PermissionUmaUtil::PermissionPromptDenied(requests_); 350 PermissionUmaUtil::PermissionPromptDenied(requests_, web_contents());
344 351
345 std::vector<PermissionRequest*>::iterator requests_iter; 352 std::vector<PermissionRequest*>::iterator requests_iter;
346 for (requests_iter = requests_.begin(); 353 for (requests_iter = requests_.begin();
347 requests_iter != requests_.end(); 354 requests_iter != requests_.end();
348 requests_iter++) { 355 requests_iter++) {
349 PermissionDeniedIncludingDuplicates(*requests_iter); 356 PermissionDeniedIncludingDuplicates(*requests_iter);
350 } 357 }
351 FinalizeBubble(); 358 FinalizeBubble();
352 } 359 }
353 360
354 void PermissionRequestManager::Closing() { 361 void PermissionRequestManager::Closing() {
355 #if defined(OS_MACOSX) 362 #if defined(OS_MACOSX)
356 // Mac calls this whenever you press Esc. 363 // Mac calls this whenever you press Esc.
357 if (!view_) 364 if (!view_)
358 return; 365 return;
359 #endif 366 #endif
367
368 PermissionUmaUtil::PermissionPromptDismissed(requests_, web_contents());
369
360 std::vector<PermissionRequest*>::iterator requests_iter; 370 std::vector<PermissionRequest*>::iterator requests_iter;
361 for (requests_iter = requests_.begin(); 371 for (requests_iter = requests_.begin();
362 requests_iter != requests_.end(); 372 requests_iter != requests_.end();
363 requests_iter++) { 373 requests_iter++) {
364 CancelledIncludingDuplicates(*requests_iter); 374 CancelledIncludingDuplicates(*requests_iter);
365 } 375 }
366 FinalizeBubble(); 376 FinalizeBubble();
367 } 377 }
368 378
369 void PermissionRequestManager::ScheduleShowBubble() { 379 void PermissionRequestManager::ScheduleShowBubble() {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 448
439 void PermissionRequestManager::CleanUpRequests() { 449 void PermissionRequestManager::CleanUpRequests() {
440 std::deque<PermissionRequest*>::iterator requests_iter; 450 std::deque<PermissionRequest*>::iterator requests_iter;
441 for (requests_iter = queued_requests_.begin(); 451 for (requests_iter = queued_requests_.begin();
442 requests_iter != queued_requests_.end(); 452 requests_iter != queued_requests_.end();
443 requests_iter++) { 453 requests_iter++) {
444 RequestFinishedIncludingDuplicates(*requests_iter); 454 RequestFinishedIncludingDuplicates(*requests_iter);
445 } 455 }
446 queued_requests_.clear(); 456 queued_requests_.clear();
447 457
448 if (view_) 458 if (view_) {
459 PermissionUmaUtil::PermissionPromptIgnored(requests_, web_contents());
449 FinalizeBubble(); 460 FinalizeBubble();
461 }
450 } 462 }
451 463
452 PermissionRequest* PermissionRequestManager::GetExistingRequest( 464 PermissionRequest* PermissionRequestManager::GetExistingRequest(
453 PermissionRequest* request) { 465 PermissionRequest* request) {
454 for (PermissionRequest* existing_request : requests_) 466 for (PermissionRequest* existing_request : requests_)
455 if (IsMessageTextEqual(existing_request, request)) 467 if (IsMessageTextEqual(existing_request, request))
456 return existing_request; 468 return existing_request;
457 for (PermissionRequest* existing_request : queued_requests_) 469 for (PermissionRequest* existing_request : queued_requests_)
458 if (IsMessageTextEqual(existing_request, request)) 470 if (IsMessageTextEqual(existing_request, request))
459 return existing_request; 471 return existing_request;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 case DENY_ALL: 543 case DENY_ALL:
532 Deny(); 544 Deny();
533 break; 545 break;
534 case DISMISS: 546 case DISMISS:
535 Closing(); 547 Closing();
536 break; 548 break;
537 case NONE: 549 case NONE:
538 NOTREACHED(); 550 NOTREACHED();
539 } 551 }
540 } 552 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698