| 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 |