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

Side by Side 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: Code 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/android/content_view_core_impl.h" 5 #include "content/browser/android/content_view_core_impl.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h" 8 #include "base/android/jni_array.h"
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h" 10 #include "base/android/scoped_java_ref.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 JNIEnv* env, 103 JNIEnv* env,
104 const gfx::Rect& rect) { 104 const gfx::Rect& rect) {
105 return ScopedJavaLocalRef<jobject>( 105 return ScopedJavaLocalRef<jobject>(
106 Java_ContentViewCore_createRect(env, 106 Java_ContentViewCore_createRect(env,
107 static_cast<int>(rect.x()), 107 static_cast<int>(rect.x()),
108 static_cast<int>(rect.y()), 108 static_cast<int>(rect.y()),
109 static_cast<int>(rect.right()), 109 static_cast<int>(rect.right()),
110 static_cast<int>(rect.bottom()))); 110 static_cast<int>(rect.bottom())));
111 } 111 }
112 112
113 bool PossiblyTriggeredByTimeout(const WebGestureEvent& event) {
114 switch (event.type) {
115 case WebInputEvent::GestureShowPress:
116 case WebInputEvent::GestureLongPress:
117 return true;
118 // On Android, a GestureTap may be sent after a certain timeout window
119 // if there is no GestureDoubleTap follow-up.
120 case WebInputEvent::GestureTap:
121 return true;
122 // On Android, a GestureTapCancel may be triggered by the loss of window
123 // focus (e.g., following a GestureLongPress).
124 case WebInputEvent::GestureTapCancel:
125 return true;
126 default:
127 break;
128 }
129 return false;
130 }
131
132 GestureEventPacket::GestureSource
133 ToGestureSource(const WebGestureEvent& event) {
134 return PossiblyTriggeredByTimeout(event) ? GestureEventPacket::TOUCH_TIMEOUT
135 : GestureEventPacket::SYNTHETIC;
136 }
137
113 } // namespace 138 } // namespace
114 139
115 // Enables a callback when the underlying WebContents is destroyed, to enable 140 // Enables a callback when the underlying WebContents is destroyed, to enable
116 // nulling the back-pointer. 141 // nulling the back-pointer.
117 class ContentViewCoreImpl::ContentViewUserData 142 class ContentViewCoreImpl::ContentViewUserData
118 : public base::SupportsUserData::Data { 143 : public base::SupportsUserData::Data {
119 public: 144 public:
120 explicit ContentViewUserData(ContentViewCoreImpl* content_view_core) 145 explicit ContentViewUserData(ContentViewCoreImpl* content_view_core)
121 : content_view_core_(content_view_core) { 146 : content_view_core_(content_view_core) {
122 } 147 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 java_ref_(env, obj), 194 java_ref_(env, obj),
170 web_contents_(static_cast<WebContentsImpl*>(web_contents)), 195 web_contents_(static_cast<WebContentsImpl*>(web_contents)),
171 root_layer_(cc::Layer::Create()), 196 root_layer_(cc::Layer::Create()),
172 vsync_interval_(base::TimeDelta::FromMicroseconds( 197 vsync_interval_(base::TimeDelta::FromMicroseconds(
173 kDefaultVSyncIntervalMicros)), 198 kDefaultVSyncIntervalMicros)),
174 expected_browser_composite_time_(base::TimeDelta::FromMicroseconds( 199 expected_browser_composite_time_(base::TimeDelta::FromMicroseconds(
175 kDefaultVSyncIntervalMicros * kDefaultBrowserCompositeVSyncFraction)), 200 kDefaultVSyncIntervalMicros * kDefaultBrowserCompositeVSyncFraction)),
176 view_android_(view_android), 201 view_android_(view_android),
177 window_android_(window_android), 202 window_android_(window_android),
178 device_orientation_(0), 203 device_orientation_(0),
179 geolocation_needs_pause_(false) { 204 geolocation_needs_pause_(false),
205 gesture_event_queue_(this),
206 handling_touch_event_(false) {
180 CHECK(web_contents) << 207 CHECK(web_contents) <<
181 "A ContentViewCoreImpl should be created with a valid WebContents."; 208 "A ContentViewCoreImpl should be created with a valid WebContents.";
182 209
183 // TODO(leandrogracia): make use of the hardware_accelerated argument. 210 // TODO(leandrogracia): make use of the hardware_accelerated argument.
184 211
185 const gfx::Display& display = 212 const gfx::Display& display =
186 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay(); 213 gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
187 dpi_scale_ = display.device_scale_factor(); 214 dpi_scale_ = display.device_scale_factor();
188 215
189 // Currently, the only use case we have for overriding a user agent involves 216 // Currently, the only use case we have for overriding a user agent involves
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 break; 324 break;
298 } 325 }
299 } 326 }
300 } 327 }
301 328
302 void ContentViewCoreImpl::RenderViewReady() { 329 void ContentViewCoreImpl::RenderViewReady() {
303 if (device_orientation_ != 0) 330 if (device_orientation_ != 0)
304 SendOrientationChangeEventInternal(); 331 SendOrientationChangeEventInternal();
305 } 332 }
306 333
334 void ContentViewCoreImpl::ForwardGestureEvent(
335 const blink::WebGestureEvent& event) {
336 JNIEnv* env = AttachCurrentThread();
337 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
338 if (j_obj.is_null())
339 return;
340
341 if (Java_ContentViewCore_onForwardingGestureEvent(
342 env, j_obj.obj(), event.type, event.x, event.y))
343 return;
344
345 RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
346 if (rwhv)
347 rwhv->SendGestureEvent(event);
348 }
349
307 RenderWidgetHostViewAndroid* 350 RenderWidgetHostViewAndroid*
308 ContentViewCoreImpl::GetRenderWidgetHostViewAndroid() { 351 ContentViewCoreImpl::GetRenderWidgetHostViewAndroid() {
309 RenderWidgetHostView* rwhv = NULL; 352 RenderWidgetHostView* rwhv = NULL;
310 if (web_contents_) { 353 if (web_contents_) {
311 rwhv = web_contents_->GetRenderWidgetHostView(); 354 rwhv = web_contents_->GetRenderWidgetHostView();
312 if (web_contents_->ShowingInterstitialPage()) { 355 if (web_contents_->ShowingInterstitialPage()) {
313 rwhv = static_cast<InterstitialPageImpl*>( 356 rwhv = static_cast<InterstitialPageImpl*>(
314 web_contents_->GetInterstitialPage())-> 357 web_contents_->GetInterstitialPage())->
315 GetRenderViewHost()->GetView(); 358 GetRenderViewHost()->GetView();
316 } 359 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 env->SetIntArrayRegion(enabled_array.obj(), i, 1, &enabled); 533 env->SetIntArrayRegion(enabled_array.obj(), i, 1, &enabled);
491 } 534 }
492 ScopedJavaLocalRef<jobjectArray> items_array( 535 ScopedJavaLocalRef<jobjectArray> items_array(
493 base::android::ToJavaArrayOfStrings(env, labels)); 536 base::android::ToJavaArrayOfStrings(env, labels));
494 Java_ContentViewCore_showSelectPopup(env, j_obj.obj(), 537 Java_ContentViewCore_showSelectPopup(env, j_obj.obj(),
495 items_array.obj(), enabled_array.obj(), 538 items_array.obj(), enabled_array.obj(),
496 multiple, selected_array.obj()); 539 multiple, selected_array.obj());
497 } 540 }
498 541
499 void ContentViewCoreImpl::ConfirmTouchEvent(InputEventAckState ack_result) { 542 void ContentViewCoreImpl::ConfirmTouchEvent(InputEventAckState ack_result) {
543 gesture_event_queue_.OnTouchEventAck(ack_result);
544 }
545
546 void ContentViewCoreImpl::UnhandledFlingStartEvent(float vx, float vy) {
500 JNIEnv* env = AttachCurrentThread(); 547 JNIEnv* env = AttachCurrentThread();
501 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); 548 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
502 if (j_obj.is_null()) 549 if (j_obj.is_null())
503 return; 550 return;
504 Java_ContentViewCore_confirmTouchEvent(env, j_obj.obj(), 551 Java_ContentViewCore_unhandledFlingStartEvent(env, j_obj.obj(), vx, vy);
505 static_cast<jint>(ack_result));
506 }
507
508 void ContentViewCoreImpl::UnhandledFlingStartEvent() {
509 JNIEnv* env = AttachCurrentThread();
510 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
511 if (j_obj.is_null())
512 return;
513 Java_ContentViewCore_unhandledFlingStartEvent(env, j_obj.obj());
514 } 552 }
515 553
516 void ContentViewCoreImpl::OnScrollUpdateGestureConsumed() { 554 void ContentViewCoreImpl::OnScrollUpdateGestureConsumed() {
517 JNIEnv* env = AttachCurrentThread(); 555 JNIEnv* env = AttachCurrentThread();
518 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); 556 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
519 if (j_obj.is_null()) 557 if (j_obj.is_null())
520 return; 558 return;
521 Java_ContentViewCore_onScrollUpdateGestureConsumed(env, j_obj.obj()); 559 Java_ContentViewCore_onScrollUpdateGestureConsumed(env, j_obj.obj());
522 } 560 }
523 561
524 void ContentViewCoreImpl::HasTouchEventHandlers(bool need_touch_events) {
525 JNIEnv* env = AttachCurrentThread();
526 ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
527 if (j_obj.is_null())
528 return;
529 Java_ContentViewCore_hasTouchEventHandlers(env,
530 j_obj.obj(),
531 need_touch_events);
532 }
533
534 bool ContentViewCoreImpl::HasFocus() { 562 bool ContentViewCoreImpl::HasFocus() {
535 JNIEnv* env = AttachCurrentThread(); 563 JNIEnv* env = AttachCurrentThread();
536 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 564 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
537 if (obj.is_null()) 565 if (obj.is_null())
538 return false; 566 return false;
539 return Java_ContentViewCore_hasFocus(env, obj.obj()); 567 return Java_ContentViewCore_hasFocus(env, obj.obj());
540 } 568 }
541 569
542 void ContentViewCoreImpl::OnSelectionChanged(const std::string& text) { 570 void ContentViewCoreImpl::OnSelectionChanged(const std::string& text) {
543 JNIEnv* env = AttachCurrentThread(); 571 JNIEnv* env = AttachCurrentThread();
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 917
890 void ContentViewCoreImpl::SendOrientationChangeEvent(JNIEnv* env, 918 void ContentViewCoreImpl::SendOrientationChangeEvent(JNIEnv* env,
891 jobject obj, 919 jobject obj,
892 jint orientation) { 920 jint orientation) {
893 if (device_orientation_ != orientation) { 921 if (device_orientation_ != orientation) {
894 device_orientation_ = orientation; 922 device_orientation_ = orientation;
895 SendOrientationChangeEventInternal(); 923 SendOrientationChangeEventInternal();
896 } 924 }
897 } 925 }
898 926
899 jboolean ContentViewCoreImpl::SendTouchEvent(JNIEnv* env, 927 void ContentViewCoreImpl::OnTouchEventHandlingBegin(JNIEnv* env,
900 jobject obj, 928 jobject obj,
901 jlong time_ms, 929 jlong time_ms,
902 jint type, 930 jint type,
903 jobjectArray pts) { 931 jobjectArray pts) {
932 DCHECK(!handling_touch_event_);
933 handling_touch_event_ = true;
934
935 blink::WebTouchEvent event;
936 TouchPoint::BuildWebTouchEvent(env, type, time_ms, GetDpiScale(), pts, event);
937 pending_touch_event_ = event;
938
939 pending_gesture_packet_ = GestureEventPacket::FromTouch(event);
940 }
941
942 void ContentViewCoreImpl::OnTouchEventHandlingEnd(JNIEnv* env, jobject obj) {
943 DCHECK(handling_touch_event_);
944 handling_touch_event_ = false;
945
904 RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid(); 946 RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid();
905 if (rwhv) { 947 if (!rwhv)
906 using blink::WebTouchEvent; 948 return;
907 blink::WebTouchEvent event; 949
908 TouchPoint::BuildWebTouchEvent(env, type, time_ms, GetDpiScale(), pts, 950 // Note: Order is important here, as the touch may be ack'ed synchronously
909 event); 951 gesture_event_queue_.OnGestureEventPacket(pending_gesture_packet_);
910 rwhv->SendTouchEvent(event); 952 rwhv->SendTouchEvent(pending_touch_event_);
911 return true;
912 }
913 return false;
914 } 953 }
915 954
916 float ContentViewCoreImpl::GetTouchPaddingDip() { 955 float ContentViewCoreImpl::GetTouchPaddingDip() {
917 return 48.0f / GetDpiScale(); 956 return 48.0f / GetDpiScale();
918 } 957 }
919 958
920 float ContentViewCoreImpl::GetDpiScale() const { 959 float ContentViewCoreImpl::GetDpiScale() const {
921 return dpi_scale_; 960 return dpi_scale_;
922 } 961 }
923 962
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 } 1012 }
974 1013
975 WebGestureEvent ContentViewCoreImpl::MakeGestureEvent( 1014 WebGestureEvent ContentViewCoreImpl::MakeGestureEvent(
976 WebInputEvent::Type type, int64 time_ms, float x, float y) const { 1015 WebInputEvent::Type type, int64 time_ms, float x, float y) const {
977 return WebGestureEventBuilder::Build( 1016 return WebGestureEventBuilder::Build(
978 type, time_ms / 1000.0, x / GetDpiScale(), y / GetDpiScale()); 1017 type, time_ms / 1000.0, x / GetDpiScale(), y / GetDpiScale());
979 } 1018 }
980 1019
981 void ContentViewCoreImpl::SendGestureEvent( 1020 void ContentViewCoreImpl::SendGestureEvent(
982 const blink::WebGestureEvent& event) { 1021 const blink::WebGestureEvent& event) {
983 RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid(); 1022 if (handling_touch_event_) {
984 if (rwhv) 1023 pending_gesture_packet_.Push(event);
985 rwhv->SendGestureEvent(event); 1024 return;
1025 }
1026 gesture_event_queue_.OnGestureEventPacket(
1027 GestureEventPacket::FromGesture(ToGestureSource(event), event));
1028 }
1029
1030 void ContentViewCoreImpl::SendSyntheticGestureEvent(
1031 const blink::WebGestureEvent& event) {
1032 gesture_event_queue_.OnGestureEventPacket(
1033 GestureEventPacket::FromGesture(GestureEventPacket::SYNTHETIC, event));
986 } 1034 }
987 1035
988 void ContentViewCoreImpl::ScrollBegin(JNIEnv* env, 1036 void ContentViewCoreImpl::ScrollBegin(JNIEnv* env,
989 jobject obj, 1037 jobject obj,
990 jlong time_ms, 1038 jlong time_ms,
991 jfloat x, 1039 jfloat x,
992 jfloat y, 1040 jfloat y,
993 jfloat hintx, 1041 jfloat hintx,
994 jfloat hinty) { 1042 jfloat hinty) {
995 WebGestureEvent event = MakeGestureEvent( 1043 WebGestureEvent event = MakeGestureEvent(
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 SendGestureEvent(event); 1083 SendGestureEvent(event);
1036 } 1084 }
1037 1085
1038 void ContentViewCoreImpl::SingleTap(JNIEnv* env, jobject obj, jlong time_ms, 1086 void ContentViewCoreImpl::SingleTap(JNIEnv* env, jobject obj, jlong time_ms,
1039 jfloat x, jfloat y, 1087 jfloat x, jfloat y,
1040 jboolean disambiguation_popup_tap) { 1088 jboolean disambiguation_popup_tap) {
1041 WebGestureEvent event = MakeGestureEvent( 1089 WebGestureEvent event = MakeGestureEvent(
1042 WebInputEvent::GestureTap, time_ms, x, y); 1090 WebInputEvent::GestureTap, time_ms, x, y);
1043 1091
1044 event.data.tap.tapCount = 1; 1092 event.data.tap.tapCount = 1;
1045 if (!disambiguation_popup_tap) { 1093 if (disambiguation_popup_tap) {
1046 const float touch_padding_dip = GetTouchPaddingDip(); 1094 SendSyntheticGestureEvent(event);
1047 event.data.tap.width = touch_padding_dip; 1095 return;
1048 event.data.tap.height = touch_padding_dip;
1049 } 1096 }
1050 1097
1098 const float touch_padding_dip = GetTouchPaddingDip();
1099 event.data.tap.width = touch_padding_dip;
1100 event.data.tap.height = touch_padding_dip;
1051 SendGestureEvent(event); 1101 SendGestureEvent(event);
1052 } 1102 }
1053 1103
1054 void ContentViewCoreImpl::SingleTapUnconfirmed(JNIEnv* env, jobject obj, 1104 void ContentViewCoreImpl::SingleTapUnconfirmed(JNIEnv* env, jobject obj,
1055 jlong time_ms, 1105 jlong time_ms,
1056 jfloat x, jfloat y) { 1106 jfloat x, jfloat y) {
1057 WebGestureEvent event = MakeGestureEvent( 1107 WebGestureEvent event = MakeGestureEvent(
1058 WebInputEvent::GestureTapUnconfirmed, time_ms, x, y); 1108 WebInputEvent::GestureTapUnconfirmed, time_ms, x, y);
1059 1109
1060 event.data.tap.tapCount = 1; 1110 event.data.tap.tapCount = 1;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 WebInputEvent::GestureDoubleTap, time_ms, x, y); 1148 WebInputEvent::GestureDoubleTap, time_ms, x, y);
1099 SendGestureEvent(event); 1149 SendGestureEvent(event);
1100 } 1150 }
1101 1151
1102 void ContentViewCoreImpl::LongPress(JNIEnv* env, jobject obj, jlong time_ms, 1152 void ContentViewCoreImpl::LongPress(JNIEnv* env, jobject obj, jlong time_ms,
1103 jfloat x, jfloat y, 1153 jfloat x, jfloat y,
1104 jboolean disambiguation_popup_tap) { 1154 jboolean disambiguation_popup_tap) {
1105 WebGestureEvent event = MakeGestureEvent( 1155 WebGestureEvent event = MakeGestureEvent(
1106 WebInputEvent::GestureLongPress, time_ms, x, y); 1156 WebInputEvent::GestureLongPress, time_ms, x, y);
1107 1157
1108 if (!disambiguation_popup_tap) { 1158 if (disambiguation_popup_tap) {
1109 const float touch_padding_dip = GetTouchPaddingDip(); 1159 SendSyntheticGestureEvent(event);
1110 event.data.longPress.width = touch_padding_dip; 1160 return;
1111 event.data.longPress.height = touch_padding_dip;
1112 } 1161 }
1113 1162
1163 const float touch_padding_dip = GetTouchPaddingDip();
1164 event.data.longPress.width = touch_padding_dip;
1165 event.data.longPress.height = touch_padding_dip;
1114 SendGestureEvent(event); 1166 SendGestureEvent(event);
1115 } 1167 }
1116 1168
1117 void ContentViewCoreImpl::LongTap(JNIEnv* env, jobject obj, jlong time_ms, 1169 void ContentViewCoreImpl::LongTap(JNIEnv* env, jobject obj, jlong time_ms,
1118 jfloat x, jfloat y, 1170 jfloat x, jfloat y,
1119 jboolean disambiguation_popup_tap) { 1171 jboolean disambiguation_popup_tap) {
1120 WebGestureEvent event = MakeGestureEvent( 1172 WebGestureEvent event = MakeGestureEvent(
1121 WebInputEvent::GestureLongTap, time_ms, x, y); 1173 WebInputEvent::GestureLongTap, time_ms, x, y);
1122 1174
1123 if (!disambiguation_popup_tap) { 1175 if (disambiguation_popup_tap) {
1124 const float touch_padding_dip = GetTouchPaddingDip(); 1176 SendSyntheticGestureEvent(event);
1125 event.data.longPress.width = touch_padding_dip; 1177 return;
1126 event.data.longPress.height = touch_padding_dip;
1127 } 1178 }
1128 1179
1180 const float touch_padding_dip = GetTouchPaddingDip();
1181 event.data.longPress.width = touch_padding_dip;
1182 event.data.longPress.height = touch_padding_dip;
1129 SendGestureEvent(event); 1183 SendGestureEvent(event);
1130 } 1184 }
1131 1185
1132 void ContentViewCoreImpl::PinchBegin(JNIEnv* env, jobject obj, jlong time_ms, 1186 void ContentViewCoreImpl::PinchBegin(JNIEnv* env, jobject obj, jlong time_ms,
1133 jfloat x, jfloat y) { 1187 jfloat x, jfloat y) {
1134 WebGestureEvent event = MakeGestureEvent( 1188 WebGestureEvent event = MakeGestureEvent(
1135 WebInputEvent::GesturePinchBegin, time_ms, x, y); 1189 WebInputEvent::GesturePinchBegin, time_ms, x, y);
1136 SendGestureEvent(event); 1190 SendGestureEvent(event);
1137 } 1191 }
1138 1192
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1682 reinterpret_cast<ui::ViewAndroid*>(view_android), 1736 reinterpret_cast<ui::ViewAndroid*>(view_android),
1683 reinterpret_cast<ui::WindowAndroid*>(window_android)); 1737 reinterpret_cast<ui::WindowAndroid*>(window_android));
1684 return reinterpret_cast<intptr_t>(view); 1738 return reinterpret_cast<intptr_t>(view);
1685 } 1739 }
1686 1740
1687 bool RegisterContentViewCore(JNIEnv* env) { 1741 bool RegisterContentViewCore(JNIEnv* env) {
1688 return RegisterNativesImpl(env); 1742 return RegisterNativesImpl(env);
1689 } 1743 }
1690 1744
1691 } // namespace content 1745 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698