Index: ui/events/blink/compositor_thread_event_queue.cc |
diff --git a/ui/events/blink/compositor_thread_event_queue.cc b/ui/events/blink/compositor_thread_event_queue.cc |
index 58290fd98b2e01e27b0da3a6c4806be98293a0a5..6c67c33497c0c36a39c2af1203bcdb28f7773624 100644 |
--- a/ui/events/blink/compositor_thread_event_queue.cc |
+++ b/ui/events/blink/compositor_thread_event_queue.cc |
@@ -4,22 +4,82 @@ |
#include "ui/events/blink/compositor_thread_event_queue.h" |
+#include "base/memory/ptr_util.h" |
+#include "ui/events/blink/blink_event_util.h" |
+#include "ui/events/blink/web_input_event_traits.h" |
+ |
namespace ui { |
CompositorThreadEventQueue::CompositorThreadEventQueue() {} |
CompositorThreadEventQueue::~CompositorThreadEventQueue() {} |
-// TODO(chongz): Support coalescing events across interleaved boundaries. |
-// https://crbug.com/661601 |
-void CompositorThreadEventQueue::Queue(std::unique_ptr<EventWithCallback> event, |
- base::TimeTicks timestamp_now) { |
- if (!queue_.empty() && queue_.back()->CanCoalesceWith(*event)) { |
- queue_.back()->CoalesceWith(event.get(), timestamp_now); |
+void CompositorThreadEventQueue::Queue( |
+ std::unique_ptr<EventWithCallback> new_event, |
+ base::TimeTicks timestamp_now) { |
+ if (queue_.empty() || !IsContinuousGestureEvent(new_event->event().type) || |
+ !IsCompatibleScrollorPinch(ToWebGestureEvent(new_event->event()), |
+ ToWebGestureEvent(queue_.back()->event()))) { |
+ queue_.emplace_back(std::move(new_event)); |
return; |
} |
- queue_.emplace_back(std::move(event)); |
+ if (queue_.back()->CanCoalesceWith(*new_event)) { |
+ queue_.back()->CoalesceWith(new_event.get(), timestamp_now); |
+ return; |
+ } |
+ |
+ // Extract the last event in queue. |
+ std::unique_ptr<EventWithCallback> last_event = std::move(queue_.back()); |
+ queue_.pop_back(); |
+ DCHECK_LE(last_event->latency_info().trace_id(), |
+ new_event->latency_info().trace_id()); |
+ LatencyInfo oldest_latency = last_event->latency_info(); |
+ oldest_latency.set_coalesced(); |
+ base::TimeTicks oldest_creation_timestamp = last_event->creation_timestamp(); |
+ auto combined_original_events = |
+ base::MakeUnique<EventWithCallback::OriginalEventList>(); |
+ combined_original_events->splice(combined_original_events->end(), |
+ last_event->original_events()); |
+ combined_original_events->splice(combined_original_events->end(), |
+ new_event->original_events()); |
+ |
+ // Extract the second last event in queue. |
+ std::unique_ptr<EventWithCallback> second_last_event = nullptr; |
+ if (!queue_.empty() && |
+ IsCompatibleScrollorPinch(ToWebGestureEvent(new_event->event()), |
+ ToWebGestureEvent(queue_.back()->event()))) { |
+ second_last_event = std::move(queue_.back()); |
+ queue_.pop_back(); |
+ DCHECK_LE(second_last_event->latency_info().trace_id(), |
+ oldest_latency.trace_id()); |
+ oldest_latency = second_last_event->latency_info(); |
+ oldest_latency.set_coalesced(); |
+ oldest_creation_timestamp = second_last_event->creation_timestamp(); |
+ combined_original_events->splice(combined_original_events->begin(), |
+ second_last_event->original_events()); |
+ } |
+ |
+ std::pair<blink::WebGestureEvent, blink::WebGestureEvent> coalesced_events = |
+ CoalesceScrollAndPinch( |
+ second_last_event ? &ToWebGestureEvent(second_last_event->event()) |
+ : nullptr, |
+ ToWebGestureEvent(last_event->event()), |
+ ToWebGestureEvent(new_event->event())); |
+ |
+ std::unique_ptr<EventWithCallback> scroll_event = |
+ base::MakeUnique<EventWithCallback>( |
+ WebInputEventTraits::Clone(coalesced_events.first), oldest_latency, |
+ oldest_creation_timestamp, timestamp_now, nullptr); |
+ |
+ std::unique_ptr<EventWithCallback> pinch_event = |
+ base::MakeUnique<EventWithCallback>( |
+ WebInputEventTraits::Clone(coalesced_events.second), oldest_latency, |
+ oldest_creation_timestamp, timestamp_now, |
+ std::move(combined_original_events)); |
+ |
+ queue_.emplace_back(std::move(scroll_event)); |
+ queue_.emplace_back(std::move(pinch_event)); |
} |
std::unique_ptr<EventWithCallback> CompositorThreadEventQueue::Pop() { |