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..d50bbed25d255424d66d9c88b3e05920e910fb65 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,50 @@ 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. |
+ blink::WebGestureEvent last_gesture_event = |
+ coalesced_gesture_events_.back().event; |
+ 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( |
+ second_last_gesture_event |
+ ? &ui::ToWebGestureEvent(*second_last_gesture_event) |
+ : nullptr, |
+ 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); |
} |