Chromium Code Reviews| Index: ui/android/view_android.cc |
| diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc |
| index 489a1b930c6ed2995f824e310d458b041b3a5302..fa065bc2c4f397f2045d41fc22b0fb17aaf0258b 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" |
| @@ -102,6 +103,10 @@ float ViewAndroid::GetDipScale() { |
| return ui::GetScaleFactorForNativeView(this); |
| } |
| +bool ViewAndroid::HitBy(const gfx::Point& point) { |
|
boliu
2017/05/24 22:54:02
just inline this one line method with a single cal
Jinsuk Kim
2017/05/25 03:18:18
Done.
|
| + return layout_params_.HitBy(point); |
| +} |
| + |
| ScopedJavaLocalRef<jobject> ViewAndroid::GetEventForwarder() { |
| if (!event_forwarder_) { |
| DCHECK(!RootPathHasEventForwarder(parent_)) |
| @@ -302,59 +307,76 @@ gfx::Size ViewAndroid::GetPhysicalBackingSize() { |
| return physical_size_; |
| } |
| +bool ViewAndroid::OnDragEvent(const DragEventAndroid& event) { |
| + return HitTest(base::Bind(&ViewAndroid::SendDragEventToClient), event, |
| + event.location()); |
| +} |
| + |
| +// static |
| +bool ViewAndroid::SendDragEventToClient(ViewClient* client, |
| + const DragEventAndroid& event, |
| + const gfx::Point& 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::Point& 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::Point& 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::Point& 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, typename T> |
| +bool ViewAndroid::HitTest(T send_to_client, |
|
boliu
2017/05/24 22:54:02
I think T doesn't need to be a template, just decl
Jinsuk Kim
2017/05/25 03:18:18
Done.
|
| + const E& event, |
| + const gfx::Point& 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::Point offset_point(point); |
| + offset_point.Offset(-layout_params_.x, -layout_params_.y); |
| // Match from back to front for hit testing. |
| for (auto* child : base::Reversed(children_)) { |
| - bool matched = child->layout_params_.match_parent; |
| - if (!matched) { |
| - 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)); |
| - } |
| - if (matched && child->HitTest(send_to_client, *e)) |
| + if (child->HitBy(offset_point) && |
| + child->HitTest(send_to_client, event, offset_point)) |
| return true; |
| } |
| } |