Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(367)

Unified Diff: content/browser/android/content_view_core_impl.cc

Issue 120513005: [Android] Perform eager gesture recognition on MotionEvents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More cleanup Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/android/content_view_core_impl.cc
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc
index 00b3442010290dafd518dcdc525b0d1ad4100529..bb235bc871aaf0d7be9e799d3b64bed26fa5b05c 100644
--- a/content/browser/android/content_view_core_impl.cc
+++ b/content/browser/android/content_view_core_impl.cc
@@ -176,7 +176,9 @@ ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, jobject obj,
view_android_(view_android),
window_android_(window_android),
device_orientation_(0),
- geolocation_needs_pause_(false) {
+ geolocation_needs_pause_(false),
+ gesture_event_queue_(new GestureEventQueue(this)),
+ handling_touch_event_(false) {
CHECK(web_contents) <<
"A ContentViewCoreImpl should be created with a valid WebContents.";
@@ -304,6 +306,22 @@ void ContentViewCoreImpl::RenderViewReady() {
SendOrientationChangeEventInternal();
}
+void ContentViewCoreImpl::ForwardGestureEvent(
+ const blink::WebGestureEvent& event) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
+ if (j_obj.is_null())
+ return;
+
+ if (Java_ContentViewCore_onForwardingGestureEvent(
+ env, j_obj.obj(), event.type, event.x, event.y))
+ return;
+
+ RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
+ if (rwhv)
+ rwhv->SendGestureEvent(event);
+}
+
RenderWidgetHostViewAndroid*
ContentViewCoreImpl::GetRenderWidgetHostViewAndroid() {
RenderWidgetHostView* rwhv = NULL;
@@ -497,20 +515,15 @@ void ContentViewCoreImpl::ShowSelectPopupMenu(
}
void ContentViewCoreImpl::ConfirmTouchEvent(InputEventAckState ack_result) {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
- if (j_obj.is_null())
- return;
- Java_ContentViewCore_confirmTouchEvent(env, j_obj.obj(),
- static_cast<jint>(ack_result));
+ gesture_event_queue_->OnTouchEventAck(ack_result);
}
-void ContentViewCoreImpl::UnhandledFlingStartEvent() {
+void ContentViewCoreImpl::UnhandledFlingStartEvent(float vx, float vy) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
if (j_obj.is_null())
return;
- Java_ContentViewCore_unhandledFlingStartEvent(env, j_obj.obj());
+ Java_ContentViewCore_unhandledFlingStartEvent(env, j_obj.obj(), vx, vy);
}
void ContentViewCoreImpl::OnScrollUpdateGestureConsumed() {
@@ -521,16 +534,6 @@ void ContentViewCoreImpl::OnScrollUpdateGestureConsumed() {
Java_ContentViewCore_onScrollUpdateGestureConsumed(env, j_obj.obj());
}
-void ContentViewCoreImpl::HasTouchEventHandlers(bool need_touch_events) {
- JNIEnv* env = AttachCurrentThread();
- ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
- if (j_obj.is_null())
- return;
- Java_ContentViewCore_hasTouchEventHandlers(env,
- j_obj.obj(),
- need_touch_events);
-}
-
bool ContentViewCoreImpl::HasFocus() {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
@@ -896,21 +899,30 @@ void ContentViewCoreImpl::SendOrientationChangeEvent(JNIEnv* env,
}
}
-jboolean ContentViewCoreImpl::SendTouchEvent(JNIEnv* env,
- jobject obj,
- jlong time_ms,
- jint type,
- jobjectArray pts) {
+void ContentViewCoreImpl::OnTouchEventHandlingBegin(JNIEnv* env,
+ jobject obj,
+ jlong time_ms,
+ jint type,
+ jobjectArray pts) {
+ DCHECK(!handling_touch_event_);
+ handling_touch_event_ = true;
+
+ blink::WebTouchEvent event;
+ TouchPoint::BuildWebTouchEvent(env, type, time_ms, GetDpiScale(), pts, event);
+ pending_touch_event_ = event;
+
+ pending_gesture_packet_ = GestureEventPacket::FromTouch(event);
+}
+
+void ContentViewCoreImpl::OnTouchEventHandlingEnd(JNIEnv* env, jobject obj) {
+ DCHECK(handling_touch_event_);
+ handling_touch_event_ = false;
+
+ gesture_event_queue_->OnGestureEventPacket(pending_gesture_packet_);
+
RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
- if (rwhv) {
- using blink::WebTouchEvent;
- blink::WebTouchEvent event;
- TouchPoint::BuildWebTouchEvent(env, type, time_ms, GetDpiScale(), pts,
- event);
- rwhv->SendTouchEvent(event);
- return true;
- }
- return false;
+ if (rwhv)
+ rwhv->SendTouchEvent(pending_touch_event_);
}
float ContentViewCoreImpl::GetTouchPaddingDip() {
@@ -980,9 +992,12 @@ WebGestureEvent ContentViewCoreImpl::MakeGestureEvent(
void ContentViewCoreImpl::SendGestureEvent(
const blink::WebGestureEvent& event) {
- RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
- if (rwhv)
- rwhv->SendGestureEvent(event);
+ if (handling_touch_event_) {
+ pending_gesture_packet_.Push(event);
+ return;
+ }
+ gesture_event_queue_->OnGestureEventPacket(
+ GestureEventPacket::FromGesture(event));
}
void ContentViewCoreImpl::ScrollBegin(JNIEnv* env,

Powered by Google App Engine
This is Rietveld 408576698