| Index: ui/events/gesture_detection/touch_disposition_gesture_filter.cc
 | 
| diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
 | 
| index 5a9e75247eea5b6519d51b928e51eef1bedbe77e..05e9db71167e9f8cd279e47f165a444906ecba65 100644
 | 
| --- a/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
 | 
| +++ b/ui/events/gesture_detection/touch_disposition_gesture_filter.cc
 | 
| @@ -168,14 +168,19 @@ TouchDispositionGestureFilter::OnGesturePacket(
 | 
|      return SUCCESS;
 | 
|    }
 | 
|  
 | 
| -  // Check the packet's unique_touch_event_id is valid and unique.
 | 
| +  // Check the packet's unique_touch_event_id is valid and unique with the
 | 
| +  // exception of TOUCH_TIMEOUT packets which have the unique_touch_event_id_
 | 
| +  // of 0. |TOUCH_TIMEOUT| packets don't wait for an ack, they are dispatched
 | 
| +  // as soon as they reach the head of the queue, in |SendAckedEvents|.
 | 
|    if (!Tail().empty()) {
 | 
| -    DCHECK_NE(packet.unique_touch_event_id(),
 | 
| -              Tail().back().unique_touch_event_id());
 | 
| +    DCHECK((packet.gesture_source() == GestureEventDataPacket::TOUCH_TIMEOUT)
 | 
| +            || (packet.unique_touch_event_id() !=
 | 
| +                    Tail().back().unique_touch_event_id()));
 | 
|    }
 | 
|    if (!Head().empty()) {
 | 
|      DCHECK_NE(packet.unique_touch_event_id(),
 | 
|                Head().front().unique_touch_event_id());
 | 
| +
 | 
|    }
 | 
|  
 | 
|    Tail().push(packet);
 | 
| 
 |