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/ui/website_settings/permission_bubble_manager.h" | 5 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/metrics/user_metrics_action.h" | 8 #include "base/metrics/user_metrics_action.h" |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" | 10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 46 void RequestFinished() override { delete this; } | 46 void RequestFinished() override { delete this; } |
| 47 | 47 |
| 48 private: | 48 private: |
| 49 int icon_; | 49 int icon_; |
| 50 base::string16 message_text_; | 50 base::string16 message_text_; |
| 51 base::string16 message_fragment_; | 51 base::string16 message_fragment_; |
| 52 bool user_gesture_; | 52 bool user_gesture_; |
| 53 GURL origin_; | 53 GURL origin_; |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 bool IsMessageTextEqual(PermissionBubbleRequest* a, | |
| 57 PermissionBubbleRequest* b) { | |
| 58 if (a == b) | |
| 59 return true; | |
| 60 if (a->GetMessageTextFragment() == b->GetMessageTextFragment() && | |
| 61 a->GetOrigin() == b->GetOrigin()) { | |
| 62 return true; | |
| 63 } | |
| 64 return false; | |
| 65 } | |
| 66 | |
| 56 } // namespace | 67 } // namespace |
| 57 | 68 |
| 58 // PermissionBubbleManager::Observer ------------------------------------------- | 69 // PermissionBubbleManager::Observer ------------------------------------------- |
| 59 | 70 |
| 60 PermissionBubbleManager::Observer::~Observer() { | 71 PermissionBubbleManager::Observer::~Observer() { |
| 61 } | 72 } |
| 62 | 73 |
| 63 void PermissionBubbleManager::Observer::OnBubbleAdded() { | 74 void PermissionBubbleManager::Observer::OnBubbleAdded() { |
| 64 } | 75 } |
| 65 | 76 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 76 view_(nullptr), | 87 view_(nullptr), |
| 77 main_frame_has_fully_loaded_(false), | 88 main_frame_has_fully_loaded_(false), |
| 78 auto_response_for_test_(NONE), | 89 auto_response_for_test_(NONE), |
| 79 weak_factory_(this) { | 90 weak_factory_(this) { |
| 80 } | 91 } |
| 81 | 92 |
| 82 PermissionBubbleManager::~PermissionBubbleManager() { | 93 PermissionBubbleManager::~PermissionBubbleManager() { |
| 83 if (view_ != NULL) | 94 if (view_ != NULL) |
| 84 view_->SetDelegate(NULL); | 95 view_->SetDelegate(NULL); |
| 85 | 96 |
| 86 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 97 for (PermissionBubbleRequest* request : requests_) |
| 87 for (requests_iter = requests_.begin(); | 98 request->RequestFinished(); |
| 88 requests_iter != requests_.end(); | 99 for (PermissionBubbleRequest* request : queued_requests_) |
| 89 requests_iter++) { | 100 request->RequestFinished(); |
| 90 (*requests_iter)->RequestFinished(); | 101 for (PermissionBubbleRequest* request : queued_frame_requests_) |
| 91 } | 102 request->RequestFinished(); |
| 92 for (requests_iter = queued_requests_.begin(); | 103 for (const auto& entry : duplicate_requests_) |
| 93 requests_iter != queued_requests_.end(); | 104 entry.second->RequestFinished(); |
| 94 requests_iter++) { | |
| 95 (*requests_iter)->RequestFinished(); | |
| 96 } | |
| 97 } | 105 } |
| 98 | 106 |
| 99 void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) { | 107 void PermissionBubbleManager::AddRequest(PermissionBubbleRequest* request) { |
| 100 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); | 108 content::RecordAction(base::UserMetricsAction("PermissionBubbleRequest")); |
| 101 // TODO(gbillock): is there a race between an early request on a | 109 // TODO(gbillock): is there a race between an early request on a |
| 102 // newly-navigated page and the to-be-cleaned-up requests on the previous | 110 // newly-navigated page and the to-be-cleaned-up requests on the previous |
| 103 // page? We should maybe listen to DidStartNavigationToPendingEntry (and | 111 // page? We should maybe listen to DidStartNavigationToPendingEntry (and |
| 104 // any other renderer-side nav initiations?). Double-check this for | 112 // any other renderer-side nav initiations?). Double-check this for |
| 105 // correct behavior on interstitials -- we probably want to basically queue | 113 // correct behavior on interstitials -- we probably want to basically queue |
| 106 // any request for which GetVisibleURL != GetLastCommittedURL. | 114 // any request for which GetVisibleURL != GetLastCommittedURL. |
| 107 request_url_ = web_contents()->GetLastCommittedURL(); | 115 request_url_ = web_contents()->GetLastCommittedURL(); |
| 108 bool is_main_frame = url::Origin(request_url_) | 116 bool is_main_frame = url::Origin(request_url_) |
| 109 .IsSameOriginWith(url::Origin(request->GetOrigin())); | 117 .IsSameOriginWith(url::Origin(request->GetOrigin())); |
| 110 | 118 |
| 111 // Don't re-add an existing request or one with a duplicate text request. | 119 // Don't re-add an existing request or one with a duplicate text request. |
| 112 // TODO(johnme): Instead of dropping duplicate requests, we should queue them | 120 PermissionBubbleRequest* existing_request = GetExistingRequest(request); |
| 113 // and eventually run their PermissionGranted/PermissionDenied/Cancelled | 121 if (existing_request) { |
| 114 // callback (crbug.com/577313). | 122 // |request| is a duplicate. Add it to |duplicate_requests_| unless it's the |
| 115 bool same_object = false; | 123 // same object as |existing_request| or an existing duplicate. |
| 116 if (ExistingRequest(request, requests_, &same_object) || | 124 if (request == existing_request) |
| 117 ExistingRequest(request, queued_requests_, &same_object) || | 125 return; |
| 118 ExistingRequest(request, queued_frame_requests_, &same_object)) { | 126 auto range = duplicate_requests_.equal_range(existing_request); |
| 119 if (!same_object) | 127 for (auto it = range.first; it != range.second; ++it) { |
| 120 request->RequestFinished(); | 128 if (request == it->second) |
| 129 return; | |
| 130 } | |
| 131 duplicate_requests_.insert(std::make_pair(existing_request, request)); | |
| 121 return; | 132 return; |
| 122 } | 133 } |
| 123 | 134 |
| 124 if (IsBubbleVisible()) { | 135 if (IsBubbleVisible()) { |
| 125 if (is_main_frame) { | 136 if (is_main_frame) { |
| 126 content::RecordAction( | 137 content::RecordAction( |
| 127 base::UserMetricsAction("PermissionBubbleRequestQueued")); | 138 base::UserMetricsAction("PermissionBubbleRequestQueued")); |
| 128 queued_requests_.push_back(request); | 139 queued_requests_.push_back(request); |
| 129 } else { | 140 } else { |
| 130 content::RecordAction( | 141 content::RecordAction( |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 141 } else { | 152 } else { |
| 142 content::RecordAction( | 153 content::RecordAction( |
| 143 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 154 base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); |
| 144 queued_frame_requests_.push_back(request); | 155 queued_frame_requests_.push_back(request); |
| 145 } | 156 } |
| 146 | 157 |
| 147 ScheduleShowBubble(); | 158 ScheduleShowBubble(); |
| 148 } | 159 } |
| 149 | 160 |
| 150 void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) { | 161 void PermissionBubbleManager::CancelRequest(PermissionBubbleRequest* request) { |
| 151 // First look in the queued requests, where we can simply delete the request | 162 // First look in the queued requests, where we can simply finish the request |
| 152 // and go on. | 163 // and go on. |
| 153 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 164 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 154 for (requests_iter = queued_requests_.begin(); | 165 for (requests_iter = queued_requests_.begin(); |
| 155 requests_iter != queued_requests_.end(); | 166 requests_iter != queued_requests_.end(); |
| 156 requests_iter++) { | 167 requests_iter++) { |
| 157 if (*requests_iter == request) { | 168 if (*requests_iter == request) { |
| 158 (*requests_iter)->RequestFinished(); | 169 RequestFinishedIncludingDuplicates(*requests_iter); |
| 159 queued_requests_.erase(requests_iter); | 170 queued_requests_.erase(requests_iter); |
| 160 return; | 171 return; |
| 161 } | 172 } |
| 162 } | 173 } |
| 174 for (requests_iter = queued_frame_requests_.begin(); | |
| 175 requests_iter != queued_frame_requests_.end(); requests_iter++) { | |
| 176 if (*requests_iter == request) { | |
| 177 RequestFinishedIncludingDuplicates(*requests_iter); | |
| 178 queued_frame_requests_.erase(requests_iter); | |
| 179 return; | |
| 180 } | |
| 181 } | |
| 163 | 182 |
| 164 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); | 183 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); |
| 165 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); | 184 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); |
| 166 requests_iter != requests_.end(); | 185 requests_iter != requests_.end(); |
| 167 requests_iter++, accepts_iter++) { | 186 requests_iter++, accepts_iter++) { |
| 168 if (*requests_iter != request) | 187 if (*requests_iter != request) |
| 169 continue; | 188 continue; |
| 170 | 189 |
| 171 // We can simply erase the current entry in the request table if we aren't | 190 // We can simply erase the current entry in the request table if we aren't |
| 172 // showing the dialog, or if we are showing it and it can accept the update. | 191 // showing the dialog, or if we are showing it and it can accept the update. |
| 173 bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate(); | 192 bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate(); |
| 174 if (can_erase) { | 193 if (can_erase) { |
| 175 (*requests_iter)->RequestFinished(); | 194 RequestFinishedIncludingDuplicates(*requests_iter); |
| 176 requests_.erase(requests_iter); | 195 requests_.erase(requests_iter); |
| 177 accept_states_.erase(accepts_iter); | 196 accept_states_.erase(accepts_iter); |
| 178 | 197 |
| 179 if (IsBubbleVisible()) { | 198 if (IsBubbleVisible()) { |
| 180 view_->Hide(); | 199 view_->Hide(); |
| 181 // Will redraw the bubble if it is being shown. | 200 // Will redraw the bubble if it is being shown. |
| 182 TriggerShowBubble(); | 201 TriggerShowBubble(); |
| 183 } | 202 } |
| 184 return; | 203 return; |
| 185 } | 204 } |
| 186 | 205 |
| 187 // Cancel the existing request and replace it with a dummy. | 206 // Cancel the existing request and replace it with a dummy. |
| 188 PermissionBubbleRequest* cancelled_request = | 207 PermissionBubbleRequest* cancelled_request = |
| 189 new CancelledRequest(*requests_iter); | 208 new CancelledRequest(*requests_iter); |
| 190 (*requests_iter)->RequestFinished(); | 209 RequestFinishedIncludingDuplicates(*requests_iter); |
| 191 *requests_iter = cancelled_request; | 210 *requests_iter = cancelled_request; |
| 192 return; | 211 return; |
| 193 } | 212 } |
| 194 | 213 |
| 214 // 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 | |
| 216 // duplicate_requests_ by value, so instead use GetExistingRequest to find the | |
| 217 // key (request it was duped against), and iterate through duplicates of that. | |
| 218 PermissionBubbleRequest* existing_request = GetExistingRequest(request); | |
| 219 auto range = duplicate_requests_.equal_range(existing_request); | |
| 220 for (auto it = range.first; it != range.second; ++it) { | |
| 221 if (request == it->second) { | |
| 222 it->second->RequestFinished(); | |
| 223 duplicate_requests_.erase(it); | |
| 224 return; | |
| 225 } | |
| 226 } | |
| 227 | |
| 195 NOTREACHED(); // Callers should not cancel requests that are not pending. | 228 NOTREACHED(); // Callers should not cancel requests that are not pending. |
| 196 } | 229 } |
| 197 | 230 |
| 198 void PermissionBubbleManager::HideBubble() { | 231 void PermissionBubbleManager::HideBubble() { |
| 199 // Disengage from the existing view if there is one. | 232 // Disengage from the existing view if there is one. |
| 200 if (!view_) | 233 if (!view_) |
| 201 return; | 234 return; |
| 202 | 235 |
| 203 view_->SetDelegate(nullptr); | 236 view_->SetDelegate(nullptr); |
| 204 view_->Hide(); | 237 view_->Hide(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 278 DCHECK(request_index < static_cast<int>(accept_states_.size())); | 311 DCHECK(request_index < static_cast<int>(accept_states_.size())); |
| 279 accept_states_[request_index] = new_value; | 312 accept_states_[request_index] = new_value; |
| 280 } | 313 } |
| 281 | 314 |
| 282 void PermissionBubbleManager::Accept() { | 315 void PermissionBubbleManager::Accept() { |
| 283 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 316 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 284 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); | 317 std::vector<bool>::iterator accepts_iter = accept_states_.begin(); |
| 285 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); | 318 for (requests_iter = requests_.begin(), accepts_iter = accept_states_.begin(); |
| 286 requests_iter != requests_.end(); | 319 requests_iter != requests_.end(); |
| 287 requests_iter++, accepts_iter++) { | 320 requests_iter++, accepts_iter++) { |
| 288 if (*accepts_iter) | 321 if (*accepts_iter) { |
| 289 (*requests_iter)->PermissionGranted(); | 322 PermissionGrantedIncludingDuplicates(*requests_iter); |
| 290 else | 323 } else { |
| 291 (*requests_iter)->PermissionDenied(); | 324 PermissionDeniedIncludingDuplicates(*requests_iter); |
| 325 } | |
| 292 } | 326 } |
| 293 FinalizeBubble(); | 327 FinalizeBubble(); |
| 294 } | 328 } |
| 295 | 329 |
| 296 void PermissionBubbleManager::Deny() { | 330 void PermissionBubbleManager::Deny() { |
| 297 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 331 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 298 for (requests_iter = requests_.begin(); | 332 for (requests_iter = requests_.begin(); |
| 299 requests_iter != requests_.end(); | 333 requests_iter != requests_.end(); |
| 300 requests_iter++) { | 334 requests_iter++) { |
| 301 (*requests_iter)->PermissionDenied(); | 335 PermissionDeniedIncludingDuplicates(*requests_iter); |
| 302 } | 336 } |
| 303 FinalizeBubble(); | 337 FinalizeBubble(); |
| 304 } | 338 } |
| 305 | 339 |
| 306 void PermissionBubbleManager::Closing() { | 340 void PermissionBubbleManager::Closing() { |
| 307 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 341 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 308 for (requests_iter = requests_.begin(); | 342 for (requests_iter = requests_.begin(); |
| 309 requests_iter != requests_.end(); | 343 requests_iter != requests_.end(); |
| 310 requests_iter++) { | 344 requests_iter++) { |
| 311 (*requests_iter)->Cancelled(); | 345 CancelledIncludingDuplicates(*requests_iter); |
| 312 } | 346 } |
| 313 FinalizeBubble(); | 347 FinalizeBubble(); |
| 314 } | 348 } |
| 315 | 349 |
| 316 void PermissionBubbleManager::ScheduleShowBubble() { | 350 void PermissionBubbleManager::ScheduleShowBubble() { |
| 317 // ::ScheduleShowBubble() will be called again when the main frame will be | 351 // ::ScheduleShowBubble() will be called again when the main frame will be |
| 318 // loaded. | 352 // loaded. |
| 319 if (!main_frame_has_fully_loaded_) | 353 if (!main_frame_has_fully_loaded_) |
| 320 return; | 354 return; |
| 321 | 355 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 } | 399 } |
| 366 | 400 |
| 367 void PermissionBubbleManager::FinalizeBubble() { | 401 void PermissionBubbleManager::FinalizeBubble() { |
| 368 if (view_) | 402 if (view_) |
| 369 view_->Hide(); | 403 view_->Hide(); |
| 370 | 404 |
| 371 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 405 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 372 for (requests_iter = requests_.begin(); | 406 for (requests_iter = requests_.begin(); |
| 373 requests_iter != requests_.end(); | 407 requests_iter != requests_.end(); |
| 374 requests_iter++) { | 408 requests_iter++) { |
| 375 (*requests_iter)->RequestFinished(); | 409 RequestFinishedIncludingDuplicates(*requests_iter); |
| 376 } | 410 } |
| 377 requests_.clear(); | 411 requests_.clear(); |
| 378 accept_states_.clear(); | 412 accept_states_.clear(); |
| 379 if (queued_requests_.size() || queued_frame_requests_.size()) | 413 if (queued_requests_.size() || queued_frame_requests_.size()) |
| 380 TriggerShowBubble(); | 414 TriggerShowBubble(); |
| 381 else | 415 else |
| 382 request_url_ = GURL(); | 416 request_url_ = GURL(); |
| 383 } | 417 } |
| 384 | 418 |
| 385 void PermissionBubbleManager::CancelPendingQueues() { | 419 void PermissionBubbleManager::CancelPendingQueues() { |
| 386 std::vector<PermissionBubbleRequest*>::iterator requests_iter; | 420 std::vector<PermissionBubbleRequest*>::iterator requests_iter; |
| 387 for (requests_iter = queued_requests_.begin(); | 421 for (requests_iter = queued_requests_.begin(); |
| 388 requests_iter != queued_requests_.end(); | 422 requests_iter != queued_requests_.end(); |
| 389 requests_iter++) { | 423 requests_iter++) { |
| 390 (*requests_iter)->RequestFinished(); | 424 RequestFinishedIncludingDuplicates(*requests_iter); |
| 391 } | 425 } |
| 392 for (requests_iter = queued_frame_requests_.begin(); | 426 for (requests_iter = queued_frame_requests_.begin(); |
| 393 requests_iter != queued_frame_requests_.end(); | 427 requests_iter != queued_frame_requests_.end(); |
| 394 requests_iter++) { | 428 requests_iter++) { |
| 395 (*requests_iter)->RequestFinished(); | 429 RequestFinishedIncludingDuplicates(*requests_iter); |
| 396 } | 430 } |
| 397 queued_requests_.clear(); | 431 queued_requests_.clear(); |
| 398 queued_frame_requests_.clear(); | 432 queued_frame_requests_.clear(); |
| 399 } | 433 } |
| 400 | 434 |
| 401 bool PermissionBubbleManager::ExistingRequest( | 435 PermissionBubbleRequest* PermissionBubbleManager::GetExistingRequest( |
| 402 PermissionBubbleRequest* request, | 436 PermissionBubbleRequest* request) { |
| 403 const std::vector<PermissionBubbleRequest*>& queue, | 437 for (PermissionBubbleRequest* existing_request : requests_) |
| 404 bool* same_object) { | 438 if (IsMessageTextEqual(existing_request, request)) |
| 405 CHECK(same_object); | 439 return existing_request; |
| 406 *same_object = false; | 440 for (PermissionBubbleRequest* existing_request : queued_requests_) |
| 407 std::vector<PermissionBubbleRequest*>::const_iterator iter; | 441 if (IsMessageTextEqual(existing_request, request)) |
| 408 for (iter = queue.begin(); iter != queue.end(); iter++) { | 442 return existing_request; |
| 409 if (*iter == request) { | 443 for (PermissionBubbleRequest* existing_request : queued_frame_requests_) |
| 410 *same_object = true; | 444 if (IsMessageTextEqual(existing_request, request)) |
| 411 return true; | 445 return existing_request; |
| 412 } | 446 return nullptr; |
| 413 if ((*iter)->GetMessageTextFragment() == | |
| 414 request->GetMessageTextFragment() && | |
| 415 (*iter)->GetOrigin() == request->GetOrigin()) { | |
| 416 return true; | |
| 417 } | |
| 418 } | |
| 419 return false; | |
| 420 } | 447 } |
| 421 | 448 |
| 422 bool PermissionBubbleManager::HasUserGestureRequest( | 449 bool PermissionBubbleManager::HasUserGestureRequest( |
| 423 const std::vector<PermissionBubbleRequest*>& queue) { | 450 const std::vector<PermissionBubbleRequest*>& queue) { |
| 424 std::vector<PermissionBubbleRequest*>::const_iterator iter; | 451 std::vector<PermissionBubbleRequest*>::const_iterator iter; |
| 425 for (iter = queue.begin(); iter != queue.end(); iter++) { | 452 for (iter = queue.begin(); iter != queue.end(); iter++) { |
| 426 if ((*iter)->HasUserGesture()) | 453 if ((*iter)->HasUserGesture()) |
| 427 return true; | 454 return true; |
| 428 } | 455 } |
| 429 return false; | 456 return false; |
| 430 } | 457 } |
| 431 | 458 |
| 459 void PermissionBubbleManager::PermissionGrantedIncludingDuplicates( | |
| 460 PermissionBubbleRequest* request) { | |
| 461 DCHECK_EQ(request, GetExistingRequest(request)) | |
|
felt
2016/01/28 06:18:14
nit: wondering why this isn't DCHECKing that GetEx
johnme
2016/01/28 15:40:11
I've changed the DCHECK comment to "Only requests
| |
| 462 << "Request must not be a duplicate"; | |
| 463 request->PermissionGranted(); | |
| 464 auto range = duplicate_requests_.equal_range(request); | |
| 465 for (auto it = range.first; it != range.second; ++it) | |
| 466 it->second->PermissionGranted(); | |
| 467 } | |
| 468 void PermissionBubbleManager::PermissionDeniedIncludingDuplicates( | |
| 469 PermissionBubbleRequest* request) { | |
| 470 DCHECK_EQ(request, GetExistingRequest(request)) | |
| 471 << "Request must not be a duplicate"; | |
| 472 request->PermissionDenied(); | |
| 473 auto range = duplicate_requests_.equal_range(request); | |
| 474 for (auto it = range.first; it != range.second; ++it) | |
| 475 it->second->PermissionDenied(); | |
| 476 } | |
| 477 void PermissionBubbleManager::CancelledIncludingDuplicates( | |
| 478 PermissionBubbleRequest* request) { | |
| 479 DCHECK_EQ(request, GetExistingRequest(request)) | |
| 480 << "Request must not be a duplicate"; | |
| 481 request->Cancelled(); | |
| 482 auto range = duplicate_requests_.equal_range(request); | |
| 483 for (auto it = range.first; it != range.second; ++it) | |
| 484 it->second->Cancelled(); | |
| 485 } | |
| 486 void PermissionBubbleManager::RequestFinishedIncludingDuplicates( | |
| 487 PermissionBubbleRequest* request) { | |
| 488 DCHECK_EQ(request, GetExistingRequest(request)) | |
| 489 << "Request must not be a duplicate"; | |
| 490 request->RequestFinished(); | |
| 491 auto range = duplicate_requests_.equal_range(request); | |
| 492 for (auto it = range.first; it != range.second; ++it) | |
| 493 it->second->RequestFinished(); | |
| 494 // Additionally, we can now remove the duplicates. | |
| 495 duplicate_requests_.erase(request); | |
| 496 } | |
| 497 | |
| 432 void PermissionBubbleManager::AddObserver(Observer* observer) { | 498 void PermissionBubbleManager::AddObserver(Observer* observer) { |
| 433 observer_list_.AddObserver(observer); | 499 observer_list_.AddObserver(observer); |
| 434 } | 500 } |
| 435 | 501 |
| 436 void PermissionBubbleManager::RemoveObserver(Observer* observer) { | 502 void PermissionBubbleManager::RemoveObserver(Observer* observer) { |
| 437 observer_list_.RemoveObserver(observer); | 503 observer_list_.RemoveObserver(observer); |
| 438 } | 504 } |
| 439 | 505 |
| 440 void PermissionBubbleManager::NotifyBubbleAdded() { | 506 void PermissionBubbleManager::NotifyBubbleAdded() { |
| 441 FOR_EACH_OBSERVER(Observer, observer_list_, OnBubbleAdded()); | 507 FOR_EACH_OBSERVER(Observer, observer_list_, OnBubbleAdded()); |
| 442 } | 508 } |
| 443 | 509 |
| 444 void PermissionBubbleManager::DoAutoResponseForTesting() { | 510 void PermissionBubbleManager::DoAutoResponseForTesting() { |
| 445 switch (auto_response_for_test_) { | 511 switch (auto_response_for_test_) { |
| 446 case ACCEPT_ALL: | 512 case ACCEPT_ALL: |
| 447 Accept(); | 513 Accept(); |
| 448 break; | 514 break; |
| 449 case DENY_ALL: | 515 case DENY_ALL: |
| 450 Deny(); | 516 Deny(); |
| 451 break; | 517 break; |
| 452 case DISMISS: | 518 case DISMISS: |
| 453 Closing(); | 519 Closing(); |
| 454 break; | 520 break; |
| 455 case NONE: | 521 case NONE: |
| 456 NOTREACHED(); | 522 NOTREACHED(); |
| 457 } | 523 } |
| 458 } | 524 } |
| OLD | NEW |