Index: ui/android/view_android.cc |
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc |
index 489a1b930c6ed2995f824e310d458b041b3a5302..abec6aba03397c9236c6797d82e460e71c0cb5be 100644 |
--- a/ui/android/view_android.cc |
+++ b/ui/android/view_android.cc |
@@ -15,6 +15,7 @@ |
#include "ui/android/view_client.h" |
#include "ui/android/window_android.h" |
#include "ui/base/layout.h" |
+#include "ui/events/android/drag_event_android.h" |
#include "ui/events/android/motion_event_android.h" |
#include "url/gurl.h" |
@@ -302,48 +303,72 @@ gfx::Size ViewAndroid::GetPhysicalBackingSize() { |
return physical_size_; |
} |
+bool ViewAndroid::OnDragEvent(const DragEventAndroid& event) { |
+ return HitTest(base::Bind(&ViewAndroid::SendDragEventToClient), event, |
+ event.location_f()); |
+} |
+ |
+// static |
+bool ViewAndroid::SendDragEventToClient(ViewClient* client, |
+ const DragEventAndroid& event, |
+ const gfx::PointF& point) { |
+ std::unique_ptr<DragEventAndroid> e = event.CreateFor(point); |
+ return client->OnDragEvent(*e); |
+} |
+ |
bool ViewAndroid::OnTouchEvent(const MotionEventAndroid& event, |
bool for_touch_handle) { |
return HitTest( |
- base::Bind(&ViewAndroid::SendTouchEventToClient, for_touch_handle), |
- event); |
+ base::Bind(&ViewAndroid::SendTouchEventToClient, for_touch_handle), event, |
+ event.GetPoint()); |
} |
+// static |
bool ViewAndroid::SendTouchEventToClient(bool for_touch_handle, |
ViewClient* client, |
- const MotionEventAndroid& event) { |
- return client->OnTouchEvent(event, for_touch_handle); |
+ const MotionEventAndroid& event, |
+ const gfx::PointF& point) { |
+ std::unique_ptr<MotionEventAndroid> e(event.CreateFor(point)); |
+ return client->OnTouchEvent(*e, for_touch_handle); |
} |
bool ViewAndroid::OnMouseEvent(const MotionEventAndroid& event) { |
- return HitTest(base::Bind(&ViewAndroid::SendMouseEventToClient), event); |
+ return HitTest(base::Bind(&ViewAndroid::SendMouseEventToClient), event, |
+ event.GetPoint()); |
} |
// static |
bool ViewAndroid::SendMouseEventToClient(ViewClient* client, |
- const MotionEventAndroid& event) { |
- return client->OnMouseEvent(event); |
+ const MotionEventAndroid& event, |
+ const gfx::PointF& point) { |
+ std::unique_ptr<MotionEventAndroid> e(event.CreateFor(point)); |
+ return client->OnMouseEvent(*e); |
} |
-// static |
bool ViewAndroid::OnMouseWheelEvent(const MotionEventAndroid& event) { |
- return HitTest(base::Bind(&ViewAndroid::SendMouseWheelEventToClient), event); |
+ return HitTest(base::Bind(&ViewAndroid::SendMouseWheelEventToClient), event, |
+ event.GetPoint()); |
} |
// static |
bool ViewAndroid::SendMouseWheelEventToClient(ViewClient* client, |
- const MotionEventAndroid& event) { |
- return client->OnMouseWheelEvent(event); |
+ const MotionEventAndroid& event, |
+ const gfx::PointF& point) { |
+ std::unique_ptr<MotionEventAndroid> e(event.CreateFor(point)); |
+ return client->OnMouseWheelEvent(*e); |
} |
-bool ViewAndroid::HitTest(ViewClientCallback send_to_client, |
- const MotionEventAndroid& event) { |
- if (client_ && send_to_client.Run(client_, event)) |
+template <typename E> |
+bool ViewAndroid::HitTest(ViewClientCallback<E> send_to_client, |
+ const E& event, |
+ const gfx::PointF& point) { |
+ if (client_ && send_to_client.Run(client_, event, point)) |
return true; |
if (!children_.empty()) { |
- std::unique_ptr<MotionEventAndroid> e( |
- event.Offset(-layout_params_.x, -layout_params_.y)); |
+ gfx::PointF offset_point(point); |
+ offset_point.Offset(-layout_params_.x, -layout_params_.y); |
+ gfx::Point int_point = gfx::ToFlooredPoint(offset_point); |
// Match from back to front for hit testing. |
for (auto* child : base::Reversed(children_)) { |
@@ -352,9 +377,9 @@ bool ViewAndroid::HitTest(ViewClientCallback send_to_client, |
gfx::Rect bound(child->layout_params_.x, child->layout_params_.y, |
child->layout_params_.width, |
child->layout_params_.height); |
- matched = bound.Contains(e->GetX(0), e->GetY(0)); |
+ matched = bound.Contains(int_point); |
} |
- if (matched && child->HitTest(send_to_client, *e)) |
+ if (matched && child->HitTest(send_to_client, event, offset_point)) |
return true; |
} |
} |