| Index: chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc
|
| diff --git a/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc b/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc
|
| index 835d23fbb9ef8b678d9b817760cdecb8b5701a85..1821634680df3c972523329f1d02c8891e7fa604 100644
|
| --- a/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc
|
| +++ b/chrome/browser/ui/views/web_contents_modal_dialog_manager_views.cc
|
| @@ -104,7 +104,31 @@ class NativeWebContentsModalDialogManagerViews
|
| }
|
|
|
| // views::WidgetObserver overrides
|
| +
|
| + // 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.
|
| virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE {
|
| + WidgetClosing(widget);
|
| + }
|
| +
|
| + virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
|
| + WidgetClosing(widget);
|
| + }
|
| +
|
| + private:
|
| + static views::Widget* GetWidget(NativeWebContentsModalDialog dialog) {
|
| + views::Widget* widget = views::Widget::GetWidgetForNativeWindow(dialog);
|
| + DCHECK(widget);
|
| + return widget;
|
| + }
|
| +
|
| + void WidgetClosing(views::Widget* widget) {
|
| #if defined(USE_ASH)
|
| gfx::NativeView view = platform_util::GetParent(widget->GetNativeView());
|
| // Allow the parent to animate again.
|
| @@ -116,13 +140,6 @@ class NativeWebContentsModalDialogManagerViews
|
| observed_widgets_.erase(widget);
|
| }
|
|
|
| - private:
|
| - static views::Widget* GetWidget(NativeWebContentsModalDialog dialog) {
|
| - views::Widget* widget = views::Widget::GetWidgetForNativeWindow(dialog);
|
| - DCHECK(widget);
|
| - return widget;
|
| - }
|
| -
|
| NativeWebContentsModalDialogManagerDelegate* native_delegate_;
|
| std::set<views::Widget*> observed_widgets_;
|
|
|
|
|