1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // Copyright (c) 2012 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/javascript_dialogs/app_modal_dialog_queue.h"
- #include "base/memory/singleton.h"
- #include "components/javascript_dialogs/app_modal_dialog_controller.h"
- namespace javascript_dialogs {
- // static
- AppModalDialogQueue* AppModalDialogQueue::GetInstance() {
- return base::Singleton<AppModalDialogQueue>::get();
- }
- void AppModalDialogQueue::AddDialog(AppModalDialogController* dialog) {
- if (!active_dialog_) {
- ShowModalDialog(dialog);
- return;
- }
- app_modal_dialog_queue_.push_back(dialog);
- }
- void AppModalDialogQueue::ShowNextDialog() {
- AppModalDialogController* dialog = GetNextDialog();
- if (dialog)
- ShowModalDialog(dialog);
- else
- active_dialog_ = nullptr;
- }
- void AppModalDialogQueue::ActivateModalDialog() {
- if (showing_modal_dialog_) {
- // As part of showing a modal dialog we may end up back in this method
- // (showing a dialog activates the WebContents, which can trigger a call
- // to ActivateModalDialog). We ignore such a request as after the call to
- // activate the tab contents the dialog is shown.
- return;
- }
- if (active_dialog_)
- active_dialog_->ActivateModalDialog();
- }
- bool AppModalDialogQueue::HasActiveDialog() const {
- return active_dialog_ != nullptr;
- }
- AppModalDialogQueue::AppModalDialogQueue()
- : active_dialog_(nullptr), showing_modal_dialog_(false) {}
- AppModalDialogQueue::~AppModalDialogQueue() {}
- void AppModalDialogQueue::ShowModalDialog(AppModalDialogController* dialog) {
- // Be sure and set the active_dialog_ field first, otherwise if
- // ShowModalDialog triggers a call back to the queue they'll get the old
- // dialog. Also, if the dialog calls |ShowNextDialog()| before returning, that
- // would write nullptr into |active_dialog_| and this function would then undo
- // that.
- active_dialog_ = dialog;
- showing_modal_dialog_ = true;
- dialog->ShowModalDialog();
- showing_modal_dialog_ = false;
- }
- AppModalDialogController* AppModalDialogQueue::GetNextDialog() {
- while (!app_modal_dialog_queue_.empty()) {
- AppModalDialogController* dialog = app_modal_dialog_queue_.front();
- app_modal_dialog_queue_.pop_front();
- if (dialog->IsValid())
- return dialog;
- delete dialog;
- }
- return nullptr;
- }
- } // namespace javascript_dialogs
|