Index: ui/events/blink/event_with_callback.cc |
diff --git a/ui/events/blink/event_with_callback.cc b/ui/events/blink/event_with_callback.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bcbd862ec5208e8ef3c4b3ad7b7d01c1575c8f9c |
--- /dev/null |
+++ b/ui/events/blink/event_with_callback.cc |
@@ -0,0 +1,79 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/events/blink/event_with_callback.h" |
+ |
+#include "base/memory/ptr_util.h" |
+#include "ui/events/blink/blink_event_util.h" |
+#include "ui/events/blink/did_overscroll_params.h" |
+#include "ui/events/blink/web_input_event_traits.h" |
+ |
+using blink::WebInputEvent; |
+using blink::WebGestureEvent; |
+ |
+namespace ui { |
+ |
+EventWithCallback::EventWithCallback( |
+ ScopedWebInputEvent event, |
+ const LatencyInfo& latency, |
+ base::TimeTicks timestamp_now, |
+ const InputHandlerProxy::EventDispositionCallback& callback) |
+ : event_(WebInputEventTraits::Clone(*event)), |
+ latency_(latency), |
+ creation_timestamp_(timestamp_now), |
+ last_coalesced_timestamp_(timestamp_now) { |
+ original_events_.emplace_back(std::move(event), callback); |
+} |
+ |
+EventWithCallback::~EventWithCallback() {} |
+ |
+bool EventWithCallback::CanCoalesceWith(const EventWithCallback& other) const { |
+ return CanCoalesce(other.event(), event()); |
+} |
+ |
+void EventWithCallback::CoalesceWith(EventWithCallback* other, |
+ base::TimeTicks timestamp_now) { |
+ // |other| should be a newer event than |this|. |
+ if (other->latency_.trace_id() >= 0 && latency_.trace_id() >= 0) |
+ DCHECK_GT(other->latency_.trace_id(), latency_.trace_id()); |
+ |
+ // New events get coalesced into older events, and the newer timestamp |
+ // should always be preserved. |
+ const double time_stamp_seconds = other->event().timeStampSeconds; |
+ Coalesce(other->event(), event_.get()); |
+ event_->timeStampSeconds = time_stamp_seconds; |
+ |
+ // When coalescing two input events, we keep the oldest LatencyInfo |
+ // since it will represent the longest latency. |
+ other->latency_ = latency_; |
+ other->latency_.set_coalesced(); |
+ |
+ // Move original events. |
+ original_events_.splice(original_events_.end(), other->original_events_); |
+ last_coalesced_timestamp_ = timestamp_now; |
+} |
+ |
+void EventWithCallback::RunCallbacks( |
+ InputHandlerProxy::EventDisposition disposition, |
+ const LatencyInfo& latency, |
+ std::unique_ptr<DidOverscrollParams> did_overscroll_params) { |
+ for (auto& original_event : original_events_) { |
+ std::unique_ptr<DidOverscrollParams> did_overscroll_params_copy; |
+ if (did_overscroll_params) { |
+ did_overscroll_params_copy = |
+ base::MakeUnique<DidOverscrollParams>(*did_overscroll_params); |
+ } |
+ original_event.callback_.Run(disposition, std::move(original_event.event_), |
+ latency, std::move(did_overscroll_params)); |
+ } |
+} |
+ |
+EventWithCallback::OriginalEventWithCallback::OriginalEventWithCallback( |
+ ScopedWebInputEvent event, |
+ const InputHandlerProxy::EventDispositionCallback& callback) |
+ : event_(std::move(event)), callback_(callback) {} |
+ |
+EventWithCallback::OriginalEventWithCallback::~OriginalEventWithCallback() {} |
+ |
+} // namespace ui |