| 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.
|
| + 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() {
|
|
|