Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 0b11a970a5a4b620474311576caaebdf62fce94e..8635f48ef5c154164bba66f03fbd2b7aa4eac42b 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -3621,5 +3621,96 @@ TEST_F(WidgetTest, WidgetRemovalsObserverCalledWhenMovingBetweenWidgets) { |
widget->RemoveRemovalsObserver(&removals_observer); |
} |
+#if defined(OS_WIN) |
+ |
+// Provides functionality to create a window modal dialog. |
+class ModalDialogDelegate : public DialogDelegateView { |
+public: |
+ explicit ModalDialogDelegate(ui::ModalType type) : type_(type) {} |
+ ~ModalDialogDelegate() override {} |
+ |
+ // WidgetDelegate overrides. |
+ ui::ModalType GetModalType() const override { return type_; } |
+ |
+private: |
+ ui::ModalType type_; |
sky
2016/05/19 16:20:16
nit: const
kylix_rd
2016/05/19 16:43:10
Done.
|
+ |
+ DISALLOW_COPY_AND_ASSIGN(ModalDialogDelegate); |
+}; |
+ |
+// Tests the case where an intervening owner popup window is destroyed out from |
+// under the currently active modal top-level window. In this instance, the |
+// remaining top-level windows should be re-enabled |
sky
2016/05/19 16:20:16
nit: end with '.'.
kylix_rd
2016/05/19 16:43:10
Done.
|
+TEST_F(WidgetTest, WindowModalOwnerDestroyedEnabledTest) { |
+ // Create a top level widget. |
+ Widget top_level_widget; |
+ Widget::InitParams init_params = |
+ CreateParams(Widget::InitParams::TYPE_WINDOW); |
+ init_params.show_state = ui::SHOW_STATE_NORMAL; |
+ gfx::Rect initial_bounds(0, 0, 500, 500); |
+ init_params.bounds = initial_bounds; |
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ init_params.native_widget = CreatePlatformDesktopNativeWidgetImpl( |
+ init_params, &top_level_widget, nullptr); |
+ top_level_widget.Init(init_params); |
+ top_level_widget.Show(); |
+ |
+ // Create a modal dialog. |
+ // This instance will be destroyed when the dialog is destroyed. |
sky
2016/05/19 16:20:16
'this' is confusing here. As the comment is right
kylix_rd
2016/05/19 16:43:10
Done.
|
+ Widget owner_dialog_widget; |
+ ModalDialogDelegate* dialog_delegate = |
+ new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW); |
+ |
+ init_params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
+ init_params.show_state = ui::SHOW_STATE_NORMAL; |
+ init_params.bounds = gfx::Rect(100, 100, 200, 200); |
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ init_params.delegate = dialog_delegate; |
+ init_params.parent = top_level_widget.GetNativeView(); |
+ init_params.native_widget = CreatePlatformDesktopNativeWidgetImpl( |
+ init_params, &owner_dialog_widget, nullptr); |
+ owner_dialog_widget.Init(init_params); |
+ |
+ HWND owner_hwnd = HWNDForWidget(&owner_dialog_widget); |
+ |
+ owner_dialog_widget.Show(); |
+ |
+ // Now Create an owned modal dialog |
sky
2016/05/19 16:20:16
nit: end with '.'
kylix_rd
2016/05/19 16:43:10
Done.
|
+ // Like above, this instance will be destroyed when the dialog is destroyed. |
sky
2016/05/19 16:20:16
Similar comment. Also, it would more clear if you
kylix_rd
2016/05/19 16:43:10
Done.
|
+ Widget owned_dialog_widget; |
+ dialog_delegate = |
+ new ModalDialogDelegate(ui::MODAL_TYPE_WINDOW); |
+ |
+ init_params = CreateParams(Widget::InitParams::TYPE_WINDOW); |
+ init_params.show_state = ui::SHOW_STATE_NORMAL; |
+ init_params.bounds = gfx::Rect(150, 150, 250, 250); |
+ init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ init_params.delegate = dialog_delegate; |
+ init_params.parent = owner_dialog_widget.GetNativeView(); |
+ init_params.native_widget = CreatePlatformDesktopNativeWidgetImpl( |
+ init_params, &owned_dialog_widget, nullptr); |
+ owned_dialog_widget.Init(init_params); |
+ |
+ HWND owned_hwnd = HWNDForWidget(&owned_dialog_widget); |
+ |
+ owned_dialog_widget.Show(); |
+ |
+ HWND top_hwnd = HWNDForWidget(&top_level_widget); |
+ |
+ EXPECT_FALSE(!!IsWindowEnabled(owner_hwnd)); |
+ EXPECT_FALSE(!!IsWindowEnabled(top_hwnd)); |
+ EXPECT_TRUE(!!IsWindowEnabled(owned_hwnd)); |
+ |
+ owner_dialog_widget.CloseNow(); |
+ |
+ EXPECT_FALSE(!!IsWindow(owner_hwnd)); |
+ EXPECT_FALSE(!!IsWindow(owned_hwnd)); |
+ EXPECT_TRUE(!!IsWindowEnabled(top_hwnd)); |
+ |
+ top_level_widget.CloseNow(); |
+} |
+ |
+#endif |
+ |
} // namespace test |
} // namespace views |