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

Side by Side Diff: content/common/input/web_input_event_traits.cc

Issue 26923002: Consolidate WebInputEvent coalescing logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and review Created 7 years, 2 months 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/input/web_input_event_traits.h" 5 #include "content/common/input/web_input_event_traits.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 8
9 using WebKit::WebGestureEvent; 9 using WebKit::WebGestureEvent;
10 using WebKit::WebInputEvent; 10 using WebKit::WebInputEvent;
11 using WebKit::WebKeyboardEvent; 11 using WebKit::WebKeyboardEvent;
12 using WebKit::WebMouseEvent; 12 using WebKit::WebMouseEvent;
13 using WebKit::WebMouseWheelEvent; 13 using WebKit::WebMouseWheelEvent;
14 using WebKit::WebTouchEvent; 14 using WebKit::WebTouchEvent;
15 15
16 namespace content { 16 namespace content {
17 namespace { 17 namespace {
18 18
19 bool CanCoalesce(const WebKeyboardEvent& event_to_coalesce,
20 const WebKeyboardEvent& event) {
21 return false;
22 }
23
24 void Coalesce(const WebKeyboardEvent& event_to_coalesce,
25 WebKeyboardEvent* event) {
26 NOTREACHED() << "Keyboard coalescing not possible.";
27 }
28
29 bool CanCoalesce(const WebMouseEvent& event_to_coalesce,
30 const WebMouseEvent& event) {
31 return event.type == event_to_coalesce.type &&
32 event.type == WebInputEvent::MouseMove;
33 }
34
35 void Coalesce(const WebMouseEvent& event_to_coalesce, WebMouseEvent* event) {
36 // Accumulate movement deltas.
37 int x = event->movementX;
aelias_OOO_until_Jul13 2013/10/14 19:05:58 Please add DCHECK(CanCoalesce(event_to_coalsece, *
jdduke (slow) 2013/10/14 19:10:12 OK. I had the DCHECK in WebInputEventTraits::Coal
38 int y = event->movementY;
39 *event = event_to_coalesce;
40 event->movementX += x;
41 event->movementY += y;
42 }
43
44 bool CanCoalesce(const WebMouseWheelEvent& event_to_coalesce,
45 const WebMouseWheelEvent& event) {
46 return event.modifiers == event_to_coalesce.modifiers &&
47 event.scrollByPage == event_to_coalesce.scrollByPage &&
48 event.phase == event_to_coalesce.phase &&
49 event.momentumPhase == event_to_coalesce.momentumPhase &&
50 event.hasPreciseScrollingDeltas ==
51 event_to_coalesce.hasPreciseScrollingDeltas;
52 }
53
54 float GetUnacceleratedDelta(float accelerated_delta, float acceleration_ratio) {
55 return accelerated_delta * acceleration_ratio;
56 }
57
58 float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) {
59 if (unaccelerated_delta == 0.f || accelerated_delta == 0.f)
60 return 1.f;
61 return unaccelerated_delta / accelerated_delta;
62 }
63
64 void Coalesce(const WebMouseWheelEvent& event_to_coalesce,
65 WebMouseWheelEvent* event) {
66 float unaccelerated_x =
67 GetUnacceleratedDelta(event->deltaX,
68 event->accelerationRatioX) +
69 GetUnacceleratedDelta(event_to_coalesce.deltaX,
70 event_to_coalesce.accelerationRatioX);
71 float unaccelerated_y =
72 GetUnacceleratedDelta(event->deltaY,
73 event->accelerationRatioY) +
74 GetUnacceleratedDelta(event_to_coalesce.deltaY,
75 event_to_coalesce.accelerationRatioY);
76 event->deltaX += event_to_coalesce.deltaX;
77 event->deltaY += event_to_coalesce.deltaY;
78 event->wheelTicksX += event_to_coalesce.wheelTicksX;
79 event->wheelTicksY += event_to_coalesce.wheelTicksY;
80 event->accelerationRatioX =
81 GetAccelerationRatio(event->deltaX, unaccelerated_x);
82 event->accelerationRatioY =
83 GetAccelerationRatio(event->deltaY, unaccelerated_y);
84 DCHECK_GE(event_to_coalesce.timeStampSeconds, event->timeStampSeconds);
85 event->timeStampSeconds = event_to_coalesce.timeStampSeconds;
86 }
87
88 bool CanCoalesce(const WebTouchEvent& event_to_coalesce,
89 const WebTouchEvent& event) {
90 return event.type == event_to_coalesce.type &&
91 event.type == WebInputEvent::TouchMove &&
92 event.modifiers == event_to_coalesce.modifiers &&
93 event.touchesLength == event_to_coalesce.touchesLength;
94 }
95
96 void Coalesce(const WebTouchEvent& event_to_coalesce, WebTouchEvent* event) {
97 // The WebTouchPoints include absolute position information. So it is
98 // sufficient to simply replace the previous event with the new event->
99 // However, it is necessary to make sure that all the points have the
100 // correct state, i.e. the touch-points that moved in the last event, but
101 // didn't change in the current event, will have Stationary state. It is
102 // necessary to change them back to Moved state.
103 WebTouchEvent old_event = *event;
104 *event = event_to_coalesce;
105 for (unsigned i = 0; i < event->touchesLength; ++i) {
106 if (old_event.touches[i].state == WebKit::WebTouchPoint::StateMoved)
107 event->touches[i].state = WebKit::WebTouchPoint::StateMoved;
108 }
109 }
110
111 bool CanCoalesce(const WebGestureEvent& event_to_coalesce,
112 const WebGestureEvent& event) {
113 return event.type == event_to_coalesce.type &&
114 event.type == WebInputEvent::GestureScrollUpdate &&
115 event.modifiers == event_to_coalesce.modifiers;
116 }
117
118 void Coalesce(const WebGestureEvent& event_to_coalesce,
119 WebGestureEvent* event) {
120 event->data.scrollUpdate.deltaX += event_to_coalesce.data.scrollUpdate.deltaX;
121 event->data.scrollUpdate.deltaY += event_to_coalesce.data.scrollUpdate.deltaY;
122 }
123
19 struct WebInputEventSize { 124 struct WebInputEventSize {
20 template <class EventType> 125 template <class EventType>
21 void Execute(WebInputEvent::Type /* type */, size_t* type_size) const { 126 bool Execute(WebInputEvent::Type /* type */, size_t* type_size) const {
22 *type_size = sizeof(EventType); 127 *type_size = sizeof(EventType);
128 return true;
23 } 129 }
24 }; 130 };
25 131
26 struct WebInputEventClone { 132 struct WebInputEventClone {
27 template <class EventType> 133 template <class EventType>
28 void Execute(const WebInputEvent& event, 134 bool Execute(const WebInputEvent& event,
29 ScopedWebInputEvent* scoped_event) const { 135 ScopedWebInputEvent* scoped_event) const {
30 DCHECK_EQ(sizeof(EventType), event.size); 136 DCHECK_EQ(sizeof(EventType), event.size);
31 *scoped_event = ScopedWebInputEvent( 137 *scoped_event = ScopedWebInputEvent(
32 new EventType(static_cast<const EventType&>(event))); 138 new EventType(static_cast<const EventType&>(event)));
139 return true;
33 } 140 }
34 }; 141 };
35 142
36 struct WebInputEventDelete { 143 struct WebInputEventDelete {
37 template <class EventType> 144 template <class EventType>
38 void Execute(WebInputEvent* event, bool* /* dummy_var */) const { 145 bool Execute(WebInputEvent* event, bool* /* dummy_var */) const {
39 if (!event) 146 if (!event)
40 return; 147 return false;
41 DCHECK_EQ(sizeof(EventType), event->size); 148 DCHECK_EQ(sizeof(EventType), event->size);
42 delete static_cast<EventType*>(event); 149 delete static_cast<EventType*>(event);
150 return true;
151 }
152 };
153
154 struct WebInputEventCanCoalesce {
155 template <class EventType>
156 bool Execute(const WebInputEvent& event_to_coalesce,
157 const WebInputEvent* event) const {
158 if (event_to_coalesce.type != event->type)
159 return false;
160 DCHECK_EQ(sizeof(EventType), event->size);
161 DCHECK_EQ(sizeof(EventType), event_to_coalesce.size);
162 return CanCoalesce(static_cast<const EventType&>(event_to_coalesce),
163 *static_cast<const EventType*>(event));
164 }
165 };
166
167 struct WebInputEventCoalesce {
168 template <class EventType>
169 bool Execute(const WebInputEvent& event_to_coalesce,
170 WebInputEvent* event) const {
171 Coalesce(static_cast<const EventType&>(event_to_coalesce),
172 static_cast<EventType*>(event));
173 return true;
43 } 174 }
44 }; 175 };
45 176
46 template <typename Operator, typename ArgIn, typename ArgOut> 177 template <typename Operator, typename ArgIn, typename ArgOut>
47 void Apply(Operator op, 178 bool Apply(Operator op,
48 WebInputEvent::Type type, 179 WebInputEvent::Type type,
49 const ArgIn& arg_in, 180 const ArgIn& arg_in,
50 ArgOut* arg_out) { 181 ArgOut* arg_out) {
51 if (WebInputEvent::isMouseEventType(type)) 182 if (WebInputEvent::isMouseEventType(type))
52 op.template Execute<WebMouseEvent>(arg_in, arg_out); 183 return op.template Execute<WebMouseEvent>(arg_in, arg_out);
53 else if (type == WebInputEvent::MouseWheel) 184 else if (type == WebInputEvent::MouseWheel)
54 op.template Execute<WebMouseWheelEvent>(arg_in, arg_out); 185 return op.template Execute<WebMouseWheelEvent>(arg_in, arg_out);
55 else if (WebInputEvent::isKeyboardEventType(type)) 186 else if (WebInputEvent::isKeyboardEventType(type))
56 op.template Execute<WebKeyboardEvent>(arg_in, arg_out); 187 return op.template Execute<WebKeyboardEvent>(arg_in, arg_out);
57 else if (WebInputEvent::isTouchEventType(type)) 188 else if (WebInputEvent::isTouchEventType(type))
58 op.template Execute<WebTouchEvent>(arg_in, arg_out); 189 return op.template Execute<WebTouchEvent>(arg_in, arg_out);
59 else if (WebInputEvent::isGestureEventType(type)) 190 else if (WebInputEvent::isGestureEventType(type))
60 op.template Execute<WebGestureEvent>(arg_in, arg_out); 191 return op.template Execute<WebGestureEvent>(arg_in, arg_out);
61 else 192
62 NOTREACHED() << "Unknown webkit event type " << type; 193 NOTREACHED() << "Unknown webkit event type " << type;
194 return false;
63 } 195 }
64 196
65 } // namespace 197 } // namespace
66 198
67 size_t WebInputEventTraits::GetSize(WebInputEvent::Type type) { 199 size_t WebInputEventTraits::GetSize(WebInputEvent::Type type) {
68 size_t size = 0; 200 size_t size = 0;
69 Apply(WebInputEventSize(), type, type, &size); 201 Apply(WebInputEventSize(), type, type, &size);
70 return size; 202 return size;
71 } 203 }
72 204
73 ScopedWebInputEvent WebInputEventTraits::Clone(const WebInputEvent& event) { 205 ScopedWebInputEvent WebInputEventTraits::Clone(const WebInputEvent& event) {
74 ScopedWebInputEvent scoped_event; 206 ScopedWebInputEvent scoped_event;
75 Apply(WebInputEventClone(), event.type, event, &scoped_event); 207 Apply(WebInputEventClone(), event.type, event, &scoped_event);
76 return scoped_event.Pass(); 208 return scoped_event.Pass();
77 } 209 }
78 210
79 void WebInputEventTraits::Delete(WebInputEvent* event) { 211 void WebInputEventTraits::Delete(WebInputEvent* event) {
80 if (!event) 212 if (!event)
81 return; 213 return;
82 bool dummy_var = false; 214 bool dummy_var = false;
83 Apply(WebInputEventDelete(), event->type, event, &dummy_var); 215 Apply(WebInputEventDelete(), event->type, event, &dummy_var);
84 } 216 }
85 217
218 bool WebInputEventTraits::CanCoalesce(const WebInputEvent& event_to_coalesce,
219 const WebInputEvent& event) {
220 // Early out before casting.
221 if (event_to_coalesce.type != event.type)
222 return false;
223 return Apply(WebInputEventCanCoalesce(),
224 event.type,
225 event_to_coalesce,
226 &event);
227 }
228
229 void WebInputEventTraits::Coalesce(const WebInputEvent& event_to_coalesce,
230 WebInputEvent* event) {
231 DCHECK(event);
232 DCHECK(CanCoalesce(event_to_coalesce, *event));
233 Apply(WebInputEventCoalesce(), event->type, event_to_coalesce, event);
234 }
235
86 } // namespace content 236 } // namespace content
OLDNEW
« no previous file with comments | « content/common/input/web_input_event_traits.h ('k') | content/port/browser/event_with_latency_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698