Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index 00413e242552530501953cfff965babd1bf70d50..36a83f1a82b6d3bf19e2c9ff5e5538c1744c91a7 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -1944,31 +1944,68 @@ TEST_F(WidgetTest, MAYBE_DisableTestRootViewHandlersWhenHidden) { |
widget->Close(); |
} |
-class GestureEndConsumerView : public View { |
- private: |
- virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
- if (event->type() == ui::ET_GESTURE_END) |
- event->SetHandled(); |
- } |
+// Convenience to make constructing a GestureEvent simpler. |
+class GestureEventForTest : public ui::GestureEvent { |
+ public: |
+ GestureEventForTest(ui::EventType type, int x, int y) |
+ : GestureEvent(x, |
+ y, |
+ 0, |
+ base::TimeDelta(), |
+ ui::GestureEventDetails(type, 0.0f, 0.0f)) {} |
}; |
+// Tests that the |gesture_handler_| member in RootView is always NULL |
+// after the dispatch of a ui::ET_GESTURE_END event corresponding to |
+// the release of the final touch point on the screen. |
TEST_F(WidgetTest, GestureHandlerNotSetOnGestureEnd) { |
Widget* widget = CreateTopLevelNativeWidget(); |
widget->SetBounds(gfx::Rect(0, 0, 300, 300)); |
- View* view = new GestureEndConsumerView(); |
+ EventCountView* view = new EventCountView(); |
view->SetBounds(0, 0, 300, 300); |
internal::RootView* root_view = |
static_cast<internal::RootView*>(widget->GetRootView()); |
root_view->AddChildView(view); |
- |
widget->Show(); |
+ |
+ // If no gesture handler is set, dispatching only a ui::ET_GESTURE_END |
+ // event should not set the gesture handler if the event remains unhandled. |
EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
- ui::GestureEvent end(15, |
- 15, |
- 0, |
- base::TimeDelta(), |
- ui::GestureEventDetails(ui::ET_GESTURE_END, 0, 0)); |
+ GestureEventForTest end(ui::ET_GESTURE_END, 15, 15); |
+ widget->OnGestureEvent(&end); |
+ EXPECT_FALSE(end.handled()); |
+ EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
+ |
+ // If no gesture handler is set, dispatching only a ui::ET_GESTURE_END |
+ // event should not set the gesture handler event if the event is handled. |
+ view->set_handle_mode(EventCountView::CONSUME_EVENTS); |
+ end = GestureEventForTest(ui::ET_GESTURE_END, 15, 15); |
widget->OnGestureEvent(&end); |
+ EXPECT_TRUE(end.handled()); |
+ EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
+ |
+ // If the gesture handler has been set by a previous gesture, then |
+ // it should be reset to NULL by a ui::ET_GESTURE_END. |
+ GestureEventForTest tap(ui::ET_GESTURE_TAP, 15, 15); |
+ widget->OnGestureEvent(&tap); |
+ EXPECT_TRUE(tap.handled()); |
+ EXPECT_EQ(view, GetGestureHandler(root_view)); |
+ end = GestureEventForTest(ui::ET_GESTURE_END, 15, 15); |
+ widget->OnGestureEvent(&end); |
+ EXPECT_TRUE(end.handled()); |
+ EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
+ |
+ // If the gesture handler has been set by a previous gesture, then |
+ // it should be reset to NULL by a ui::ET_GESTURE_END, even when |
+ // the gesture handler does not actually handle the end event. |
+ tap = GestureEventForTest(ui::ET_GESTURE_TAP, 15, 15); |
+ widget->OnGestureEvent(&tap); |
+ EXPECT_TRUE(tap.handled()); |
+ EXPECT_EQ(view, GetGestureHandler(root_view)); |
+ end = GestureEventForTest(ui::ET_GESTURE_END, 15, 15); |
+ view->set_handle_mode(EventCountView::PROPAGATE_EVENTS); |
+ widget->OnGestureEvent(&end); |
+ EXPECT_FALSE(end.handled()); |
EXPECT_EQ(NULL, GetGestureHandler(root_view)); |
widget->Close(); |
@@ -2448,20 +2485,6 @@ class FullscreenAwareFrame : public views::NonClientFrameView { |
DISALLOW_COPY_AND_ASSIGN(FullscreenAwareFrame); |
}; |
-// Convenience to make constructing a GestureEvent simpler. |
-class GestureEventForTest : public ui::GestureEvent { |
- public: |
- GestureEventForTest(ui::EventType type, int x, int y) |
- : GestureEvent(x, |
- y, |
- 0, |
- base::TimeDelta(), |
- ui::GestureEventDetails(type, 0.0f, 0.0f)) {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(GestureEventForTest); |
-}; |
- |
} // namespace |
// Tests that frame Layout is called when a widget goes fullscreen without |