Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 12 matching lines...) Expand all Loading... | |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 class CancelledRequest : public PermissionRequest { | 25 class CancelledRequest : public PermissionRequest { |
| 26 public: | 26 public: |
| 27 explicit CancelledRequest(PermissionRequest* cancelled) | 27 explicit CancelledRequest(PermissionRequest* cancelled) |
| 28 : icon_(cancelled->GetIconId()), | 28 : icon_(cancelled->GetIconId()), |
| 29 #if defined(OS_ANDROID) | 29 #if defined(OS_ANDROID) |
| 30 message_(cancelled->GetMessageText()), | 30 message_(cancelled->GetMessageText()), |
| 31 #endif | 31 #endif |
| 32 message_fragment_(cancelled->GetMessageTextFragment()), | 32 message_fragment_(cancelled->GetMessageTextFragment()), |
| 33 origin_(cancelled->GetOrigin()) { | 33 origin_(cancelled->GetOrigin()), |
| 34 request_type_(cancelled->GetPermissionRequestType()) { | |
| 34 } | 35 } |
| 35 ~CancelledRequest() override {} | 36 ~CancelledRequest() override {} |
| 36 | 37 |
| 37 IconId GetIconId() const override { return icon_; } | 38 IconId GetIconId() const override { return icon_; } |
| 38 #if defined(OS_ANDROID) | 39 #if defined(OS_ANDROID) |
| 39 base::string16 GetMessageText() const override { return message_; } | 40 base::string16 GetMessageText() const override { return message_; } |
| 40 #endif | 41 #endif |
| 41 base::string16 GetMessageTextFragment() const override { | 42 base::string16 GetMessageTextFragment() const override { |
| 42 return message_fragment_; | 43 return message_fragment_; |
| 43 } | 44 } |
| 44 GURL GetOrigin() const override { return origin_; } | 45 GURL GetOrigin() const override { return origin_; } |
| 45 | 46 |
| 46 // These are all no-ops since the placeholder is non-forwarding. | 47 // These are all no-ops since the placeholder is non-forwarding. |
| 47 void PermissionGranted() override {} | 48 void PermissionGranted() override {} |
| 48 void PermissionDenied() override {} | 49 void PermissionDenied() override {} |
| 49 void Cancelled() override {} | 50 void Cancelled() override {} |
| 50 | 51 |
| 51 void RequestFinished() override { delete this; } | 52 void RequestFinished() override { delete this; } |
| 52 | 53 |
| 54 PermissionRequestType GetPermissionRequestType() const override { | |
| 55 return request_type_; | |
| 56 } | |
| 57 | |
| 53 private: | 58 private: |
| 54 IconId icon_; | 59 IconId icon_; |
| 55 #if defined(OS_ANDROID) | 60 #if defined(OS_ANDROID) |
| 56 base::string16 message_; | 61 base::string16 message_; |
| 57 #endif | 62 #endif |
| 58 base::string16 message_fragment_; | 63 base::string16 message_fragment_; |
| 59 GURL origin_; | 64 GURL origin_; |
| 65 PermissionRequestType request_type_; | |
| 60 }; | 66 }; |
| 61 | 67 |
| 62 bool IsMessageTextEqual(PermissionRequest* a, | 68 bool IsMessageTextEqual(PermissionRequest* a, |
| 63 PermissionRequest* b) { | 69 PermissionRequest* b) { |
| 64 if (a == b) | 70 if (a == b) |
| 65 return true; | 71 return true; |
| 66 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && | 72 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && |
| 67 a->GetOrigin() == b->GetOrigin()) { | 73 a->GetOrigin() == b->GetOrigin()) { |
| 68 return true; | 74 return true; |
| 69 } | 75 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 persist_(true), | 120 persist_(true), |
| 115 auto_response_for_test_(NONE), | 121 auto_response_for_test_(NONE), |
| 116 weak_factory_(this) { | 122 weak_factory_(this) { |
| 117 #if defined(OS_ANDROID) | 123 #if defined(OS_ANDROID) |
| 118 view_ = view_factory_.Run(web_contents); | 124 view_ = view_factory_.Run(web_contents); |
| 119 view_->SetDelegate(this); | 125 view_->SetDelegate(this); |
| 120 #endif | 126 #endif |
| 121 } | 127 } |
| 122 | 128 |
| 123 PermissionRequestManager::~PermissionRequestManager() { | 129 PermissionRequestManager::~PermissionRequestManager() { |
| 130 if (!requests_.empty()) | |
| 131 PermissionUmaUtil::PermissionPromptIgnored(requests_, web_contents()); | |
|
raymes
2017/07/06 05:03:15
I think by this stage the requests may be empty.
Timothy Loh
2017/07/19 06:03:43
Moved to CleanUpRequests
| |
| 132 | |
| 124 if (view_ != NULL) | 133 if (view_ != NULL) |
| 125 view_->SetDelegate(NULL); | 134 view_->SetDelegate(NULL); |
| 126 | 135 |
| 127 for (PermissionRequest* request : requests_) | 136 for (PermissionRequest* request : requests_) |
| 128 request->RequestFinished(); | 137 request->RequestFinished(); |
| 129 for (PermissionRequest* request : queued_requests_) | 138 for (PermissionRequest* request : queued_requests_) |
| 130 request->RequestFinished(); | 139 request->RequestFinished(); |
| 131 for (const auto& entry : duplicate_requests_) | 140 for (const auto& entry : duplicate_requests_) |
| 132 entry.second->RequestFinished(); | 141 entry.second->RequestFinished(); |
| 133 } | 142 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 std::vector<PermissionRequest*>::iterator requests_iter; | 202 std::vector<PermissionRequest*>::iterator requests_iter; |
| 194 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); | 203 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); |
| 195 requests_iter++) { | 204 requests_iter++) { |
| 196 if (*requests_iter != request) | 205 if (*requests_iter != request) |
| 197 continue; | 206 continue; |
| 198 | 207 |
| 199 // We can simply erase the current entry in the request table if we aren't | 208 // We can simply erase the current entry in the request table if we aren't |
| 200 // showing the dialog, or if we are showing it and it can accept the update. | 209 // showing the dialog, or if we are showing it and it can accept the update. |
| 201 bool can_erase = !view_ || view_->CanAcceptRequestUpdate(); | 210 bool can_erase = !view_ || view_->CanAcceptRequestUpdate(); |
| 202 if (can_erase) { | 211 if (can_erase) { |
| 212 // Grouped (mic+camera) requests are currently never cancelled. | |
| 213 DCHECK_EQ(static_cast<size_t>(1), requests_.size()); | |
| 214 PermissionUmaUtil::PermissionPromptIgnored(requests_, web_contents()); | |
| 215 | |
| 203 RequestFinishedIncludingDuplicates(*requests_iter); | 216 RequestFinishedIncludingDuplicates(*requests_iter); |
| 204 requests_.erase(requests_iter); | 217 requests_.erase(requests_iter); |
| 205 | 218 |
| 206 if (view_) { | 219 if (view_) { |
| 207 view_->Hide(); | 220 view_->Hide(); |
| 208 // Will redraw the bubble if it is being shown. | 221 // Will redraw the bubble if it is being shown. |
| 209 DequeueRequestsAndShowBubble(); | 222 DequeueRequestsAndShowBubble(); |
|
Timothy Loh
2017/06/22 08:02:20
I think this results in us counting ignores for qu
| |
| 210 } | 223 } |
| 211 return; | 224 return; |
| 212 } | 225 } |
| 213 | 226 |
| 214 // Cancel the existing request and replace it with a dummy. | 227 // Cancel the existing request and replace it with a dummy. |
| 215 PermissionRequest* cancelled_request = | 228 PermissionRequest* cancelled_request = |
| 216 new CancelledRequest(*requests_iter); | 229 new CancelledRequest(*requests_iter); |
| 217 RequestFinishedIncludingDuplicates(*requests_iter); | 230 RequestFinishedIncludingDuplicates(*requests_iter); |
| 218 *requests_iter = cancelled_request; | 231 *requests_iter = cancelled_request; |
| 219 return; | 232 return; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 332 | 345 |
| 333 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() { | 346 const std::vector<PermissionRequest*>& PermissionRequestManager::Requests() { |
| 334 return requests_; | 347 return requests_; |
| 335 } | 348 } |
| 336 | 349 |
| 337 void PermissionRequestManager::TogglePersist(bool new_value) { | 350 void PermissionRequestManager::TogglePersist(bool new_value) { |
| 338 persist_ = new_value; | 351 persist_ = new_value; |
| 339 } | 352 } |
| 340 | 353 |
| 341 void PermissionRequestManager::Accept() { | 354 void PermissionRequestManager::Accept() { |
| 342 PermissionUmaUtil::PermissionPromptAccepted(requests_); | 355 PermissionUmaUtil::PermissionPromptAccepted(requests_, web_contents()); |
| 343 | 356 |
| 344 std::vector<PermissionRequest*>::iterator requests_iter; | 357 std::vector<PermissionRequest*>::iterator requests_iter; |
| 345 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); | 358 for (requests_iter = requests_.begin(); requests_iter != requests_.end(); |
| 346 requests_iter++) { | 359 requests_iter++) { |
| 347 PermissionGrantedIncludingDuplicates(*requests_iter); | 360 PermissionGrantedIncludingDuplicates(*requests_iter); |
| 348 } | 361 } |
| 349 FinalizeBubble(); | 362 FinalizeBubble(); |
| 350 } | 363 } |
| 351 | 364 |
| 352 void PermissionRequestManager::Deny() { | 365 void PermissionRequestManager::Deny() { |
| 353 PermissionUmaUtil::PermissionPromptDenied(requests_); | 366 PermissionUmaUtil::PermissionPromptDenied(requests_, web_contents()); |
| 354 | 367 |
| 355 std::vector<PermissionRequest*>::iterator requests_iter; | 368 std::vector<PermissionRequest*>::iterator requests_iter; |
| 356 for (requests_iter = requests_.begin(); | 369 for (requests_iter = requests_.begin(); |
| 357 requests_iter != requests_.end(); | 370 requests_iter != requests_.end(); |
| 358 requests_iter++) { | 371 requests_iter++) { |
| 359 PermissionDeniedIncludingDuplicates(*requests_iter); | 372 PermissionDeniedIncludingDuplicates(*requests_iter); |
| 360 } | 373 } |
| 361 FinalizeBubble(); | 374 FinalizeBubble(); |
| 362 } | 375 } |
| 363 | 376 |
| 364 void PermissionRequestManager::Closing() { | 377 void PermissionRequestManager::Closing() { |
| 378 PermissionUmaUtil::PermissionPromptDismissed(requests_, web_contents()); | |
| 379 | |
| 365 std::vector<PermissionRequest*>::iterator requests_iter; | 380 std::vector<PermissionRequest*>::iterator requests_iter; |
| 366 for (requests_iter = requests_.begin(); | 381 for (requests_iter = requests_.begin(); |
| 367 requests_iter != requests_.end(); | 382 requests_iter != requests_.end(); |
| 368 requests_iter++) { | 383 requests_iter++) { |
| 369 CancelledIncludingDuplicates(*requests_iter); | 384 CancelledIncludingDuplicates(*requests_iter); |
| 370 } | 385 } |
| 371 FinalizeBubble(); | 386 FinalizeBubble(); |
| 372 } | 387 } |
| 373 | 388 |
| 374 void PermissionRequestManager::ScheduleShowBubble() { | 389 void PermissionRequestManager::ScheduleShowBubble() { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 526 case DENY_ALL: | 541 case DENY_ALL: |
| 527 Deny(); | 542 Deny(); |
| 528 break; | 543 break; |
| 529 case DISMISS: | 544 case DISMISS: |
| 530 Closing(); | 545 Closing(); |
| 531 break; | 546 break; |
| 532 case NONE: | 547 case NONE: |
| 533 NOTREACHED(); | 548 NOTREACHED(); |
| 534 } | 549 } |
| 535 } | 550 } |
| OLD | NEW |