Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Side by Side Diff: ui/events/blink/event_with_callback.cc

Issue 2429953002: Implement compositor thread VSync aligned event queue (Closed)
Patch Set: dtapuska's review: Non-template CompositorThreadEventQueue; Added blink_features.h; UMA only when e… Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/blink/event_with_callback.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "ui/events/blink/did_overscroll_params.h"
9 #include "ui/events/blink/web_input_event_traits.h"
10
11 using blink::WebInputEvent;
12 using blink::WebGestureEvent;
13
14 namespace ui {
15
16 namespace {
17
18 bool CanCoalesce(const WebGestureEvent& event_to_coalesce,
19 const WebGestureEvent& event) {
20 if (event.type != event_to_coalesce.type ||
21 event.sourceDevice != event_to_coalesce.sourceDevice ||
22 event.modifiers != event_to_coalesce.modifiers)
23 return false;
24
25 if (event.type == WebInputEvent::GestureScrollUpdate)
26 return true;
27
28 // GesturePinchUpdate scales can be combined only if they share a focal point,
29 // e.g., with double-tap drag zoom.
30 if (event.type == WebInputEvent::GesturePinchUpdate &&
31 event.x == event_to_coalesce.x && event.y == event_to_coalesce.y)
32 return true;
33
34 return false;
35 }
36
37 void Coalesce(const WebGestureEvent& event_to_coalesce,
38 WebGestureEvent* event) {
tdresser 2016/11/01 18:12:44 Don't we have coalescing logic elsewhere already?
chongz 2016/11/02 21:29:32 Yes I copied from "content/common/input/event_with
tdresser 2016/11/04 16:51:03 Maybe move it to https://cs.chromium.org/chromium/
chongz 2016/11/08 21:59:22 Done.
39 DCHECK(CanCoalesce(event_to_coalesce, *event));
40 if (event->type == WebInputEvent::GestureScrollUpdate) {
41 event->data.scrollUpdate.deltaX +=
42 event_to_coalesce.data.scrollUpdate.deltaX;
43 event->data.scrollUpdate.deltaY +=
44 event_to_coalesce.data.scrollUpdate.deltaY;
45 DCHECK_EQ(
46 event->data.scrollUpdate.previousUpdateInSequencePrevented,
47 event_to_coalesce.data.scrollUpdate.previousUpdateInSequencePrevented);
48 } else if (event->type == WebInputEvent::GesturePinchUpdate) {
49 event->data.pinchUpdate.scale *= event_to_coalesce.data.pinchUpdate.scale;
50 // Ensure the scale remains bounded above 0 and below Infinity so that
51 // we can reliably perform operations like log on the values.
52 if (event->data.pinchUpdate.scale < std::numeric_limits<float>::min())
53 event->data.pinchUpdate.scale = std::numeric_limits<float>::min();
54 else if (event->data.pinchUpdate.scale > std::numeric_limits<float>::max())
55 event->data.pinchUpdate.scale = std::numeric_limits<float>::max();
56 }
57 }
58
59 bool CanCoalesce(const blink::WebInputEvent& event_to_coalesce,
60 const blink::WebInputEvent& event) {
61 if (blink::WebInputEvent::isGestureEventType(event_to_coalesce.type) &&
62 blink::WebInputEvent::isGestureEventType(event.type)) {
63 return CanCoalesce(
64 static_cast<const blink::WebGestureEvent&>(event_to_coalesce),
65 static_cast<const blink::WebGestureEvent&>(event));
66 }
67 return false;
68 }
69
70 void Coalesce(const blink::WebInputEvent& event_to_coalesce,
71 blink::WebInputEvent* event) {
72 if (blink::WebInputEvent::isGestureEventType(event_to_coalesce.type) &&
73 blink::WebInputEvent::isGestureEventType(event->type)) {
74 Coalesce(static_cast<const blink::WebGestureEvent&>(event_to_coalesce),
75 static_cast<blink::WebGestureEvent*>(event));
76 }
77 }
78
79 } // namespace
80
81 EventWithCallback::EventWithCallback(
82 ScopedWebInputEvent event,
83 const LatencyInfo& latency,
84 const InputHandlerProxy::EventDispositionCallback& callback)
85 : event_(WebInputEventTraits::Clone(*event)),
86 latency_(latency),
87 creation_timestamp_(base::TimeTicks::Now()),
88 last_coalesced_timestamp_(creation_timestamp_) {
89 original_events_.emplace_back(std::move(event), callback);
90 }
91
92 EventWithCallback::~EventWithCallback() {}
93
94 bool EventWithCallback::CanCoalesceWith(const EventWithCallback& other) const {
95 return CanCoalesce(other.event(), event());
96 }
97
98 void EventWithCallback::CoalesceWith(EventWithCallback* other) {
99 // |other| should be a newer event than |this|.
100 if (other->latency_.trace_id() >= 0 && latency_.trace_id() >= 0)
101 DCHECK_GT(other->latency_.trace_id(), latency_.trace_id());
102
103 // New events get coalesced into older events, and the newer timestamp
104 // should always be preserved.
105 const double time_stamp_seconds = other->event().timeStampSeconds;
106 Coalesce(other->event(), event_.get());
107 event_->timeStampSeconds = time_stamp_seconds;
108
109 // When coalescing two input events, we keep the oldest LatencyInfo
110 // since it will represent the longest latency.
111 other->latency_ = latency_;
112 other->latency_.set_coalesced();
113
114 // Move original events.
115 original_events_.splice(original_events_.end(), other->original_events_);
116 last_coalesced_timestamp_ = base::TimeTicks::Now();
117 }
118
119 void EventWithCallback::RunCallbacks(
120 InputHandlerProxy::EventDisposition disposition,
121 const LatencyInfo& latency,
122 std::unique_ptr<DidOverscrollParams> did_overscroll_params) {
123 for (auto& original_event : original_events_) {
124 std::unique_ptr<DidOverscrollParams> did_overscroll_params_copy;
125 if (did_overscroll_params) {
126 did_overscroll_params_copy =
127 base::MakeUnique<DidOverscrollParams>(*did_overscroll_params);
128 }
129 original_event.callback_.Run(disposition, std::move(original_event.event_),
130 latency, std::move(did_overscroll_params));
131 }
132 }
133
134 EventWithCallback::OriginalEventWithCallback::OriginalEventWithCallback(
135 ScopedWebInputEvent event,
136 const InputHandlerProxy::EventDispositionCallback& callback)
137 : event_(std::move(event)), callback_(callback) {}
138 EventWithCallback::OriginalEventWithCallback::~OriginalEventWithCallback() {}
139 } // namespace ui
tdresser 2016/11/01 18:12:44 newline before }
chongz 2016/11/02 21:29:32 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698