| 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/metrics/user_metrics_action.h" | 10 #include "base/metrics/user_metrics_action.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "chrome/browser/permissions/permission_request.h" |
| 12 #include "chrome/browser/permissions/permission_uma_util.h" | 13 #include "chrome/browser/permissions/permission_uma_util.h" |
| 13 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" | |
| 14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
| 15 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 16 #include "content/public/browser/navigation_details.h" | 16 #include "content/public/browser/navigation_details.h" |
| 17 #include "content/public/browser/user_metrics.h" | 17 #include "content/public/browser/user_metrics.h" |
| 18 #include "url/origin.h" | 18 #include "url/origin.h" |
| 19 | 19 |
| 20 #if !defined(OS_ANDROID) | 20 #if !defined(OS_ANDROID) |
| 21 #include "chrome/browser/ui/browser_finder.h" | 21 #include "chrome/browser/ui/browser_finder.h" |
| 22 #endif | 22 #endif |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 class CancelledRequest : public PermissionBubbleRequest { | 26 class CancelledRequest : public PermissionRequest { |
| 27 public: | 27 public: |
| 28 explicit CancelledRequest(PermissionBubbleRequest* cancelled) | 28 explicit CancelledRequest(PermissionRequest* cancelled) |
| 29 : icon_(cancelled->GetIconId()), | 29 : icon_(cancelled->GetIconId()), |
| 30 message_text_(cancelled->GetMessageText()), | 30 message_text_(cancelled->GetMessageText()), |
| 31 message_fragment_(cancelled->GetMessageTextFragment()), | 31 message_fragment_(cancelled->GetMessageTextFragment()), |
| 32 origin_(cancelled->GetOrigin()) {} | 32 origin_(cancelled->GetOrigin()) {} |
| 33 ~CancelledRequest() override {} | 33 ~CancelledRequest() override {} |
| 34 | 34 |
| 35 int GetIconId() const override { return icon_; } | 35 int GetIconId() const override { return icon_; } |
| 36 base::string16 GetMessageText() const override { return message_text_; } | 36 base::string16 GetMessageText() const override { return message_text_; } |
| 37 base::string16 GetMessageTextFragment() const override { | 37 base::string16 GetMessageTextFragment() const override { |
| 38 return message_fragment_; | 38 return message_fragment_; |
| 39 } | 39 } |
| 40 GURL GetOrigin() const override { return origin_; } | 40 GURL GetOrigin() const override { return origin_; } |
| 41 | 41 |
| 42 // These are all no-ops since the placeholder is non-forwarding. | 42 // These are all no-ops since the placeholder is non-forwarding. |
| 43 void PermissionGranted() override {} | 43 void PermissionGranted() override {} |
| 44 void PermissionDenied() override {} | 44 void PermissionDenied() override {} |
| 45 void Cancelled() override {} | 45 void Cancelled() override {} |
| 46 | 46 |
| 47 void RequestFinished() override { delete this; } | 47 void RequestFinished() override { delete this; } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 int icon_; | 50 int icon_; |
| 51 base::string16 message_text_; | 51 base::string16 message_text_; |
| 52 base::string16 message_fragment_; | 52 base::string16 message_fragment_; |
| 53 GURL origin_; | 53 GURL origin_; |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 bool IsMessageTextEqual(PermissionBubbleRequest* a, | 56 bool IsMessageTextEqual(PermissionRequest* a, |
| 57 PermissionBubbleRequest* b) { | 57 PermissionRequest* b) { |
| 58 if (a == b) | 58 if (a == b) |
| 59 return true; | 59 return true; |
| 60 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && | 60 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && |
| 61 a->GetOrigin() == b->GetOrigin()) { | 61 a->GetOrigin() == b->GetOrigin()) { |
| 62 return true; | 62 return true; |
| 63 } | 63 } |
| 64 return false; | 64 return false; |
| 65 } | 65 } |
| 66 | 66 |
| 67 } // namespace | 67 } // namespace |
| (...skipping 19 matching lines...) Expand all Loading... |
| 87 view_(nullptr), | 87 view_(nullptr), |
| 88 main_frame_has_fully_loaded_(false), | 88 main_frame_has_fully_loaded_(false), |
| 89 auto_response_for_test_(NONE), | 89 auto_response_for_test_(NONE), |
| 90 weak_factory_(this) { | 90 weak_factory_(this) { |
| 91 } | 91 } |
| 92 | 92 |
| 93 PermissionRequestManager::~PermissionRequestManager() { | 93 PermissionRequestManager::~PermissionRequestManager() { |
| 94 if (view_ != NULL) | 94 if (view_ != NULL) |
| 95 view_->SetDelegate(NULL); | 95 view_->SetDelegate(NULL); |
| 96 | 96 |
| 97 for (PermissionBubbleRequest* request : requests_) | 97 for (PermissionRequest* request : requests_) |
| 98 request->RequestFinished(); | 98 request->RequestFinished(); |
| 99 for (PermissionBubbleRequest* request : queued_requests_) | 99 for (PermissionRequest* request : queued_requests_) |
| 100 request->RequestFinished(); | 100 request->RequestFinished(); |
| 101 for (PermissionBubbleRequest* request : queued_frame_requests_) | 101 for (PermissionRequest* request : queued_frame_requests_) |
| 102 request->RequestFinished(); | 102 request->RequestFinished(); |
| 103 for (const auto& entry : duplicate_requests_) | 103 for (const auto& entry : duplicate_requests_) |
| 104 entry.second->RequestFinished(); | 104 entry.second->RequestFinished(); |
| 105 } | 105 } |
| 106 | 106 |
| 107 void PermissionRequestManager::AddRequest(PermissionBubbleRequest* request) { | 107 void PermissionRequestManager::AddRequest(PermissionRequest* request) { |
| 108 // TODO(mlamouri): change the UMA to no longer mention bubbles. |
| 108 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); | 109 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); |
| 110 |
| 109 // TODO(gbillock): is there a race between an early request on a | 111 // TODO(gbillock): is there a race between an early request on a |
| 110 // newly-navigated page and the to-be-cleaned-up requests on the previous | 112 // newly-navigated page and the to-be-cleaned-up requests on the previous |
| 111 // page? We should maybe listen to DidStartNavigationToPendingEntry (and | 113 // page? We should maybe listen to DidStartNavigationToPendingEntry (and |
| 112 // any other renderer-side nav initiations?). Double-check this for | 114 // any other renderer-side nav initiations?). Double-check this for |
| 113 // correct behavior on interstitials -- we probably want to basically queue | 115 // correct behavior on interstitials -- we probably want to basically queue |
| 114 // any request for which GetVisibleURL != GetLastCommittedURL. | 116 // any request for which GetVisibleURL != GetLastCommittedURL. |
| 115 request_url_ = web_contents()->GetLastCommittedURL(); | 117 request_url_ = web_contents()->GetLastCommittedURL(); |
| 116 bool is_main_frame = url::Origin(request_url_) | 118 bool is_main_frame = url::Origin(request_url_) |
| 117 .IsSameOriginWith(url::Origin(request->GetOrigin())); | 119 .IsSameOriginWith(url::Origin(request->GetOrigin())); |
| 118 | 120 |
| 119 // Don't re-add an existing request or one with a duplicate text request. | 121 // Don't re-add an existing request or one with a duplicate text request. |
| 120 PermissionBubbleRequest* existing_request = GetExistingRequest(request); | 122 PermissionRequest* existing_request = GetExistingRequest(request); |
| 121 if (existing_request) { | 123 if (existing_request) { |
| 122 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the | 124 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the |
| 123 // same object as |existing_request| or an existing duplicate. | 125 // same object as |existing_request| or an existing duplicate. |
| 124 if (request == existing_request) | 126 if (request == existing_request) |
| 125 return; | 127 return; |
| 126 auto range = duplicate_requests_.equal_range(existing_request); | 128 auto range = duplicate_requests_.equal_range(existing_request); |
| 127 for (auto it = range.first; it != range.second; ++it) { | 129 for (auto it = range.first; it != range.second; ++it) { |
| 128 if (request == it->second) | 130 if (request == it->second) |
| 129 return; | 131 return; |
| 130 } | 132 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 151 accept_states_.push_back(true); | 153 accept_states_.push_back(true); |
| 152 } else { | 154 } else { |
| 153 content::RecordAction( | 155 content::RecordAction( |
| 154 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 156 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); |
| 155 queued_frame_requests_.push_back(request); | 157 queued_frame_requests_.push_back(request); |
| 156 } | 158 } |
| 157 | 159 |
| 158 ScheduleShowBubble(); | 160 ScheduleShowBubble(); |
| 159 } | 161 } |
| 160 | 162 |
| 161 void PermissionRequestManager::CancelRequest(PermissionBubbleRequest* request) { | 163 void PermissionRequestManager::CancelRequest(PermissionRequest* request) { |
| 162 // First look in the queued requests, where we can simply finish the request | 164 // First look in the queued requests, where we can simply finish the request |
| 163 // and go on. | 165 // and go on. |
| 164 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 166 std::vector<PermissionRequest*>::iterator requests_iter; |
| 165 for (requests_iter = queued_requests_.begin(); | 167 for (requests_iter = queued_requests_.begin(); |
| 166 requests_iter != queued_requests_.end(); | 168 requests_iter != queued_requests_.end(); |
| 167 requests_iter++) { | 169 requests_iter++) { |
| 168 if (*requests_iter == request) { | 170 if (*requests_iter == request) { |
| 169 RequestFinishedIncludingDuplicates(*requests_iter); | 171 RequestFinishedIncludingDuplicates(*requests_iter); |
| 170 queued_requests_.erase(requests_iter); | 172 queued_requests_.erase(requests_iter); |
| 171 return; | 173 return; |
| 172 } | 174 } |
| 173 } | 175 } |
| 174 for (requests_iter = queued_frame_requests_.begin(); | 176 for (requests_iter = queued_frame_requests_.begin(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 197 | 199 |
| 198 if (IsBubbleVisible()) { | 200 if (IsBubbleVisible()) { |
| 199 view_->Hide(); | 201 view_->Hide(); |
| 200 // Will redraw the bubble if it is being shown. | 202 // Will redraw the bubble if it is being shown. |
| 201 TriggerShowBubble(); | 203 TriggerShowBubble(); |
| 202 } | 204 } |
| 203 return; | 205 return; |
| 204 } | 206 } |
| 205 | 207 |
| 206 // Cancel the existing request and replace it with a dummy. | 208 // Cancel the existing request and replace it with a dummy. |
| 207 PermissionBubbleRequest* cancelled_request = | 209 PermissionRequest* cancelled_request = |
| 208 new CancelledRequest(*requests_iter); | 210 new CancelledRequest(*requests_iter); |
| 209 RequestFinishedIncludingDuplicates(*requests_iter); | 211 RequestFinishedIncludingDuplicates(*requests_iter); |
| 210 *requests_iter = cancelled_request; | 212 *requests_iter = cancelled_request; |
| 211 return; | 213 return; |
| 212 } | 214 } |
| 213 | 215 |
| 214 // Since |request| wasn't found in queued_requests_, queued_frame_requests_ or | 216 // Since |request| wasn't found in queued_requests_, queued_frame_requests_ or |
| 215 // 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 |
| 216 // duplicate_requests_ by value, so instead use GetExistingRequest to find the | 218 // duplicate_requests_ by value, so instead use GetExistingRequest to find the |
| 217 // 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. |
| 218 PermissionBubbleRequest* existing_request = GetExistingRequest(request); | 220 PermissionRequest* existing_request = GetExistingRequest(request); |
| 219 auto range = duplicate_requests_.equal_range(existing_request); | 221 auto range = duplicate_requests_.equal_range(existing_request); |
| 220 for (auto it = range.first; it != range.second; ++it) { | 222 for (auto it = range.first; it != range.second; ++it) { |
| 221 if (request == it->second) { | 223 if (request == it->second) { |
| 222 it->second->RequestFinished(); | 224 it->second->RequestFinished(); |
| 223 duplicate_requests_.erase(it); | 225 duplicate_requests_.erase(it); |
| 224 return; | 226 return; |
| 225 } | 227 } |
| 226 } | 228 } |
| 227 | 229 |
| 228 NOTREACHED(); // Callers should not cancel requests that are not pending. | 230 NOTREACHED(); // Callers should not cancel requests that are not pending. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 // That was the equivalent of "delete this". This object is now destroyed; | 308 // That was the equivalent of "delete this". This object is now destroyed; |
| 307 // returning from this function is the only safe thing to do. | 309 // returning from this function is the only safe thing to do. |
| 308 } | 310 } |
| 309 | 311 |
| 310 void PermissionRequestManager::ToggleAccept(int request_index, bool new_value) { | 312 void PermissionRequestManager::ToggleAccept(int request_index, bool new_value) { |
| 311 DCHECK(request_index < static_cast<int>(accept_states_.size())); | 313 DCHECK(request_index < static_cast<int>(accept_states_.size())); |
| 312 accept_states_[request_index] = new_value; | 314 accept_states_[request_index] = new_value; |
| 313 } | 315 } |
| 314 | 316 |
| 315 void PermissionRequestManager::Accept() { | 317 void PermissionRequestManager::Accept() { |
| 316 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 318 std::vector<PermissionRequest*>::iterator requests_iter; |
| 317 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); | 319 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); |
| 318 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); | 320 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); |
| 319 requests_iter != requests_.end(); | 321 requests_iter != requests_.end(); |
| 320 requests_iter++, accepts_iter++) { | 322 requests_iter++, accepts_iter++) { |
| 321 if (*accepts_iter) { | 323 if (*accepts_iter) { |
| 322 PermissionGrantedIncludingDuplicates(*requests_iter); | 324 PermissionGrantedIncludingDuplicates(*requests_iter); |
| 323 } else { | 325 } else { |
| 324 PermissionDeniedIncludingDuplicates(*requests_iter); | 326 PermissionDeniedIncludingDuplicates(*requests_iter); |
| 325 } | 327 } |
| 326 } | 328 } |
| 327 FinalizeBubble(); | 329 FinalizeBubble(); |
| 328 } | 330 } |
| 329 | 331 |
| 330 void PermissionRequestManager::Deny() { | 332 void PermissionRequestManager::Deny() { |
| 331 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 333 std::vector<PermissionRequest*>::iterator requests_iter; |
| 332 for (requests_iter = requests_.begin(); | 334 for (requests_iter = requests_.begin(); |
| 333 requests_iter != requests_.end(); | 335 requests_iter != requests_.end(); |
| 334 requests_iter++) { | 336 requests_iter++) { |
| 335 PermissionDeniedIncludingDuplicates(*requests_iter); | 337 PermissionDeniedIncludingDuplicates(*requests_iter); |
| 336 } | 338 } |
| 337 FinalizeBubble(); | 339 FinalizeBubble(); |
| 338 } | 340 } |
| 339 | 341 |
| 340 void PermissionRequestManager::Closing() { | 342 void PermissionRequestManager::Closing() { |
| 341 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 343 std::vector<PermissionRequest*>::iterator requests_iter; |
| 342 for (requests_iter = requests_.begin(); | 344 for (requests_iter = requests_.begin(); |
| 343 requests_iter != requests_.end(); | 345 requests_iter != requests_.end(); |
| 344 requests_iter++) { | 346 requests_iter++) { |
| 345 CancelledIncludingDuplicates(*requests_iter); | 347 CancelledIncludingDuplicates(*requests_iter); |
| 346 } | 348 } |
| 347 FinalizeBubble(); | 349 FinalizeBubble(); |
| 348 } | 350 } |
| 349 | 351 |
| 350 void PermissionRequestManager::ScheduleShowBubble() { | 352 void PermissionRequestManager::ScheduleShowBubble() { |
| 351 // ::ScheduleShowBubble() will be called again when the main frame will be | 353 // ::ScheduleShowBubble() will be called again when the main frame will be |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 | 393 |
| 392 // If in testing mode, automatically respond to the bubble that was shown. | 394 // If in testing mode, automatically respond to the bubble that was shown. |
| 393 if (auto_response_for_test_ != NONE) | 395 if (auto_response_for_test_ != NONE) |
| 394 DoAutoResponseForTesting(); | 396 DoAutoResponseForTesting(); |
| 395 } | 397 } |
| 396 | 398 |
| 397 void PermissionRequestManager::FinalizeBubble() { | 399 void PermissionRequestManager::FinalizeBubble() { |
| 398 if (view_) | 400 if (view_) |
| 399 view_->Hide(); | 401 view_->Hide(); |
| 400 | 402 |
| 401 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 403 std::vector<PermissionRequest*>::iterator requests_iter; |
| 402 for (requests_iter = requests_.begin(); | 404 for (requests_iter = requests_.begin(); |
| 403 requests_iter != requests_.end(); | 405 requests_iter != requests_.end(); |
| 404 requests_iter++) { | 406 requests_iter++) { |
| 405 RequestFinishedIncludingDuplicates(*requests_iter); | 407 RequestFinishedIncludingDuplicates(*requests_iter); |
| 406 } | 408 } |
| 407 requests_.clear(); | 409 requests_.clear(); |
| 408 accept_states_.clear(); | 410 accept_states_.clear(); |
| 409 if (queued_requests_.size() || queued_frame_requests_.size()) | 411 if (queued_requests_.size() || queued_frame_requests_.size()) |
| 410 TriggerShowBubble(); | 412 TriggerShowBubble(); |
| 411 else | 413 else |
| 412 request_url_ = GURL(); | 414 request_url_ = GURL(); |
| 413 } | 415 } |
| 414 | 416 |
| 415 void PermissionRequestManager::CancelPendingQueues() { | 417 void PermissionRequestManager::CancelPendingQueues() { |
| 416 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 418 std::vector<PermissionRequest*>::iterator requests_iter; |
| 417 for (requests_iter = queued_requests_.begin(); | 419 for (requests_iter = queued_requests_.begin(); |
| 418 requests_iter != queued_requests_.end(); | 420 requests_iter != queued_requests_.end(); |
| 419 requests_iter++) { | 421 requests_iter++) { |
| 420 RequestFinishedIncludingDuplicates(*requests_iter); | 422 RequestFinishedIncludingDuplicates(*requests_iter); |
| 421 } | 423 } |
| 422 for (requests_iter = queued_frame_requests_.begin(); | 424 for (requests_iter = queued_frame_requests_.begin(); |
| 423 requests_iter != queued_frame_requests_.end(); | 425 requests_iter != queued_frame_requests_.end(); |
| 424 requests_iter++) { | 426 requests_iter++) { |
| 425 RequestFinishedIncludingDuplicates(*requests_iter); | 427 RequestFinishedIncludingDuplicates(*requests_iter); |
| 426 } | 428 } |
| 427 queued_requests_.clear(); | 429 queued_requests_.clear(); |
| 428 queued_frame_requests_.clear(); | 430 queued_frame_requests_.clear(); |
| 429 } | 431 } |
| 430 | 432 |
| 431 PermissionBubbleRequest* PermissionRequestManager::GetExistingRequest( | 433 PermissionRequest* PermissionRequestManager::GetExistingRequest( |
| 432 PermissionBubbleRequest* request) { | 434 PermissionRequest* request) { |
| 433 for (PermissionBubbleRequest* existing_request : requests_) | 435 for (PermissionRequest* existing_request : requests_) |
| 434 if (IsMessageTextEqual(existing_request, request)) | 436 if (IsMessageTextEqual(existing_request, request)) |
| 435 return existing_request; | 437 return existing_request; |
| 436 for (PermissionBubbleRequest* existing_request : queued_requests_) | 438 for (PermissionRequest* existing_request : queued_requests_) |
| 437 if (IsMessageTextEqual(existing_request, request)) | 439 if (IsMessageTextEqual(existing_request, request)) |
| 438 return existing_request; | 440 return existing_request; |
| 439 for (PermissionBubbleRequest* existing_request : queued_frame_requests_) | 441 for (PermissionRequest* existing_request : queued_frame_requests_) |
| 440 if (IsMessageTextEqual(existing_request, request)) | 442 if (IsMessageTextEqual(existing_request, request)) |
| 441 return existing_request; | 443 return existing_request; |
| 442 return nullptr; | 444 return nullptr; |
| 443 } | 445 } |
| 444 | 446 |
| 445 void PermissionRequestManager::PermissionGrantedIncludingDuplicates( | 447 void PermissionRequestManager::PermissionGrantedIncludingDuplicates( |
| 446 PermissionBubbleRequest* request) { | 448 PermissionRequest* request) { |
| 447 DCHECK_EQ(request, GetExistingRequest(request)) | 449 DCHECK_EQ(request, GetExistingRequest(request)) |
| 448 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; | 450 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; |
| 449 request->PermissionGranted(); | 451 request->PermissionGranted(); |
| 450 auto range = duplicate_requests_.equal_range(request); | 452 auto range = duplicate_requests_.equal_range(request); |
| 451 for (auto it = range.first; it != range.second; ++it) | 453 for (auto it = range.first; it != range.second; ++it) |
| 452 it->second->PermissionGranted(); | 454 it->second->PermissionGranted(); |
| 453 } | 455 } |
| 454 void PermissionRequestManager::PermissionDeniedIncludingDuplicates( | 456 void PermissionRequestManager::PermissionDeniedIncludingDuplicates( |
| 455 PermissionBubbleRequest* request) { | 457 PermissionRequest* request) { |
| 456 DCHECK_EQ(request, GetExistingRequest(request)) | 458 DCHECK_EQ(request, GetExistingRequest(request)) |
| 457 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; | 459 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; |
| 458 request->PermissionDenied(); | 460 request->PermissionDenied(); |
| 459 auto range = duplicate_requests_.equal_range(request); | 461 auto range = duplicate_requests_.equal_range(request); |
| 460 for (auto it = range.first; it != range.second; ++it) | 462 for (auto it = range.first; it != range.second; ++it) |
| 461 it->second->PermissionDenied(); | 463 it->second->PermissionDenied(); |
| 462 } | 464 } |
| 463 void PermissionRequestManager::CancelledIncludingDuplicates( | 465 void PermissionRequestManager::CancelledIncludingDuplicates( |
| 464 PermissionBubbleRequest* request) { | 466 PermissionRequest* request) { |
| 465 DCHECK_EQ(request, GetExistingRequest(request)) | 467 DCHECK_EQ(request, GetExistingRequest(request)) |
| 466 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; | 468 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; |
| 467 request->Cancelled(); | 469 request->Cancelled(); |
| 468 auto range = duplicate_requests_.equal_range(request); | 470 auto range = duplicate_requests_.equal_range(request); |
| 469 for (auto it = range.first; it != range.second; ++it) | 471 for (auto it = range.first; it != range.second; ++it) |
| 470 it->second->Cancelled(); | 472 it->second->Cancelled(); |
| 471 } | 473 } |
| 472 void PermissionRequestManager::RequestFinishedIncludingDuplicates( | 474 void PermissionRequestManager::RequestFinishedIncludingDuplicates( |
| 473 PermissionBubbleRequest* request) { | 475 PermissionRequest* request) { |
| 474 // We can't call GetExistingRequest here, because other entries in requests_, | 476 // We can't call GetExistingRequest here, because other entries in requests_, |
| 475 // queued_requests_ or queued_frame_requests_ might already have been deleted. | 477 // queued_requests_ or queued_frame_requests_ might already have been deleted. |
| 476 DCHECK_EQ(1, std::count(requests_.begin(), requests_.end(), request) + | 478 DCHECK_EQ(1, std::count(requests_.begin(), requests_.end(), request) + |
| 477 std::count(queued_requests_.begin(), queued_requests_.end(), | 479 std::count(queued_requests_.begin(), queued_requests_.end(), |
| 478 request) + | 480 request) + |
| 479 std::count(queued_frame_requests_.begin(), | 481 std::count(queued_frame_requests_.begin(), |
| 480 queued_frame_requests_.end(), request)) | 482 queued_frame_requests_.end(), request)) |
| 481 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; | 483 << "Only requests in [queued_[frame_]]requests_ can have duplicates"; |
| 482 request->RequestFinished(); | 484 request->RequestFinished(); |
| 483 // Beyond this point, |request| has probably been deleted. | 485 // Beyond this point, |request| has probably been deleted. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 508 case DENY_ALL: | 510 case DENY_ALL: |
| 509 Deny(); | 511 Deny(); |
| 510 break; | 512 break; |
| 511 case DISMISS: | 513 case DISMISS: |
| 512 Closing(); | 514 Closing(); |
| 513 break; | 515 break; |
| 514 case NONE: | 516 case NONE: |
| 515 NOTREACHED(); | 517 NOTREACHED(); |
| 516 } | 518 } |
| 517 } | 519 } |
| OLD | NEW |