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

Side by Side Diff: content/renderer/input/input_handler_proxy.cc

Issue 1251323002: Plumb smooth scrolling in Chromium compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 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 "content/renderer/input/input_handler_proxy.h" 5 #include "content/renderer/input/input_handler_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 "LatencyInfo.Flow", 222 "LatencyInfo.Flow",
223 TRACE_ID_DONT_MANGLE(latency_info->trace_id), 223 TRACE_ID_DONT_MANGLE(latency_info->trace_id),
224 "HandleInputEventImpl"); 224 "HandleInputEventImpl");
225 225
226 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor = 226 scoped_ptr<cc::SwapPromiseMonitor> latency_info_swap_promise_monitor =
227 input_handler_->CreateLatencyInfoSwapPromiseMonitor(latency_info); 227 input_handler_->CreateLatencyInfoSwapPromiseMonitor(latency_info);
228 InputHandlerProxy::EventDisposition disposition = HandleInputEvent(event); 228 InputHandlerProxy::EventDisposition disposition = HandleInputEvent(event);
229 return disposition; 229 return disposition;
230 } 230 }
231 231
232 blink::WebGestureCurve* InputHandlerProxy::CreateAnimationCurve(
233 const blink::WebGestureEvent& gesture_event) {
234 blink::WebGestureCurve* fling_curve;
235 if (gesture_event.data.flingStart.isSmoothScroll) {
236 const float start_x = gesture_event.x;
237 const float start_y = gesture_event.y;
238 const float dx = gesture_event.data.flingStart.dx;
239 const float dy = gesture_event.data.flingStart.dy;
240 const long duration_ms = gesture_event.data.flingStart.durationMs;
241 fling_curve = client_->CreateSmoothScrollAnimationCurve(
242 gesture_event.sourceDevice, start_x, start_y, dx, dy, duration_ms);
243 } else {
244 const float vx = gesture_event.data.flingStart.velocityX;
245 const float vy = gesture_event.data.flingStart.velocityY;
246 fling_curve = client_->CreateFlingAnimationCurve(
247 gesture_event.sourceDevice, WebFloatPoint(vx, vy), blink::WebSize());
248 }
249
250 return fling_curve;
251 }
252
232 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( 253 InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent(
233 const WebInputEvent& event) { 254 const WebInputEvent& event) {
234 DCHECK(input_handler_); 255 DCHECK(input_handler_);
235 TRACE_EVENT1("input,benchmark", "InputHandlerProxy::HandleInputEvent", 256 TRACE_EVENT1("input,benchmark", "InputHandlerProxy::HandleInputEvent",
236 "type", WebInputEventTraits::GetName(event.type)); 257 "type", WebInputEventTraits::GetName(event.type));
237 258
238 if (FilterInputEventForFlingBoosting(event)) 259 if (FilterInputEventForFlingBoosting(event))
239 return DID_HANDLE; 260 return DID_HANDLE;
240 261
241 switch (event.type) { 262 switch (event.type) {
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 535
515 switch (scroll_status) { 536 switch (scroll_status) {
516 case cc::InputHandler::SCROLL_STARTED: { 537 case cc::InputHandler::SCROLL_STARTED: {
517 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) 538 if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad)
518 input_handler_->ScrollEnd(); 539 input_handler_->ScrollEnd();
519 540
520 const float vx = gesture_event.data.flingStart.velocityX; 541 const float vx = gesture_event.data.flingStart.velocityX;
521 const float vy = gesture_event.data.flingStart.velocityY; 542 const float vy = gesture_event.data.flingStart.velocityY;
522 current_fling_velocity_ = gfx::Vector2dF(vx, vy); 543 current_fling_velocity_ = gfx::Vector2dF(vx, vy);
523 DCHECK(!current_fling_velocity_.IsZero()); 544 DCHECK(!current_fling_velocity_.IsZero());
524 fling_curve_.reset(client_->CreateFlingAnimationCurve( 545
525 gesture_event.sourceDevice, 546 fling_curve_.reset(CreateAnimationCurve(gesture_event));
526 WebFloatPoint(vx, vy), 547
527 blink::WebSize()));
528 disallow_horizontal_fling_scroll_ = !vx; 548 disallow_horizontal_fling_scroll_ = !vx;
529 disallow_vertical_fling_scroll_ = !vy; 549 disallow_vertical_fling_scroll_ = !vy;
530 TRACE_EVENT_ASYNC_BEGIN2("input", 550 TRACE_EVENT_ASYNC_BEGIN2("input",
531 "InputHandlerProxy::HandleGestureFling::started", 551 "InputHandlerProxy::HandleGestureFling::started",
532 this, 552 this,
533 "vx", 553 "vx",
534 vx, 554 vx,
535 "vy", 555 "vy",
536 vy); 556 vy);
537 // Note that the timestamp will only be used to kickstart the animation if 557 // Note that the timestamp will only be used to kickstart the animation if
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 // preventing insertion of a synthetic GestureScrollBegin. 691 // preventing insertion of a synthetic GestureScrollBegin.
672 last_fling_boost_event_ = WebGestureEvent(); 692 last_fling_boost_event_ = WebGestureEvent();
673 CancelCurrentFling(); 693 CancelCurrentFling();
674 return true; 694 return true;
675 695
676 case WebInputEvent::GestureFlingStart: { 696 case WebInputEvent::GestureFlingStart: {
677 DCHECK_EQ(fling_parameters_.sourceDevice, gesture_event.sourceDevice); 697 DCHECK_EQ(fling_parameters_.sourceDevice, gesture_event.sourceDevice);
678 698
679 bool fling_boosted = 699 bool fling_boosted =
680 fling_parameters_.modifiers == gesture_event.modifiers && 700 fling_parameters_.modifiers == gesture_event.modifiers &&
681 ShouldBoostFling(current_fling_velocity_, gesture_event); 701 ShouldBoostFling(current_fling_velocity_, gesture_event);
jdduke (slow) 2015/07/23 15:32:50 We should make sure smooth scroll flings don't boo
682 702
683 gfx::Vector2dF new_fling_velocity( 703 gfx::Vector2dF new_fling_velocity(
684 gesture_event.data.flingStart.velocityX, 704 gesture_event.data.flingStart.velocityX,
685 gesture_event.data.flingStart.velocityY); 705 gesture_event.data.flingStart.velocityY);
686 DCHECK(!new_fling_velocity.IsZero()); 706 DCHECK(!new_fling_velocity.IsZero());
687 707
688 if (fling_boosted) 708 if (fling_boosted)
689 current_fling_velocity_ += new_fling_velocity; 709 current_fling_velocity_ += new_fling_velocity;
690 else 710 else
691 current_fling_velocity_ = new_fling_velocity; 711 current_fling_velocity_ = new_fling_velocity;
692 712
693 WebFloatPoint velocity(current_fling_velocity_.x(), 713 WebFloatPoint velocity(current_fling_velocity_.x(),
694 current_fling_velocity_.y()); 714 current_fling_velocity_.y());
695 deferred_fling_cancel_time_seconds_ = 0; 715 deferred_fling_cancel_time_seconds_ = 0;
696 disallow_horizontal_fling_scroll_ = !velocity.x; 716 disallow_horizontal_fling_scroll_ = !velocity.x;
697 disallow_vertical_fling_scroll_ = !velocity.y; 717 disallow_vertical_fling_scroll_ = !velocity.y;
698 last_fling_boost_event_ = WebGestureEvent(); 718 last_fling_boost_event_ = WebGestureEvent();
699 fling_curve_.reset(client_->CreateFlingAnimationCurve( 719 fling_curve_.reset(CreateAnimationCurve(gesture_event));
700 gesture_event.sourceDevice,
701 velocity,
702 blink::WebSize()));
703 fling_parameters_.startTime = gesture_event.timeStampSeconds; 720 fling_parameters_.startTime = gesture_event.timeStampSeconds;
704 fling_parameters_.delta = velocity; 721 fling_parameters_.delta = velocity;
705 fling_parameters_.point = WebPoint(gesture_event.x, gesture_event.y); 722 fling_parameters_.point = WebPoint(gesture_event.x, gesture_event.y);
706 fling_parameters_.globalPoint = 723 fling_parameters_.globalPoint =
707 WebPoint(gesture_event.globalX, gesture_event.globalY); 724 WebPoint(gesture_event.globalX, gesture_event.globalY);
708 725
709 TRACE_EVENT_INSTANT2("input", 726 TRACE_EVENT_INSTANT2("input",
710 fling_boosted ? "InputHandlerProxy::FlingBoosted" 727 fling_boosted ? "InputHandlerProxy::FlingBoosted"
711 : "InputHandlerProxy::FlingReplaced", 728 : "InputHandlerProxy::FlingReplaced",
712 TRACE_EVENT_SCOPE_THREAD, 729 TRACE_EVENT_SCOPE_THREAD,
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 // trigger a scroll, e.g., with a trivial time delta between fling updates. 984 // trigger a scroll, e.g., with a trivial time delta between fling updates.
968 // Return true in this case to prevent early fling termination. 985 // Return true in this case to prevent early fling termination.
969 if (std::abs(clipped_increment.width) < kScrollEpsilon && 986 if (std::abs(clipped_increment.width) < kScrollEpsilon &&
970 std::abs(clipped_increment.height) < kScrollEpsilon) 987 std::abs(clipped_increment.height) < kScrollEpsilon)
971 return true; 988 return true;
972 989
973 return did_scroll; 990 return did_scroll;
974 } 991 }
975 992
976 } // namespace content 993 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698