Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 5556db5367fe9ce3f0effc9fa36e2b097143569a..4ad12053519e80f838f7d3fbf5347250f51b5dca 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -34,6 +34,10 @@ |
#include "ui/views/window/native_frame_view.h" |
#if defined(OS_WIN) |
+#include "ui/aura/window.h" |
+#include "ui/aura/window_tree_host.h" |
+#include "ui/base/view_prop.h" |
+#include "ui/base/win/window_event_target.h" |
#include "ui/views/win/hwnd_util.h" |
#endif |
@@ -3384,5 +3388,32 @@ TEST_F(WidgetTest, NonClientWindowValidAfterInit) { |
widget->CloseNow(); |
} |
+#if defined(OS_WIN) |
+// This test validates that sending WM_CHAR/WM_SYSCHAR/WM_SYSDEADCHAR |
+// messages via the WindowEventTarget interface implemented by the |
+// HWNDMessageHandler class does not cause a crash due to an unprocessed |
+// event |
+TEST_F(WidgetTest, CharMessagesAsKeyboardMessagesDoesNotCrash) { |
+ Widget widget; |
+ Widget::InitParams params = |
+ CreateParams(Widget::InitParams::TYPE_WINDOW); |
+ params.native_widget = new PlatformDesktopNativeWidget(&widget); |
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ widget.Init(params); |
+ widget.Show(); |
+ |
+ ui::WindowEventTarget* target = |
+ reinterpret_cast<ui::WindowEventTarget*>(ui::ViewProp::GetValue( |
+ widget.GetNativeWindow()->GetHost()->GetAcceleratedWidget(), |
+ ui::WindowEventTarget::kWin32InputEventTarget)); |
+ EXPECT_NE(nullptr, target); |
+ bool handled = false; |
+ target->HandleKeyboardMessage(WM_CHAR, 0, 0, &handled); |
+ target->HandleKeyboardMessage(WM_SYSCHAR, 0, 0, &handled); |
+ target->HandleKeyboardMessage(WM_SYSDEADCHAR, 0, 0, &handled); |
+ widget.CloseNow(); |
+} |
+#endif |
+ |
} // namespace test |
} // namespace views |