| Index: components/constrained_window/native_web_contents_modal_dialog_manager_views.h
|
| diff --git a/components/constrained_window/native_web_contents_modal_dialog_manager_views.h b/components/constrained_window/native_web_contents_modal_dialog_manager_views.h
|
| index 382b9ce8cad05c93948100ca109ac8965913d206..d6bbf96986c33fc54a8277ae2df40986e1845f41 100644
|
| --- a/components/constrained_window/native_web_contents_modal_dialog_manager_views.h
|
| +++ b/components/constrained_window/native_web_contents_modal_dialog_manager_views.h
|
| @@ -10,6 +10,10 @@
|
| #include "base/macros.h"
|
| #include "components/web_modal/modal_dialog_host.h"
|
| #include "components/web_modal/single_web_contents_dialog_manager.h"
|
| +#if defined(USE_AURA)
|
| +#include "ui/aura/window_observer.h"
|
| +#endif
|
| +#include "ui/base/accelerators/accelerator.h"
|
| #include "ui/gfx/native_widget_types.h"
|
| #include "ui/views/widget/widget_observer.h"
|
|
|
| @@ -20,20 +24,26 @@ class Widget;
|
| namespace constrained_window {
|
|
|
| // Class for parenting a tab-modal views dialog off of a views browser.
|
| +#if defined(USE_AURA)
|
| class NativeWebContentsModalDialogManagerViews
|
| : public web_modal::SingleWebContentsDialogManager,
|
| public web_modal::ModalDialogHostObserver,
|
| - public views::WidgetObserver {
|
| + public views::WidgetObserver,
|
| + public aura::WindowObserver {
|
| public:
|
| NativeWebContentsModalDialogManagerViews(
|
| gfx::NativeWindow dialog,
|
| - web_modal::SingleWebContentsDialogManagerDelegate* native_delegate);
|
| + web_modal::SingleWebContentsDialogManagerDelegate* native_delegate,
|
| + bool is_toplevel, ui::AcceleratorTarget* target);
|
|
|
| ~NativeWebContentsModalDialogManagerViews() override;
|
|
|
| // Sets up this object to manage the |dialog_|. Registers for closing events
|
| - // in order to notify the delegate.
|
| - void ManageDialog();
|
| + // in order to notify the delegate. If |is_toplevel| is true, the dialog will
|
| + // be set up as a top level dialog (peer of the host's native window), with
|
| + // the host as its transient parent. However, unlike most window modal
|
| + // dialogs, it will not block all events to its transient parent.
|
| + void ManageDialog(bool is_toplevel);
|
|
|
| // web_modal::SingleWebContentsDialogManager:
|
| void Show() override;
|
| @@ -61,6 +71,17 @@ class NativeWebContentsModalDialogManagerViews
|
| void HostChanged(web_modal::WebContentsModalDialogHost* new_host) override;
|
| gfx::NativeWindow dialog() override;
|
|
|
| +#if defined(USE_AURA)
|
| + // aura::WindowObserver
|
| + void OnWindowBoundsChanged(aura::Window* window,
|
| + const gfx::Rect& old_bounds,
|
| + const gfx::Rect& new_bounds) override;
|
| +
|
| + void OnWindowRemovingFromRootWindow(aura::Window* window,
|
| + aura::Window* new_root) override;
|
| + void OnWindowDestroying(aura::Window* window) override;
|
| +#endif
|
| +
|
| protected:
|
| web_modal::SingleWebContentsDialogManagerDelegate* native_delegate() {
|
| return native_delegate_;
|
| @@ -74,19 +95,96 @@ class NativeWebContentsModalDialogManagerViews
|
|
|
| static views::Widget* GetWidget(gfx::NativeWindow dialog);
|
|
|
| +
|
| private:
|
| void WidgetClosing(views::Widget* widget);
|
| + void OnNonClippedPositionRequiresUpdate();
|
|
|
| web_modal::SingleWebContentsDialogManagerDelegate* native_delegate_;
|
| gfx::NativeWindow dialog_;
|
| web_modal::WebContentsModalDialogHost* host_;
|
| bool host_destroying_;
|
| + ui::AcceleratorTarget* target_;
|
| std::set<views::Widget*> observed_widgets_;
|
| std::set<views::Widget*> shown_widgets_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(NativeWebContentsModalDialogManagerViews);
|
| };
|
| +#else
|
| +class NativeWebContentsModalDialogManagerViews
|
| + : public web_modal::SingleWebContentsDialogManager,
|
| + public web_modal::ModalDialogHostObserver,
|
| + public views::WidgetObserver {
|
| + public:
|
| + NativeWebContentsModalDialogManagerViews(
|
| + gfx::NativeWindow dialog,
|
| + web_modal::SingleWebContentsDialogManagerDelegate* native_delegate,
|
| + bool is_toplevel, ui::AcceleratorTarget* target);
|
| +
|
| + ~NativeWebContentsModalDialogManagerViews() override;
|
| +
|
| + // Sets up this object to manage the |dialog_|. Registers for closing events
|
| + // in order to notify the delegate. If |is_toplevel| is true, the dialog will
|
| + // be set up as a top level dialog (peer of the host's native window), with
|
| + // the host as its transient parent. However, unlike most window modal
|
| + // dialogs, it will not block all events to its transient parent.
|
| + void ManageDialog(bool is_toplevel);
|
| +
|
| + // web_modal::SingleWebContentsDialogManager:
|
| + void Show() override;
|
| + void Hide() override;
|
| + void Close() override;
|
| + void Focus() override;
|
| + void Pulse() override;
|
| +
|
| + // web_modal::ModalDialogHostObserver:
|
| + void OnPositionRequiresUpdate() override;
|
| + void OnHostDestroying() override;
|
|
|
| + // views::WidgetObserver:
|
| +
|
| + // NOTE(wittman): OnWidgetClosing is overriden to ensure that, when the widget
|
| + // is explicitly closed, the destruction occurs within the same call
|
| + // stack. This avoids event races that lead to non-deterministic destruction
|
| + // ordering in e.g. the print preview dialog. OnWidgetDestroying is overridden
|
| + // because OnWidgetClosing is *only* invoked on explicit close, not when the
|
| + // widget is implicitly destroyed due to its parent being closed. This
|
| + // situation occurs with app windows. WidgetClosing removes the observer, so
|
| + // only one of these two functions is ever invoked for a given widget.
|
| + void OnWidgetClosing(views::Widget* widget) override;
|
| + void OnWidgetDestroying(views::Widget* widget) override;
|
| + void HostChanged(web_modal::WebContentsModalDialogHost* new_host) override;
|
| + gfx::NativeWindow dialog() override;
|
| +
|
| + protected:
|
| + web_modal::SingleWebContentsDialogManagerDelegate* native_delegate() {
|
| + return native_delegate_;
|
| + }
|
| +
|
| + // By default just calls widget->Show() or Hide(), but allows a derived class
|
| + // to override in order to hide an alternate way (e.g. if the default hide
|
| + // would tear down attached dialogs too early).
|
| + virtual void ShowWidget(views::Widget* widget);
|
| + virtual void HideWidget(views::Widget* widget);
|
| +
|
| + static views::Widget* GetWidget(gfx::NativeWindow dialog);
|
| +
|
| +
|
| + private:
|
| + void WidgetClosing(views::Widget* widget);
|
| + void OnNonClippedPositionRequiresUpdate();
|
| +
|
| + web_modal::SingleWebContentsDialogManagerDelegate* native_delegate_;
|
| + gfx::NativeWindow dialog_;
|
| + web_modal::WebContentsModalDialogHost* host_;
|
| + bool host_destroying_;
|
| + ui::AcceleratorTarget* target_;
|
| + std::set<views::Widget*> observed_widgets_;
|
| + std::set<views::Widget*> shown_widgets_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(NativeWebContentsModalDialogManagerViews);
|
| +};
|
| +#endif // USE_AURA
|
| } // namespace constrained_window
|
|
|
| #endif // COMPONENTS_CONSTRAINED_WINDOW_NATIVE_WEB_CONTENTS_MODAL_DIALOG_MANAGER_VIEWS_H_
|
|
|