1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/app_modal/app_modal_dialog_queue.h"
7 #include "base/memory/singleton.h"
8 #include "components/app_modal/app_modal_dialog.h"
13 AppModalDialogQueue
* AppModalDialogQueue::GetInstance() {
14 return Singleton
<AppModalDialogQueue
>::get();
17 void AppModalDialogQueue::AddDialog(AppModalDialog
* dialog
) {
18 if (!active_dialog_
) {
19 ShowModalDialog(dialog
);
22 app_modal_dialog_queue_
.push_back(dialog
);
25 void AppModalDialogQueue::ShowNextDialog() {
26 AppModalDialog
* dialog
= GetNextDialog();
28 ShowModalDialog(dialog
);
30 active_dialog_
= NULL
;
33 void AppModalDialogQueue::ActivateModalDialog() {
34 if (showing_modal_dialog_
) {
35 // As part of showing a modal dialog we may end up back in this method
36 // (showing a dialog activates the WebContents, which can trigger a call
37 // to ActivateModalDialog). We ignore such a request as after the call to
38 // activate the tab contents the dialog is shown.
42 active_dialog_
->ActivateModalDialog();
45 bool AppModalDialogQueue::HasActiveDialog() const {
46 return active_dialog_
!= NULL
;
49 AppModalDialogQueue::AppModalDialogQueue()
50 : active_dialog_(NULL
),
51 showing_modal_dialog_(false) {
54 AppModalDialogQueue::~AppModalDialogQueue() {
57 void AppModalDialogQueue::ShowModalDialog(AppModalDialog
* dialog
) {
58 // Be sure and set the active_dialog_ field first, otherwise if
59 // ShowModalDialog triggers a call back to the queue they'll get the old
60 // dialog. Also, if the dialog calls |ShowNextDialog()| before returning, that
61 // would write NULL into |active_dialog_| and this function would then undo
63 active_dialog_
= dialog
;
64 showing_modal_dialog_
= true;
65 dialog
->ShowModalDialog();
66 showing_modal_dialog_
= false;
69 AppModalDialog
* AppModalDialogQueue::GetNextDialog() {
70 while (!app_modal_dialog_queue_
.empty()) {
71 AppModalDialog
* dialog
= app_modal_dialog_queue_
.front();
72 app_modal_dialog_queue_
.pop_front();
73 if (dialog
->IsValid())
80 } // namespace app_modal