Index: ui/views/widget/widget_unittest.cc |
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc |
index b8bb6c66884f956da733b4a5103577755487e6a5..dc11612ca052709d91f6dba3c6bd661950d28d24 100644 |
--- a/ui/views/widget/widget_unittest.cc |
+++ b/ui/views/widget/widget_unittest.cc |
@@ -122,6 +122,81 @@ class MouseView : public View { |
DISALLOW_COPY_AND_ASSIGN(MouseView); |
}; |
+// A view that keeps track of the events it receives, but consumes no events. |
+class EventCountView : public View { |
+ public: |
+ EventCountView() {} |
+ virtual ~EventCountView() {} |
+ |
+ int GetEventCount(ui::EventType type) { |
+ return event_count_[type]; |
+ } |
+ |
+ void ResetCounts() { |
+ event_count_.clear(); |
+ } |
+ |
+ private: |
+ void RecordEvent(const ui::Event& event) { |
+ ++event_count_[event.type()]; |
+ } |
+ |
+ // Overridden from View: |
+ virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ return false; |
+ } |
+ virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ return false; |
+ } |
+ virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ } |
+ virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ } |
+ virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ } |
+ virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ } |
+ virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ return false; |
+ } |
+ virtual bool OnKeyReleased(const ui::KeyEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ return false; |
+ } |
+ virtual bool OnMouseWheel(const ui::MouseWheelEvent& event) OVERRIDE { |
+ RecordEvent(event); |
+ return false; |
+ } |
+ |
+ // Overridden from ui::EventHandler: |
+ virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE { |
+ RecordEvent(*event); |
+ } |
+ virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { |
+ RecordEvent(*event); |
+ } |
+ virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { |
+ RecordEvent(*event); |
+ } |
+ virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { |
+ RecordEvent(*event); |
+ } |
+ virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { |
+ RecordEvent(*event); |
+ } |
+ |
+ std::map<ui::EventType, int> event_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EventCountView); |
+}; |
+ |
// A view that does a capture on gesture-begin events. |
class GestureCaptureView : public View { |
public: |
@@ -1167,6 +1242,48 @@ TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterHideTest) { |
#endif // !defined(OS_CHROMEOS) |
+// Tests that wheel events generted from scroll events are targetted to the |
+// views under the cursor when the focused view does not processed them. |
+TEST_F(WidgetTest, WheelEventsFromScrollEventTarget) { |
+ EventCountView* focused_view = new EventCountView; |
+ focused_view->set_focusable(true); |
+ |
+ EventCountView* cursor_view = new EventCountView; |
+ |
+ focused_view->SetBounds(0, 0, 50, 40); |
+ cursor_view->SetBounds(60, 0, 50, 40); |
+ |
+ Widget* widget = CreateTopLevelPlatformWidget(); |
+ widget->GetRootView()->AddChildView(focused_view); |
+ widget->GetRootView()->AddChildView(cursor_view); |
+ |
+ focused_view->RequestFocus(); |
+ EXPECT_TRUE(focused_view->HasFocus()); |
+ |
+ // Generate a scroll event on the cursor view. The focused view will receive a |
+ // wheel event, but since it doesn't process the event, the view under the |
+ // cursor will receive the wheel event. |
+ ui::ScrollEvent scroll(ui::ET_SCROLL, gfx::Point(65, 5), 0, 0, 20); |
+ widget->OnScrollEvent(&scroll); |
+ |
+ EXPECT_EQ(0, focused_view->GetEventCount(ui::ET_SCROLL)); |
+ EXPECT_EQ(1, focused_view->GetEventCount(ui::ET_MOUSEWHEEL)); |
+ |
+ EXPECT_EQ(1, cursor_view->GetEventCount(ui::ET_SCROLL)); |
+ EXPECT_EQ(1, cursor_view->GetEventCount(ui::ET_MOUSEWHEEL)); |
+ |
+ focused_view->ResetCounts(); |
+ cursor_view->ResetCounts(); |
+ |
+ ui::ScrollEvent scroll2(ui::ET_SCROLL, gfx::Point(5, 5), 0, 0, 20); |
+ widget->OnScrollEvent(&scroll2); |
+ EXPECT_EQ(1, focused_view->GetEventCount(ui::ET_SCROLL)); |
+ EXPECT_EQ(1, focused_view->GetEventCount(ui::ET_MOUSEWHEEL)); |
+ |
+ EXPECT_EQ(0, cursor_view->GetEventCount(ui::ET_SCROLL)); |
+ EXPECT_EQ(0, cursor_view->GetEventCount(ui::ET_MOUSEWHEEL)); |
+} |
+ |
#endif // defined(USE_AURA) |
} // namespace |