1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // Copyright (c) 2013 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.
- #ifndef UI_SHELL_DIALOGS_BASE_SHELL_DIALOG_WIN_H_
- #define UI_SHELL_DIALOGS_BASE_SHELL_DIALOG_WIN_H_
- #include <shlobj.h>
- #include <memory>
- #include <set>
- #include "base/memory/scoped_refptr.h"
- #include "ui/shell_dialogs/base_shell_dialog.h"
- #include "ui/shell_dialogs/shell_dialogs_export.h"
- namespace base {
- class SingleThreadTaskRunner;
- }
- namespace ui {
- ///////////////////////////////////////////////////////////////////////////////
- // A base class for all shell dialog implementations that handles showing a
- // shell dialog modally on its own thread.
- class SHELL_DIALOGS_EXPORT BaseShellDialogImpl {
- public:
- BaseShellDialogImpl();
- BaseShellDialogImpl(const BaseShellDialogImpl&) = delete;
- BaseShellDialogImpl& operator=(const BaseShellDialogImpl&) = delete;
- virtual ~BaseShellDialogImpl();
- // Disables the window |owner|. Can be run from either the ui or the dialog
- // thread. This function is called on the dialog thread after the modal
- // Windows Common dialog functions return because Windows automatically
- // re-enables the owning window when those functions return, but we don't
- // actually want them to be re-enabled until the response of the dialog
- // propagates back to the UI thread, so we disable the owner manually after
- // the Common dialog function returns.
- static void DisableOwner(HWND owner);
- protected:
- // Represents a run of a dialog.
- class SHELL_DIALOGS_EXPORT RunState {
- public:
- RunState();
- RunState(const RunState&) = delete;
- RunState& operator=(const RunState&) = delete;
- ~RunState();
- // Owning HWND, may be null.
- HWND owner;
- // Dedicated sequence on which the dialog runs.
- scoped_refptr<base::SingleThreadTaskRunner> dialog_task_runner;
- };
- // Called at the beginning of a modal dialog run. Disables the owner window
- // and tracks it. Returns the dedicated single-threaded sequence that the
- // dialog will be run on.
- std::unique_ptr<RunState> BeginRun(HWND owner);
- // Cleans up after a dialog run. If the run_state has a valid HWND this makes
- // sure that the window is enabled. This is essential because BeginRun
- // aggressively guards against multiple modal dialogs per HWND. Must be called
- // on the UI thread after the result of the dialog has been determined.
- void EndRun(std::unique_ptr<RunState> run_state);
- // Returns true if a modal shell dialog is currently active for the specified
- // owner. Must be called on the UI thread.
- bool IsRunningDialogForOwner(HWND owner) const;
- private:
- typedef std::set<HWND> Owners;
- // A list of windows that currently own active shell dialogs for this
- // instance. For example, if the DownloadManager owns an instance of this
- // object and there are two browser windows open both with Save As dialog
- // boxes active, this list will consist of the two browser windows' HWNDs.
- // The derived class must call EndRun once the dialog is done showing to
- // remove the owning HWND from this list.
- // This object is static since it is maintained for all instances of this
- // object - i.e. you can't have two file pickers open for the
- // same owner, even though they might be represented by different instances
- // of this object.
- // This set only contains non-null HWNDs. NULL hwnds are not added to this
- // list.
- static Owners& GetOwners();
- static int instance_count_;
- };
- } // namespace ui
- #endif // UI_SHELL_DIALOGS_BASE_SHELL_DIALOG_WIN_H_
|