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

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

Issue 131373004: Let the browser know the end of fling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: SetNeedsRedraw in AnimateTopControls 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 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/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "content/renderer/input/input_handler_proxy_client.h" 10 #include "content/renderer/input/input_handler_proxy_client.h"
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 *static_cast<const WebGestureEvent*>(&event); 205 *static_cast<const WebGestureEvent*>(&event);
206 input_handler_->PinchGestureUpdate( 206 input_handler_->PinchGestureUpdate(
207 gesture_event.data.pinchUpdate.scale, 207 gesture_event.data.pinchUpdate.scale,
208 gfx::Point(gesture_event.x, gesture_event.y)); 208 gfx::Point(gesture_event.x, gesture_event.y));
209 return DID_HANDLE; 209 return DID_HANDLE;
210 } else if (event.type == WebInputEvent::GestureFlingStart) { 210 } else if (event.type == WebInputEvent::GestureFlingStart) {
211 const WebGestureEvent& gesture_event = 211 const WebGestureEvent& gesture_event =
212 *static_cast<const WebGestureEvent*>(&event); 212 *static_cast<const WebGestureEvent*>(&event);
213 return HandleGestureFling(gesture_event); 213 return HandleGestureFling(gesture_event);
214 } else if (event.type == WebInputEvent::GestureFlingCancel) { 214 } else if (event.type == WebInputEvent::GestureFlingCancel) {
215 if (CancelCurrentFling()) 215 if (CancelCurrentFling(true))
216 return DID_HANDLE; 216 return DID_HANDLE;
217 else if (!fling_may_be_active_on_main_thread_) 217 else if (!fling_may_be_active_on_main_thread_)
218 return DROP_EVENT; 218 return DROP_EVENT;
219 } else if (event.type == WebInputEvent::TouchStart) { 219 } else if (event.type == WebInputEvent::TouchStart) {
220 const WebTouchEvent& touch_event = 220 const WebTouchEvent& touch_event =
221 *static_cast<const WebTouchEvent*>(&event); 221 *static_cast<const WebTouchEvent*>(&event);
222 for (size_t i = 0; i < touch_event.touchesLength; ++i) { 222 for (size_t i = 0; i < touch_event.touchesLength; ++i) {
223 if (touch_event.touches[i].state != WebTouchPoint::StatePressed) 223 if (touch_event.touches[i].state != WebTouchPoint::StatePressed)
224 continue; 224 continue;
225 if (input_handler_->HaveTouchEventHandlersAt(touch_event.touches[i] 225 if (input_handler_->HaveTouchEventHandlersAt(touch_event.touches[i]
226 .position)) 226 .position))
227 return DID_NOT_HANDLE; 227 return DID_NOT_HANDLE;
228 } 228 }
229 return DROP_EVENT; 229 return DROP_EVENT;
230 } else if (WebInputEvent::isKeyboardEventType(event.type)) { 230 } else if (WebInputEvent::isKeyboardEventType(event.type)) {
231 CancelCurrentFling(); 231 CancelCurrentFling(true);
232 } else if (event.type == WebInputEvent::MouseMove) { 232 } else if (event.type == WebInputEvent::MouseMove) {
233 const WebMouseEvent& mouse_event = 233 const WebMouseEvent& mouse_event =
234 *static_cast<const WebMouseEvent*>(&event); 234 *static_cast<const WebMouseEvent*>(&event);
235 // TODO(tony): Ignore when mouse buttons are down? 235 // TODO(tony): Ignore when mouse buttons are down?
236 // TODO(davemoore): This should never happen, but bug #326635 showed some 236 // TODO(davemoore): This should never happen, but bug #326635 showed some
237 // surprising crashes. 237 // surprising crashes.
238 CHECK(input_handler_); 238 CHECK(input_handler_);
239 input_handler_->MouseMoveAt(gfx::Point(mouse_event.x, mouse_event.y)); 239 input_handler_->MouseMoveAt(gfx::Point(mouse_event.x, mouse_event.y));
240 } 240 }
241 241
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 339
340 if (disallow_vertical_fling_scroll_ && disallow_horizontal_fling_scroll_) 340 if (disallow_vertical_fling_scroll_ && disallow_horizontal_fling_scroll_)
341 fling_is_active = false; 341 fling_is_active = false;
342 342
343 if (fling_is_active) { 343 if (fling_is_active) {
344 input_handler_->ScheduleAnimation(); 344 input_handler_->ScheduleAnimation();
345 } else { 345 } else {
346 TRACE_EVENT_INSTANT0("renderer", 346 TRACE_EVENT_INSTANT0("renderer",
347 "InputHandlerProxy::animate::flingOver", 347 "InputHandlerProxy::animate::flingOver",
348 TRACE_EVENT_SCOPE_THREAD); 348 TRACE_EVENT_SCOPE_THREAD);
349 CancelCurrentFling(); 349 CancelCurrentFling(true);
350 } 350 }
351 } 351 }
352 352
353 void InputHandlerProxy::MainThreadHasStoppedFlinging() { 353 void InputHandlerProxy::MainThreadHasStoppedFlinging() {
354 fling_may_be_active_on_main_thread_ = false; 354 fling_may_be_active_on_main_thread_ = false;
355 client_->DidStopFlinging();
355 } 356 }
356 357
357 void InputHandlerProxy::DidOverscroll(const cc::DidOverscrollParams& params) { 358 void InputHandlerProxy::DidOverscroll(const cc::DidOverscrollParams& params) {
358 DCHECK(client_); 359 DCHECK(client_);
359 if (fling_curve_) { 360 if (fling_curve_) {
360 static const int kFlingOverscrollThreshold = 1; 361 static const int kFlingOverscrollThreshold = 1;
361 disallow_horizontal_fling_scroll_ |= 362 disallow_horizontal_fling_scroll_ |=
362 std::abs(params.accumulated_overscroll.x()) >= 363 std::abs(params.accumulated_overscroll.x()) >=
363 kFlingOverscrollThreshold; 364 kFlingOverscrollThreshold;
364 disallow_vertical_fling_scroll_ |= 365 disallow_vertical_fling_scroll_ |=
365 std::abs(params.accumulated_overscroll.y()) >= 366 std::abs(params.accumulated_overscroll.y()) >=
366 kFlingOverscrollThreshold; 367 kFlingOverscrollThreshold;
367 } 368 }
368 369
369 client_->DidOverscroll(params); 370 client_->DidOverscroll(params);
370 } 371 }
371 372
372 bool InputHandlerProxy::CancelCurrentFling() { 373 bool InputHandlerProxy::CancelCurrentFling(
374 bool send_fling_stopped_notification) {
373 bool had_fling_animation = fling_curve_; 375 bool had_fling_animation = fling_curve_;
374 if (had_fling_animation && 376 if (had_fling_animation &&
375 fling_parameters_.sourceDevice == WebGestureEvent::Touchscreen) { 377 fling_parameters_.sourceDevice == WebGestureEvent::Touchscreen) {
376 input_handler_->ScrollEnd(); 378 input_handler_->ScrollEnd();
377 TRACE_EVENT_ASYNC_END0( 379 TRACE_EVENT_ASYNC_END0(
378 "renderer", 380 "renderer",
379 "InputHandlerProxy::HandleGestureFling::started", 381 "InputHandlerProxy::HandleGestureFling::started",
380 this); 382 this);
381 } 383 }
382 384
383 TRACE_EVENT_INSTANT1("renderer", 385 TRACE_EVENT_INSTANT1("renderer",
384 "InputHandlerProxy::CancelCurrentFling", 386 "InputHandlerProxy::CancelCurrentFling",
385 TRACE_EVENT_SCOPE_THREAD, 387 TRACE_EVENT_SCOPE_THREAD,
386 "had_fling_animation", 388 "had_fling_animation",
387 had_fling_animation); 389 had_fling_animation);
388 fling_curve_.reset(); 390 fling_curve_.reset();
389 gesture_scroll_on_impl_thread_ = false; 391 gesture_scroll_on_impl_thread_ = false;
390 fling_parameters_ = blink::WebActiveWheelFlingParameters(); 392 fling_parameters_ = blink::WebActiveWheelFlingParameters();
393 if (send_fling_stopped_notification && had_fling_animation)
394 client_->DidStopFlinging();
391 return had_fling_animation; 395 return had_fling_animation;
392 } 396 }
393 397
394 bool InputHandlerProxy::TouchpadFlingScroll( 398 bool InputHandlerProxy::TouchpadFlingScroll(
395 const WebFloatSize& increment) { 399 const WebFloatSize& increment) {
396 WebMouseWheelEvent synthetic_wheel; 400 WebMouseWheelEvent synthetic_wheel;
397 synthetic_wheel.type = WebInputEvent::MouseWheel; 401 synthetic_wheel.type = WebInputEvent::MouseWheel;
398 synthetic_wheel.deltaX = increment.width; 402 synthetic_wheel.deltaX = increment.width;
399 synthetic_wheel.deltaY = increment.height; 403 synthetic_wheel.deltaY = increment.height;
400 synthetic_wheel.hasPreciseScrollingDeltas = true; 404 synthetic_wheel.hasPreciseScrollingDeltas = true;
(...skipping 15 matching lines...) Expand all
416 "InputHandlerProxy::scrollBy::AbortFling", 420 "InputHandlerProxy::scrollBy::AbortFling",
417 TRACE_EVENT_SCOPE_THREAD); 421 TRACE_EVENT_SCOPE_THREAD);
418 // If we got a DID_NOT_HANDLE, that means we need to deliver wheels on the 422 // If we got a DID_NOT_HANDLE, that means we need to deliver wheels on the
419 // main thread. In this case we need to schedule a commit and transfer the 423 // main thread. In this case we need to schedule a commit and transfer the
420 // fling curve over to the main thread and run the rest of the wheels from 424 // fling curve over to the main thread and run the rest of the wheels from
421 // there. This can happen when flinging a page that contains a scrollable 425 // there. This can happen when flinging a page that contains a scrollable
422 // subarea that we can't scroll on the thread if the fling starts outside 426 // subarea that we can't scroll on the thread if the fling starts outside
423 // the subarea but then is flung "under" the pointer. 427 // the subarea but then is flung "under" the pointer.
424 client_->TransferActiveWheelFlingAnimation(fling_parameters_); 428 client_->TransferActiveWheelFlingAnimation(fling_parameters_);
425 fling_may_be_active_on_main_thread_ = true; 429 fling_may_be_active_on_main_thread_ = true;
426 CancelCurrentFling(); 430 CancelCurrentFling(false);
427 break; 431 break;
428 } 432 }
429 433
430 return false; 434 return false;
431 } 435 }
432 436
433 static gfx::Vector2dF ToClientScrollIncrement(const WebFloatSize& increment) { 437 static gfx::Vector2dF ToClientScrollIncrement(const WebFloatSize& increment) {
434 return gfx::Vector2dF(-increment.width, -increment.height); 438 return gfx::Vector2dF(-increment.width, -increment.height);
435 } 439 }
436 440
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 TRACE_EVENT2("renderer", 479 TRACE_EVENT2("renderer",
476 "InputHandlerProxy::notifyCurrentFlingVelocity", 480 "InputHandlerProxy::notifyCurrentFlingVelocity",
477 "vx", 481 "vx",
478 velocity.width, 482 velocity.width,
479 "vy", 483 "vy",
480 velocity.height); 484 velocity.height);
481 input_handler_->NotifyCurrentFlingVelocity(ToClientScrollIncrement(velocity)); 485 input_handler_->NotifyCurrentFlingVelocity(ToClientScrollIncrement(velocity));
482 } 486 }
483 487
484 } // namespace content 488 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698