1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::AddDialog(AppModalDialog* dialog) { 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!active_dialog_) { 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowModalDialog(dialog); 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch app_modal_dialog_queue_.push(dialog); 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ShowNextDialog() { 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppModalDialog* dialog = GetNextDialog(); 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (dialog) 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ShowModalDialog(dialog); 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch active_dialog_ = NULL; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ActivateModalDialog() { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (showing_modal_dialog_) { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // As part of showing a modal dialog we may end up back in this method 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (showing a dialog activates the TabContents, which can trigger a call 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to ActivateModalDialog). We ignore such a request as after the call to 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // activate the tab contents the dialog is shown. 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (active_dialog_) 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch active_dialog_->ActivateModalDialog(); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAppModalDialogQueue::AppModalDialogQueue() 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : active_dialog_(NULL), showing_modal_dialog_(false) { 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 41731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickAppModalDialogQueue::~AppModalDialogQueue() {} 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// static 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenAppModalDialogQueue* AppModalDialogQueue::GetInstance() { 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return Singleton<AppModalDialogQueue>::get(); 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AppModalDialogQueue::ShowModalDialog(AppModalDialog* dialog) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Be sure and set the active_dialog_ field first, otherwise if 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ShowModalDialog triggers a call back to the queue they'll get the old 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // dialog. Also, if the dialog calls |ShowNextDialog()| before returning, that 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // would write NULL into |active_dialog_| and this function would then undo 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch active_dialog_ = dialog; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch showing_modal_dialog_ = true; 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dialog->ShowModalDialog(); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch showing_modal_dialog_ = false; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochAppModalDialog* AppModalDialogQueue::GetNextDialog() { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch while (!app_modal_dialog_queue_.empty()) { 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppModalDialog* dialog = app_modal_dialog_queue_.front(); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch app_modal_dialog_queue_.pop(); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (dialog->IsValid()) 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return dialog; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete dialog; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 70