Chromium Code Reviews| Index: content/browser/renderer_host/input/gesture_event_queue.cc |
| diff --git a/content/browser/renderer_host/input/gesture_event_queue.cc b/content/browser/renderer_host/input/gesture_event_queue.cc |
| index a0a80e382ce04fa2dd27c4e8f0213f6f0fecaa16..2e759f9ccc97259cbfa3ecf4740b4fc443b17ecc 100644 |
| --- a/content/browser/renderer_host/input/gesture_event_queue.cc |
| +++ b/content/browser/renderer_host/input/gesture_event_queue.cc |
| @@ -13,47 +13,6 @@ using blink::WebGestureEvent; |
| using blink::WebInputEvent; |
| namespace content { |
| -namespace { |
| - |
| -// Whether |event_in_queue| is GesturePinchUpdate or GestureScrollUpdate and |
| -// has the same modifiers/source as the new scroll/pinch event. Compatible |
| -// scroll and pinch event pairs can be logically coalesced. |
| -bool IsCompatibleScrollorPinch( |
| - const GestureEventWithLatencyInfo& new_event, |
| - const GestureEventWithLatencyInfo& event_in_queue) { |
| - DCHECK(new_event.event.type == WebInputEvent::GestureScrollUpdate || |
| - new_event.event.type == WebInputEvent::GesturePinchUpdate) |
| - << "Invalid event type for pinch/scroll coalescing: " |
| - << WebInputEvent::GetName(new_event.event.type); |
| - DLOG_IF(WARNING, new_event.event.timeStampSeconds < |
| - event_in_queue.event.timeStampSeconds) |
| - << "Event time not monotonic?\n"; |
| - return (event_in_queue.event.type == WebInputEvent::GestureScrollUpdate || |
| - event_in_queue.event.type == WebInputEvent::GesturePinchUpdate) && |
| - event_in_queue.event.modifiers == new_event.event.modifiers && |
| - event_in_queue.event.sourceDevice == new_event.event.sourceDevice; |
| -} |
| - |
| -// Returns the transform matrix corresponding to the gesture event. |
| -gfx::Transform GetTransformForEvent( |
| - const GestureEventWithLatencyInfo& gesture_event) { |
| - gfx::Transform gesture_transform; |
| - if (gesture_event.event.type == WebInputEvent::GestureScrollUpdate) { |
| - gesture_transform.Translate(gesture_event.event.data.scrollUpdate.deltaX, |
| - gesture_event.event.data.scrollUpdate.deltaY); |
| - } else if (gesture_event.event.type == WebInputEvent::GesturePinchUpdate) { |
| - float scale = gesture_event.event.data.pinchUpdate.scale; |
| - gesture_transform.Translate(-gesture_event.event.x, -gesture_event.event.y); |
| - gesture_transform.Scale(scale, scale); |
| - gesture_transform.Translate(gesture_event.event.x, gesture_event.event.y); |
| - } else { |
| - NOTREACHED() << "Invalid event type for transform retrieval: " |
| - << WebInputEvent::GetName(gesture_event.event.type); |
| - } |
| - return gesture_transform; |
| -} |
| - |
| -} // namespace |
| GestureEventQueue::Config::Config() { |
| } |
| @@ -332,7 +291,8 @@ void GestureEventQueue::QueueScrollOrPinchAndForwardIfNecessary( |
| const GestureEventWithLatencyInfo& first_event = |
| coalesced_gesture_events_.front(); |
| if (gesture_event.event.type != first_event.event.type && |
| - IsCompatibleScrollorPinch(gesture_event, first_event)) { |
| + ui::IsCompatibleScrollorPinch(gesture_event.event, |
| + first_event.event)) { |
| ignore_next_ack_ = true; |
| client_->SendGestureEventImmediately(gesture_event); |
| } |
| @@ -346,63 +306,48 @@ void GestureEventQueue::QueueScrollOrPinchAndForwardIfNecessary( |
| return; |
| } |
| - if (!IsCompatibleScrollorPinch(gesture_event, *last_event)) { |
| + if (!ui::IsCompatibleScrollorPinch(gesture_event.event, last_event->event)) { |
| coalesced_gesture_events_.push_back(gesture_event); |
| return; |
| } |
| + // Extract the last event in queue. |
| + ui::ScopedWebInputEvent last_gesture_event = |
| + ui::WebInputEventTraits::Clone(coalesced_gesture_events_.back().event); |
|
dtapuska
2016/12/13 15:57:22
Does last_gesture_event really need to be heap all
chongz
2016/12/13 16:30:44
Done.
|
| + DCHECK_LE(coalesced_gesture_events_.back().latency.trace_id(), |
| + gesture_event.latency.trace_id()); |
| + ui::LatencyInfo oldest_latency = coalesced_gesture_events_.back().latency; |
| + oldest_latency.set_coalesced(); |
| + coalesced_gesture_events_.pop_back(); |
| + |
| + // Extract the second last event in queue. |
| + ui::ScopedWebInputEvent second_last_gesture_event = nullptr; |
| + if (unsent_events_count > 1 && |
| + ui::IsCompatibleScrollorPinch(gesture_event.event, |
| + coalesced_gesture_events_.back().event)) { |
| + second_last_gesture_event = |
| + ui::WebInputEventTraits::Clone(coalesced_gesture_events_.back().event); |
| + DCHECK_LE(coalesced_gesture_events_.back().latency.trace_id(), |
| + oldest_latency.trace_id()); |
| + oldest_latency = coalesced_gesture_events_.back().latency; |
| + oldest_latency.set_coalesced(); |
| + coalesced_gesture_events_.pop_back(); |
| + } |
| + |
| + std::pair<blink::WebGestureEvent, blink::WebGestureEvent> coalesced_events = |
| + ui::CoalesceScrollAndPinch( |
| + ui::ToWebGestureEvent(second_last_gesture_event.get()), |
| + ui::ToWebGestureEvent(*last_gesture_event), gesture_event.event); |
| + |
| GestureEventWithLatencyInfo scroll_event; |
| + scroll_event.event = coalesced_events.first; |
| + scroll_event.latency = oldest_latency; |
| + |
| GestureEventWithLatencyInfo pinch_event; |
| - scroll_event.event.modifiers |= gesture_event.event.modifiers; |
| - scroll_event.event.sourceDevice = gesture_event.event.sourceDevice; |
| - scroll_event.event.timeStampSeconds = gesture_event.event.timeStampSeconds; |
| - // Keep the oldest LatencyInfo. |
| - DCHECK_LE(last_event->latency.trace_id(), gesture_event.latency.trace_id()); |
| - scroll_event.latency = last_event->latency; |
| - pinch_event = scroll_event; |
| - scroll_event.event.type = WebInputEvent::GestureScrollUpdate; |
| - pinch_event.event.type = WebInputEvent::GesturePinchUpdate; |
| - pinch_event.event.x = gesture_event.event.type == |
| - WebInputEvent::GesturePinchUpdate ? |
| - gesture_event.event.x : last_event->event.x; |
| - pinch_event.event.y = gesture_event.event.type == |
| - WebInputEvent::GesturePinchUpdate ? |
| - gesture_event.event.y : last_event->event.y; |
| - |
| - gfx::Transform combined_scroll_pinch = GetTransformForEvent(*last_event); |
| - // Only include the second-to-last event in the coalesced pair if it exists |
| - // and can be combined with the new event. |
| - if (unsent_events_count > 1) { |
| - const GestureEventWithLatencyInfo& second_last_event = |
| - coalesced_gesture_events_[coalesced_gesture_events_.size() - 2]; |
| - if (IsCompatibleScrollorPinch(gesture_event, second_last_event)) { |
| - // Keep the oldest LatencyInfo. |
| - DCHECK_LE(second_last_event.latency.trace_id(), |
| - scroll_event.latency.trace_id()); |
| - scroll_event.latency = second_last_event.latency; |
| - pinch_event.latency = second_last_event.latency; |
| - combined_scroll_pinch.PreconcatTransform( |
| - GetTransformForEvent(second_last_event)); |
| - coalesced_gesture_events_.pop_back(); |
| - } |
| - } |
| - combined_scroll_pinch.ConcatTransform(GetTransformForEvent(gesture_event)); |
| - coalesced_gesture_events_.pop_back(); |
| + pinch_event.event = coalesced_events.second; |
| + pinch_event.latency = oldest_latency; |
| - float combined_scale = |
| - SkMScalarToFloat(combined_scroll_pinch.matrix().get(0, 0)); |
| - float combined_scroll_pinch_x = |
| - SkMScalarToFloat(combined_scroll_pinch.matrix().get(0, 3)); |
| - float combined_scroll_pinch_y = |
| - SkMScalarToFloat(combined_scroll_pinch.matrix().get(1, 3)); |
| - scroll_event.event.data.scrollUpdate.deltaX = |
| - (combined_scroll_pinch_x + pinch_event.event.x) / combined_scale - |
| - pinch_event.event.x; |
| - scroll_event.event.data.scrollUpdate.deltaY = |
| - (combined_scroll_pinch_y + pinch_event.event.y) / combined_scale - |
| - pinch_event.event.y; |
| coalesced_gesture_events_.push_back(scroll_event); |
| - pinch_event.event.data.pinchUpdate.scale = combined_scale; |
| coalesced_gesture_events_.push_back(pinch_event); |
| } |