Chromium Code Reviews| Index: chrome/browser/permissions/permission_request_manager.cc | 
| diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc | 
| index 0dec1904f7ee8897b8fa091be1fc89a5deee2af8..ad680b86634f0aca91738da65fd14e760997d0b8 100644 | 
| --- a/chrome/browser/permissions/permission_request_manager.cc | 
| +++ b/chrome/browser/permissions/permission_request_manager.cc | 
| @@ -133,29 +133,20 @@ void PermissionRequestManager::AddRequest(PermissionRequest* request) { | 
| return; | 
| } | 
| - if (IsBubbleVisible()) { | 
| - if (is_main_frame) { | 
| + if (is_main_frame) { | 
| + if (IsBubbleVisible()) { | 
| base::RecordAction( | 
| base::UserMetricsAction("PermissionBubbleRequestQueued")); | 
| - queued_requests_.push_back(request); | 
| - } else { | 
| - base::RecordAction( | 
| - base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 
| - queued_frame_requests_.push_back(request); | 
| } | 
| - return; | 
| - } | 
| - | 
| - if (is_main_frame) { | 
| - requests_.push_back(request); | 
| - accept_states_.push_back(true); | 
| + queued_requests_.push_back(request); | 
| } else { | 
| base::RecordAction( | 
| base::UserMetricsAction("PermissionBubbleIFrameRequestQueued")); | 
| queued_frame_requests_.push_back(request); | 
| } | 
| - ScheduleShowBubble(); | 
| + if (!IsBubbleVisible()) | 
| + ScheduleShowBubble(); | 
| } | 
| void PermissionRequestManager::CancelRequest(PermissionRequest* request) { | 
| @@ -189,16 +180,16 @@ void PermissionRequestManager::CancelRequest(PermissionRequest* request) { | 
| // We can simply erase the current entry in the request table if we aren't | 
| // showing the dialog, or if we are showing it and it can accept the update. | 
| - bool can_erase = !IsBubbleVisible() || view_->CanAcceptRequestUpdate(); | 
| + bool can_erase = !view_ || view_->CanAcceptRequestUpdate(); | 
| if (can_erase) { | 
| RequestFinishedIncludingDuplicates(*requests_iter); | 
| requests_.erase(requests_iter); | 
| accept_states_.erase(accepts_iter); | 
| - if (IsBubbleVisible()) { | 
| + if (view_) { | 
| view_->Hide(); | 
| // Will redraw the bubble if it is being shown. | 
| - TriggerShowBubble(); | 
| + DequeueRequestsAndShowBubble(); | 
| } | 
| return; | 
| } | 
| @@ -246,7 +237,15 @@ void PermissionRequestManager::DisplayPendingRequests() { | 
| view_ = view_factory_.Run(web_contents()); | 
| view_->SetDelegate(this); | 
| - TriggerShowBubble(); | 
| + if (!main_frame_has_fully_loaded_) | 
| + return; | 
| + | 
| + if (requests_.empty()) { | 
| + DequeueRequestsAndShowBubble(); | 
| + } else { | 
| + // We switched tabs away and back while a prompt was active. | 
| 
 
raymes
2017/05/08 03:14:26
Thanks, this is much clearer now!
 
 | 
| + ShowBubble(); | 
| + } | 
| } | 
| void PermissionRequestManager::UpdateAnchorPosition() { | 
| @@ -255,7 +254,7 @@ void PermissionRequestManager::UpdateAnchorPosition() { | 
| } | 
| bool PermissionRequestManager::IsBubbleVisible() { | 
| - return view_ && view_->IsVisible(); | 
| + return view_ && !requests_.empty(); | 
| } | 
| // static | 
| @@ -371,31 +370,35 @@ void PermissionRequestManager::ScheduleShowBubble() { | 
| content::BrowserThread::PostTask( | 
| content::BrowserThread::UI, FROM_HERE, | 
| - base::BindOnce(&PermissionRequestManager::TriggerShowBubble, | 
| + base::BindOnce(&PermissionRequestManager::DequeueRequestsAndShowBubble, | 
| weak_factory_.GetWeakPtr())); | 
| } | 
| -void PermissionRequestManager::TriggerShowBubble() { | 
| +void PermissionRequestManager::DequeueRequestsAndShowBubble() { | 
| if (!view_) | 
| return; | 
| - if (IsBubbleVisible()) | 
| + if (!requests_.empty()) | 
| return; | 
| if (!main_frame_has_fully_loaded_) | 
| return; | 
| - if (requests_.empty() && queued_requests_.empty() && | 
| - queued_frame_requests_.empty()) { | 
| + if (queued_requests_.empty() && queued_frame_requests_.empty()) | 
| return; | 
| - } | 
| - if (requests_.empty()) { | 
| - if (queued_requests_.size()) | 
| - requests_.swap(queued_requests_); | 
| - else | 
| - requests_.swap(queued_frame_requests_); | 
| + if (queued_requests_.size()) | 
| + requests_.swap(queued_requests_); | 
| + else | 
| + requests_.swap(queued_frame_requests_); | 
| - // Sets the default value for each request to be 'accept'. | 
| - accept_states_.resize(requests_.size(), true); | 
| - } | 
| + // Sets the default value for each request to be 'accept'. | 
| + accept_states_.resize(requests_.size(), true); | 
| + | 
| + ShowBubble(); | 
| +} | 
| + | 
| +void PermissionRequestManager::ShowBubble() { | 
| + DCHECK(view_); | 
| + DCHECK(!requests_.empty()); | 
| + DCHECK(main_frame_has_fully_loaded_); | 
| view_->Show(requests_, accept_states_); | 
| PermissionUmaUtil::PermissionPromptShown(requests_); | 
| @@ -419,7 +422,7 @@ void PermissionRequestManager::FinalizeBubble() { | 
| requests_.clear(); | 
| accept_states_.clear(); | 
| if (queued_requests_.size() || queued_frame_requests_.size()) | 
| - TriggerShowBubble(); | 
| + DequeueRequestsAndShowBubble(); | 
| } | 
| void PermissionRequestManager::CancelPendingQueues() { |