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 |