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

Side by Side Diff: content/browser/renderer_host/input/touch_event_queue.cc

Issue 788923002: Touch Events - changedTouches list includes non-changed touch points on Android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: stores touchevent without latency info and other review comment fixes Created 6 years 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
« no previous file with comments | « content/browser/renderer_host/input/touch_event_queue.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 } 696 }
697 697
698 scoped_ptr<CoalescedWebTouchEvent> TouchEventQueue::PopTouchEvent() { 698 scoped_ptr<CoalescedWebTouchEvent> TouchEventQueue::PopTouchEvent() {
699 DCHECK(!touch_queue_.empty()); 699 DCHECK(!touch_queue_.empty());
700 scoped_ptr<CoalescedWebTouchEvent> event(touch_queue_.front()); 700 scoped_ptr<CoalescedWebTouchEvent> event(touch_queue_.front());
701 touch_queue_.pop_front(); 701 touch_queue_.pop_front();
702 return event.Pass(); 702 return event.Pass();
703 } 703 }
704 704
705 void TouchEventQueue::SendTouchEventImmediately( 705 void TouchEventQueue::SendTouchEventImmediately(
706 const TouchEventWithLatencyInfo& touch) { 706 TouchEventWithLatencyInfo& touch) {
jdduke (slow) 2014/12/15 16:51:08 Nit: Either pass by const ref, or by pointer (the
USE s.singapati at gmail.com 2014/12/17 11:28:43 Done.
707 if (needs_async_touchmove_for_outer_slop_region_) { 707 if (needs_async_touchmove_for_outer_slop_region_) {
708 // Any event other than a touchmove (e.g., touchcancel or secondary 708 // Any event other than a touchmove (e.g., touchcancel or secondary
709 // touchstart) after a scroll has started will interrupt the need to send a 709 // touchstart) after a scroll has started will interrupt the need to send a
710 // an outer slop-region exceeding touchmove. 710 // an outer slop-region exceeding touchmove.
711 if (touch.event.type != WebInputEvent::TouchMove || 711 if (touch.event.type != WebInputEvent::TouchMove ||
712 OutsideApplicationSlopRegion(touch.event, 712 OutsideApplicationSlopRegion(touch.event,
713 touch_sequence_start_position_)) 713 touch_sequence_start_position_))
714 needs_async_touchmove_for_outer_slop_region_ = false; 714 needs_async_touchmove_for_outer_slop_region_ = false;
715 } 715 }
716 716
717 // For touchmove events, compare touch points position from current event
718 // to last sent event and update touch points state.
719 if (touch.event.type == WebInputEvent::TouchMove) {
720 if (last_sent_touchmove_) {
721 for (unsigned int i = 0; i < last_sent_touchmove_->touchesLength; ++i) {
722 const WebTouchPoint& last_touchmove_point =
723 last_sent_touchmove_->touches[i];
724
725 // touches with same id may not have same index in touches array
726 for (unsigned int j = 0; j < touch.event.touchesLength; ++j) {
727 WebTouchPoint& current_touchmove_point = touch.event.touches[j];
728 if (last_touchmove_point.id == current_touchmove_point.id) {
729 if (fabs(current_touchmove_point.position.x -
jdduke (slow) 2014/12/15 16:51:08 Can we avoid using the epsilon? If the touch reall
USE s.singapati at gmail.com 2014/12/17 11:28:43 Done. Did more testing and no problems found.
730 last_touchmove_point.position.x) < 0.000001
731 && fabs(current_touchmove_point.position.y -
732 last_touchmove_point.position.y) < 0.000001)
733 current_touchmove_point.state = WebTouchPoint::StateStationary;
734
735 break;
736 }
737 }
738 }
739 *last_sent_touchmove_ = touch.event;
740 } else {
741 last_sent_touchmove_.reset(new WebTouchEvent(touch.event));
742 }
743 } else {
744 if (last_sent_touchmove_)
jdduke (slow) 2014/12/15 16:51:08 Nit: No need for the if, you can just unconditiona
USE s.singapati at gmail.com 2014/12/17 11:28:42 Done.
745 last_sent_touchmove_.reset();
746 }
747
717 client_->SendTouchEventImmediately(touch); 748 client_->SendTouchEventImmediately(touch);
718 } 749 }
719 750
720 TouchEventQueue::PreFilterResult 751 TouchEventQueue::PreFilterResult
721 TouchEventQueue::FilterBeforeForwarding(const WebTouchEvent& event) { 752 TouchEventQueue::FilterBeforeForwarding(const WebTouchEvent& event) {
722 if (timeout_handler_ && timeout_handler_->FilterEvent(event)) 753 if (timeout_handler_ && timeout_handler_->FilterEvent(event))
723 return ACK_WITH_NO_CONSUMER_EXISTS; 754 return ACK_WITH_NO_CONSUMER_EXISTS;
724 755
725 if (touchmove_slop_suppressor_->FilterEvent(event)) 756 if (touchmove_slop_suppressor_->FilterEvent(event))
726 return ACK_WITH_NOT_CONSUMED; 757 return ACK_WITH_NOT_CONSUMED;
727 758
728 if (WebTouchEventTraits::IsTouchSequenceStart(event)) { 759 if (WebTouchEventTraits::IsTouchSequenceStart(event)) {
729 touch_consumer_states_.clear(); 760 touch_consumer_states_.clear();
730 send_touch_events_async_ = false; 761 send_touch_events_async_ = false;
731 pending_async_touchmove_.reset(); 762 pending_async_touchmove_.reset();
763 last_sent_touchmove_.reset();
764
732 touch_sequence_start_position_ = gfx::PointF(event.touches[0].position); 765 touch_sequence_start_position_ = gfx::PointF(event.touches[0].position);
733 drop_remaining_touches_in_sequence_ = false; 766 drop_remaining_touches_in_sequence_ = false;
734 if (!has_handlers_) { 767 if (!has_handlers_) {
735 drop_remaining_touches_in_sequence_ = true; 768 drop_remaining_touches_in_sequence_ = true;
736 return ACK_WITH_NO_CONSUMER_EXISTS; 769 return ACK_WITH_NO_CONSUMER_EXISTS;
737 } 770 }
738 } 771 }
739 772
740 if (drop_remaining_touches_in_sequence_ && 773 if (drop_remaining_touches_in_sequence_ &&
741 event.type != WebInputEvent::TouchCancel) { 774 event.type != WebInputEvent::TouchCancel) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 if (ack_result != INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS) 810 if (ack_result != INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS)
778 touch_consumer_states_.mark_bit(point.id); 811 touch_consumer_states_.mark_bit(point.id);
779 else 812 else
780 touch_consumer_states_.clear_bit(point.id); 813 touch_consumer_states_.clear_bit(point.id);
781 } 814 }
782 } 815 }
783 } 816 }
784 } 817 }
785 818
786 } // namespace content 819 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/input/touch_event_queue.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698