Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1870)

Unified Diff: ui/views/widget/widget_unittest.cc

Issue 2008103002: If the window handle is destroyed because of an owner being destroyed, ensure any disabled windows … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2704
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/views/win/hwnd_message_handler.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/widget_unittest.cc
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index 0b8c645a5ea7586fe4ba6bde6c308f007839f850..12dec089cc93232a9b7a5f98e0499128cc6a8326 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -3506,5 +3506,99 @@ 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:
+ const ui::ModalType type_;
+
+ 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.
+TEST_F(WidgetTest, WindowModalOwnerDestroyedEnabledTest) {
+ // top_level_widget owns owner_dialog_widget which owns owned_dialog_widget.
+ Widget top_level_widget;
+ Widget owner_dialog_widget;
+ Widget owned_dialog_widget;
+ // Create the 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 the owner modal dialog.
+ // owner_dialog_delegate instance will be destroyed when the dialog
+ // is destroyed.
+ ModalDialogDelegate* owner_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 = owner_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();
+
+ // Create the owned modal dialog.
+ // As above, the owned_dialog_instance instance will be destroyed
+ // when the dialog is destroyed.
+ ModalDialogDelegate* owned_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 = owned_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 // defined(OS_WIN)
+
} // namespace test
} // namespace views
« no previous file with comments | « no previous file | ui/views/win/hwnd_message_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698