OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "ui/events/blink/input_handler_proxy.h" | 5 #include "ui/events/blink/input_handler_proxy.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 | 116 |
117 WebGestureEvent ObtainGestureScrollBegin(const WebGestureEvent& event) { | 117 WebGestureEvent ObtainGestureScrollBegin(const WebGestureEvent& event) { |
118 WebGestureEvent scroll_begin_event = event; | 118 WebGestureEvent scroll_begin_event = event; |
119 scroll_begin_event.type = WebInputEvent::GestureScrollBegin; | 119 scroll_begin_event.type = WebInputEvent::GestureScrollBegin; |
120 scroll_begin_event.data.scrollBegin.deltaXHint = 0; | 120 scroll_begin_event.data.scrollBegin.deltaXHint = 0; |
121 scroll_begin_event.data.scrollBegin.deltaYHint = 0; | 121 scroll_begin_event.data.scrollBegin.deltaYHint = 0; |
122 return scroll_begin_event; | 122 return scroll_begin_event; |
123 } | 123 } |
124 | 124 |
125 cc::ScrollState CreateScrollStateForGesture(const WebGestureEvent& event) { | 125 cc::ScrollState CreateScrollStateForGesture(const WebGestureEvent& event) { |
| 126 cc::ScrollStateData scroll_state_data; |
126 switch (event.type) { | 127 switch (event.type) { |
127 case WebInputEvent::GestureScrollBegin: | 128 case WebInputEvent::GestureScrollBegin: |
128 return cc::ScrollState(0, 0, event.x, event.y, 0, 0, true, false, false); | 129 scroll_state_data.start_position_x = event.x; |
| 130 scroll_state_data.start_position_y = event.y; |
| 131 scroll_state_data.is_beginning = true; |
| 132 break; |
129 case WebInputEvent::GestureFlingStart: | 133 case WebInputEvent::GestureFlingStart: |
130 return cc::ScrollState( | 134 scroll_state_data.velocity_x = event.data.flingStart.velocityX; |
131 0, 0, event.x, event.y, event.data.flingStart.velocityX, | 135 scroll_state_data.velocity_y = event.data.flingStart.velocityY; |
132 event.data.flingStart.velocityX, true, true, false); | 136 scroll_state_data.is_in_inertial_phase = true; |
| 137 break; |
133 case WebInputEvent::GestureScrollUpdate: | 138 case WebInputEvent::GestureScrollUpdate: |
134 return cc::ScrollState(-event.data.scrollUpdate.deltaX, | 139 scroll_state_data.delta_x = -event.data.scrollUpdate.deltaX; |
135 -event.data.scrollUpdate.deltaY, event.x, event.y, | 140 scroll_state_data.delta_y = -event.data.scrollUpdate.deltaY; |
136 event.data.scrollUpdate.velocityX, | 141 scroll_state_data.velocity_x = event.data.scrollUpdate.velocityX; |
137 event.data.scrollUpdate.velocityY, | 142 scroll_state_data.velocity_y = event.data.scrollUpdate.velocityY; |
138 event.data.scrollUpdate.inertial, false, false); | 143 scroll_state_data.is_in_inertial_phase = event.data.scrollUpdate.inertial; |
| 144 break; |
139 case WebInputEvent::GestureScrollEnd: | 145 case WebInputEvent::GestureScrollEnd: |
140 return cc::ScrollState(0, 0, event.x, event.y, 0, 0, false, false, true); | |
141 case WebInputEvent::GestureFlingCancel: | 146 case WebInputEvent::GestureFlingCancel: |
142 return cc::ScrollState(0, 0, event.x, event.y, 0, 0, false, true, true); | 147 scroll_state_data.is_ending = true; |
143 | 148 break; |
144 default: | 149 default: |
145 NOTREACHED(); | 150 NOTREACHED(); |
146 return cc::ScrollState(0, 0, 0, 0, 0, 0, false, false, false); | 151 break; |
147 } | 152 } |
| 153 return cc::ScrollState(scroll_state_data); |
148 } | 154 } |
149 | 155 |
150 void ReportInputEventLatencyUma(const WebInputEvent& event, | 156 void ReportInputEventLatencyUma(const WebInputEvent& event, |
151 const ui::LatencyInfo& latency_info) { | 157 const ui::LatencyInfo& latency_info) { |
152 if (!(event.type == WebInputEvent::GestureScrollBegin || | 158 if (!(event.type == WebInputEvent::GestureScrollBegin || |
153 event.type == WebInputEvent::GestureScrollUpdate || | 159 event.type == WebInputEvent::GestureScrollUpdate || |
154 event.type == WebInputEvent::GesturePinchBegin || | 160 event.type == WebInputEvent::GesturePinchBegin || |
155 event.type == WebInputEvent::GesturePinchUpdate || | 161 event.type == WebInputEvent::GesturePinchUpdate || |
156 event.type == WebInputEvent::GestureFlingStart)) { | 162 event.type == WebInputEvent::GestureFlingStart)) { |
157 return; | 163 return; |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 result = DID_HANDLE; | 463 result = DID_HANDLE; |
458 break; | 464 break; |
459 case cc::InputHandler::SCROLL_IGNORED: | 465 case cc::InputHandler::SCROLL_IGNORED: |
460 result = DROP_EVENT; | 466 result = DROP_EVENT; |
461 break; | 467 break; |
462 default: | 468 default: |
463 result = DID_NOT_HANDLE; | 469 result = DID_NOT_HANDLE; |
464 break; | 470 break; |
465 } | 471 } |
466 } else { | 472 } else { |
467 cc::ScrollState scroll_state_begin(0, 0, wheel_event.x, wheel_event.y, 0, 0, | 473 cc::ScrollStateData scroll_state_begin_data; |
468 true, false, false); | 474 scroll_state_begin_data.start_position_x = wheel_event.x; |
| 475 scroll_state_begin_data.start_position_y = wheel_event.y; |
| 476 scroll_state_begin_data.is_beginning = true; |
| 477 cc::ScrollState scroll_state_begin(scroll_state_begin_data); |
469 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( | 478 cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( |
470 &scroll_state_begin, cc::InputHandler::WHEEL); | 479 &scroll_state_begin, cc::InputHandler::WHEEL); |
471 | 480 |
472 RecordMainThreadScrollingReasons( | 481 RecordMainThreadScrollingReasons( |
473 wheel_event.type, scroll_status.main_thread_scrolling_reasons); | 482 wheel_event.type, scroll_status.main_thread_scrolling_reasons); |
474 | 483 |
475 switch (scroll_status.thread) { | 484 switch (scroll_status.thread) { |
476 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { | 485 case cc::InputHandler::SCROLL_ON_IMPL_THREAD: { |
477 TRACE_EVENT_INSTANT2("input", | 486 TRACE_EVENT_INSTANT2("input", |
478 "InputHandlerProxy::handle_input wheel scroll", | 487 "InputHandlerProxy::handle_input wheel scroll", |
479 TRACE_EVENT_SCOPE_THREAD, "deltaX", | 488 TRACE_EVENT_SCOPE_THREAD, "deltaX", |
480 scroll_delta.x(), "deltaY", scroll_delta.y()); | 489 scroll_delta.x(), "deltaY", scroll_delta.y()); |
481 cc::ScrollState scroll_state_update(scroll_delta.x(), scroll_delta.y(), | 490 |
482 wheel_event.x, wheel_event.y, 0, 0, | 491 cc::ScrollStateData scroll_state_update_data; |
483 false, false, false); | 492 scroll_state_update_data.delta_x = scroll_delta.x(); |
| 493 scroll_state_update_data.delta_y = scroll_delta.y(); |
| 494 scroll_state_update_data.start_position_x = wheel_event.x; |
| 495 scroll_state_update_data.start_position_y = wheel_event.y; |
| 496 cc::ScrollState scroll_state_update(scroll_state_update_data); |
484 | 497 |
485 scroll_result = input_handler_->ScrollBy(&scroll_state_update); | 498 scroll_result = input_handler_->ScrollBy(&scroll_state_update); |
486 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), | 499 HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), |
487 scroll_result); | 500 scroll_result); |
488 | 501 |
489 cc::ScrollState scroll_state_end(0, 0, wheel_event.x, wheel_event.y, | 502 cc::ScrollStateData scroll_state_end_data; |
490 0, 0, false, false, true); | 503 scroll_state_end_data.is_ending = true; |
| 504 cc::ScrollState scroll_state_end(scroll_state_end_data); |
491 input_handler_->ScrollEnd(&scroll_state_end); | 505 input_handler_->ScrollEnd(&scroll_state_end); |
492 | 506 |
493 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; | 507 result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
494 break; | 508 break; |
495 } | 509 } |
496 case cc::InputHandler::SCROLL_IGNORED: | 510 case cc::InputHandler::SCROLL_IGNORED: |
497 // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail | 511 // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail |
498 // to properly sync scrollability it's safer to send the event to the | 512 // to properly sync scrollability it's safer to send the event to the |
499 // main thread. Change back to DROP_EVENT once we have synchronization | 513 // main thread. Change back to DROP_EVENT once we have synchronization |
500 // bugs sorted out. | 514 // bugs sorted out. |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 client_->DidStopFlinging(); | 1033 client_->DidStopFlinging(); |
1020 return true; | 1034 return true; |
1021 } | 1035 } |
1022 return false; | 1036 return false; |
1023 } | 1037 } |
1024 | 1038 |
1025 bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() { | 1039 bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() { |
1026 bool had_fling_animation = !!fling_curve_; | 1040 bool had_fling_animation = !!fling_curve_; |
1027 if (had_fling_animation && | 1041 if (had_fling_animation && |
1028 fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen) { | 1042 fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen) { |
1029 cc::ScrollState scroll_state(0, 0, fling_parameters_.point.x, | 1043 cc::ScrollStateData scroll_state_data; |
1030 fling_parameters_.point.y, 0, 0, false, true, | 1044 scroll_state_data.is_ending = true; |
1031 true); | 1045 cc::ScrollState scroll_state(scroll_state_data); |
1032 input_handler_->ScrollEnd(&scroll_state); | 1046 input_handler_->ScrollEnd(&scroll_state); |
1033 TRACE_EVENT_ASYNC_END0( | 1047 TRACE_EVENT_ASYNC_END0( |
1034 "input", | 1048 "input", |
1035 "InputHandlerProxy::HandleGestureFling::started", | 1049 "InputHandlerProxy::HandleGestureFling::started", |
1036 this); | 1050 this); |
1037 } | 1051 } |
1038 | 1052 |
1039 TRACE_EVENT_INSTANT1("input", | 1053 TRACE_EVENT_INSTANT1("input", |
1040 "InputHandlerProxy::CancelCurrentFling", | 1054 "InputHandlerProxy::CancelCurrentFling", |
1041 TRACE_EVENT_SCOPE_THREAD, | 1055 TRACE_EVENT_SCOPE_THREAD, |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 clipped_increment.height); | 1155 clipped_increment.height); |
1142 | 1156 |
1143 bool did_scroll = false; | 1157 bool did_scroll = false; |
1144 | 1158 |
1145 switch (fling_parameters_.sourceDevice) { | 1159 switch (fling_parameters_.sourceDevice) { |
1146 case blink::WebGestureDeviceTouchpad: | 1160 case blink::WebGestureDeviceTouchpad: |
1147 did_scroll = TouchpadFlingScroll(clipped_increment); | 1161 did_scroll = TouchpadFlingScroll(clipped_increment); |
1148 break; | 1162 break; |
1149 case blink::WebGestureDeviceTouchscreen: { | 1163 case blink::WebGestureDeviceTouchscreen: { |
1150 clipped_increment = ToClientScrollIncrement(clipped_increment); | 1164 clipped_increment = ToClientScrollIncrement(clipped_increment); |
1151 cc::ScrollState scroll_state( | 1165 cc::ScrollStateData scroll_state_data; |
1152 clipped_increment.width, clipped_increment.height, | 1166 scroll_state_data.delta_x = clipped_increment.width; |
1153 fling_parameters_.point.x, fling_parameters_.point.y, | 1167 scroll_state_data.delta_y = clipped_increment.height; |
1154 clipped_velocity.width, clipped_velocity.height, false, true, false); | 1168 scroll_state_data.velocity_x = clipped_velocity.width; |
| 1169 scroll_state_data.velocity_y = clipped_velocity.height; |
| 1170 scroll_state_data.is_in_inertial_phase = true; |
| 1171 cc::ScrollState scroll_state(scroll_state_data); |
1155 cc::InputHandlerScrollResult scroll_result = | 1172 cc::InputHandlerScrollResult scroll_result = |
1156 input_handler_->ScrollBy(&scroll_state); | 1173 input_handler_->ScrollBy(&scroll_state); |
1157 HandleOverscroll(fling_parameters_.point, scroll_result); | 1174 HandleOverscroll(fling_parameters_.point, scroll_result); |
1158 did_scroll = scroll_result.did_scroll; | 1175 did_scroll = scroll_result.did_scroll; |
1159 } break; | 1176 } break; |
1160 case blink::WebGestureDeviceUninitialized: | 1177 case blink::WebGestureDeviceUninitialized: |
1161 NOTREACHED(); | 1178 NOTREACHED(); |
1162 return false; | 1179 return false; |
1163 } | 1180 } |
1164 | 1181 |
1165 if (did_scroll) { | 1182 if (did_scroll) { |
1166 fling_parameters_.cumulativeScroll.width += clipped_increment.width; | 1183 fling_parameters_.cumulativeScroll.width += clipped_increment.width; |
1167 fling_parameters_.cumulativeScroll.height += clipped_increment.height; | 1184 fling_parameters_.cumulativeScroll.height += clipped_increment.height; |
1168 } | 1185 } |
1169 | 1186 |
1170 // It's possible the provided |increment| is sufficiently small as to not | 1187 // It's possible the provided |increment| is sufficiently small as to not |
1171 // trigger a scroll, e.g., with a trivial time delta between fling updates. | 1188 // trigger a scroll, e.g., with a trivial time delta between fling updates. |
1172 // Return true in this case to prevent early fling termination. | 1189 // Return true in this case to prevent early fling termination. |
1173 if (std::abs(clipped_increment.width) < kScrollEpsilon && | 1190 if (std::abs(clipped_increment.width) < kScrollEpsilon && |
1174 std::abs(clipped_increment.height) < kScrollEpsilon) | 1191 std::abs(clipped_increment.height) < kScrollEpsilon) |
1175 return true; | 1192 return true; |
1176 | 1193 |
1177 return did_scroll; | 1194 return did_scroll; |
1178 } | 1195 } |
1179 | 1196 |
1180 } // namespace ui | 1197 } // namespace ui |
OLD | NEW |