Index: ui/views/widget/widget_interactive_uitest.cc |
diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc |
index 91559401aebef9415daacc97a42beeaa2083d794..9f29b069b31f98dab006c9ecdd850ec3420853ca 100644 |
--- a/ui/views/widget/widget_interactive_uitest.cc |
+++ b/ui/views/widget/widget_interactive_uitest.cc |
@@ -893,6 +893,39 @@ TEST_F(WidgetCaptureTest, CaptureDesktopNativeWidget) { |
} |
#endif |
+// Test that no state is set if capture fails. |
+TEST_F(WidgetCaptureTest, FailedCaptureRequestIsNoop) { |
+ Widget widget; |
+ Widget::InitParams params = |
+ CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
+ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
+ params.bounds = gfx::Rect(400, 400); |
+ widget.Init(params); |
+ |
+ MouseView* mouse_view1 = new MouseView; |
+ MouseView* mouse_view2 = new MouseView; |
+ View* contents_view = new View; |
+ contents_view->AddChildView(mouse_view1); |
+ contents_view->AddChildView(mouse_view2); |
+ widget.SetContentsView(contents_view); |
+ |
+ mouse_view1->SetBounds(0, 0, 200, 400); |
+ mouse_view2->SetBounds(200, 0, 200, 400); |
+ |
+ // Setting capture should fail because |widget| is not visible. |
+ widget.SetCapture(mouse_view1); |
+ EXPECT_FALSE(widget.HasCapture()); |
+ |
+ widget.Show(); |
+ ui::MouseEvent mouse_press_event(ui::ET_MOUSE_PRESSED, gfx::Point(300, 10), |
+ gfx::Point(300, 10), ui::EF_NONE, ui::EF_NONE); |
+ ui::EventDispatchDetails details = widget.GetNativeWindow()->GetHost()-> |
+ event_processor()->OnEventFromSource(&mouse_press_event); |
+ ASSERT_FALSE(details.dispatcher_destroyed); |
+ EXPECT_FALSE(mouse_view1->pressed()); |
+ EXPECT_TRUE(mouse_view2->pressed()); |
+} |
+ |
#if !defined(OS_CHROMEOS) |
// Test that a synthetic mouse exit is sent to the widget which was handling |
// mouse events when a different widget grabs capture. |