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 "content/browser/renderer_host/input/touch_event_queue.h" | 5 #include "content/browser/renderer_host/input/touch_event_queue.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "content/browser/renderer_host/input/timeout_monitor.h" | 10 #include "content/browser/renderer_host/input/timeout_monitor.h" |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 } else { | 513 } else { |
514 scoped_ptr<TouchEventWithLatencyInfo> async_move = | 514 scoped_ptr<TouchEventWithLatencyInfo> async_move = |
515 pending_async_touchmove_.Pass(); | 515 pending_async_touchmove_.Pass(); |
516 async_move->event.cancelable = false; | 516 async_move->event.cancelable = false; |
517 touch_queue_.push_front(new CoalescedWebTouchEvent(*async_move, true)); | 517 touch_queue_.push_front(new CoalescedWebTouchEvent(*async_move, true)); |
518 SendTouchEventImmediately(*async_move); | 518 SendTouchEventImmediately(*async_move); |
519 return; | 519 return; |
520 } | 520 } |
521 } | 521 } |
522 | 522 |
523 // Note: Marking touchstart events as not-cancelable prevents them from | 523 // Note: Touchstart events are marked cancelable to allow transitions between |
524 // blocking subsequent gestures, but it may not be the best long term solution | 524 // platform scrolling and JS pinching. Touchend events, however, remain |
525 // for tracking touch point dispatch. | 525 // uncancelable, mitigating the risk of jank when transitioning to a fling. |
526 if (send_touch_events_async_) | 526 if (send_touch_events_async_ && touch.event.type != WebInputEvent::TouchStart) |
527 touch.event.cancelable = false; | 527 touch.event.cancelable = false; |
528 | 528 |
529 // A synchronous ack will reset |dispatching_touch_|, in which case | 529 // A synchronous ack will reset |dispatching_touch_|, in which case |
530 // the touch timeout should not be started. | 530 // the touch timeout should not be started. |
531 base::AutoReset<bool> dispatching_touch(&dispatching_touch_, true); | 531 base::AutoReset<bool> dispatching_touch(&dispatching_touch_, true); |
532 SendTouchEventImmediately(touch); | 532 SendTouchEventImmediately(touch); |
533 if (dispatching_touch_ && timeout_handler_) | 533 if (dispatching_touch_ && timeout_handler_) |
534 timeout_handler_->StartIfNecessary(touch); | 534 timeout_handler_->StartIfNecessary(touch); |
535 } | 535 } |
536 | 536 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 if (event.type == WebInputEvent::TouchEnd || | 754 if (event.type == WebInputEvent::TouchEnd || |
755 event.type == WebInputEvent::TouchCancel) { | 755 event.type == WebInputEvent::TouchCancel) { |
756 // The points have been released. Erase the ACK states. | 756 // The points have been released. Erase the ACK states. |
757 for (unsigned i = 0; i < event.touchesLength; ++i) { | 757 for (unsigned i = 0; i < event.touchesLength; ++i) { |
758 const WebTouchPoint& point = event.touches[i]; | 758 const WebTouchPoint& point = event.touches[i]; |
759 if (point.state == WebTouchPoint::StateReleased || | 759 if (point.state == WebTouchPoint::StateReleased || |
760 point.state == WebTouchPoint::StateCancelled) | 760 point.state == WebTouchPoint::StateCancelled) |
761 touch_consumer_states_.clear_bit(point.id); | 761 touch_consumer_states_.clear_bit(point.id); |
762 } | 762 } |
763 } else if (event.type == WebInputEvent::TouchStart) { | 763 } else if (event.type == WebInputEvent::TouchStart) { |
| 764 if (touch_scrolling_mode_ == TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE && |
| 765 ack_result == INPUT_EVENT_ACK_STATE_CONSUMED) { |
| 766 send_touch_events_async_ = false; |
| 767 } |
764 for (unsigned i = 0; i < event.touchesLength; ++i) { | 768 for (unsigned i = 0; i < event.touchesLength; ++i) { |
765 const WebTouchPoint& point = event.touches[i]; | 769 const WebTouchPoint& point = event.touches[i]; |
766 if (point.state == WebTouchPoint::StatePressed) { | 770 if (point.state == WebTouchPoint::StatePressed) { |
767 if (ack_result != INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) | 771 if (ack_result != INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) |
768 touch_consumer_states_.mark_bit(point.id); | 772 touch_consumer_states_.mark_bit(point.id); |
769 else | 773 else |
770 touch_consumer_states_.clear_bit(point.id); | 774 touch_consumer_states_.clear_bit(point.id); |
771 } | 775 } |
772 } | 776 } |
773 } | 777 } |
774 } | 778 } |
775 | 779 |
776 } // namespace content | 780 } // namespace content |
OLD | NEW |