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

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: 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 float GetUnacceleratedDelta(float accelerated_delta, float acceleration_ratio) {
20 return accelerated_delta * acceleration_ratio;
21 }
22
23 float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) {
24 if (unaccelerated_delta == 0.f || accelerated_delta == 0.f)
aelias_OOO_until_Jul13 2013/10/14 03:38:57 I know you're just moving this, but this kind of d
jdduke (slow) 2013/10/14 17:03:18 Hmm, normally I'd agree, but it looks like they're
25 return 1.f;
26 return unaccelerated_delta / accelerated_delta;
27 }
28
29 bool TryCoalesce(const WebKeyboardEvent& event_to_coalesce,
30 WebKeyboardEvent* event) {
31 return false;
32 }
33
34 bool TryCoalesce(const WebMouseEvent& event_to_coalesce, WebMouseEvent* event) {
35 if (event->type != event_to_coalesce.type)
36 return false;
37
38 if (event->type != WebInputEvent::MouseMove)
39 return false;
40
41 // Accumulate movement deltas.
42 int x = event->movementX;
43 int y = event->movementY;
44 *event = event_to_coalesce;
45 event->movementX += x;
46 event->movementY += y;
47 return true;
48 }
49
50 bool TryCoalesce(const WebMouseWheelEvent& event_to_coalesce,
51 WebMouseWheelEvent* event) {
52 if (event->modifiers != event_to_coalesce.modifiers)
53 return false;
54
55 if (event->scrollByPage != event_to_coalesce.scrollByPage)
56 return false;
57
58 if (event->hasPreciseScrollingDeltas !=
59 event_to_coalesce.hasPreciseScrollingDeltas)
60 return false;
61
62 if (event->phase != event_to_coalesce.phase)
63 return false;
64
65 if (event->momentumPhase != event_to_coalesce.momentumPhase)
66 return false;
67
68 float unaccelerated_x =
69 GetUnacceleratedDelta(event->deltaX,
70 event->accelerationRatioX) +
71 GetUnacceleratedDelta(event_to_coalesce.deltaX,
72 event_to_coalesce.accelerationRatioX);
73 float unaccelerated_y =
74 GetUnacceleratedDelta(event->deltaY,
75 event->accelerationRatioY) +
76 GetUnacceleratedDelta(event_to_coalesce.deltaY,
77 event_to_coalesce.accelerationRatioY);
78 event->deltaX += event_to_coalesce.deltaX;
79 event->deltaY += event_to_coalesce.deltaY;
80 event->wheelTicksX += event_to_coalesce.wheelTicksX;
81 event->wheelTicksY += event_to_coalesce.wheelTicksY;
82 event->accelerationRatioX =
83 GetAccelerationRatio(event->deltaX, unaccelerated_x);
84 event->accelerationRatioY =
85 GetAccelerationRatio(event->deltaY, unaccelerated_y);
86 DCHECK_GE(event_to_coalesce.timeStampSeconds, event->timeStampSeconds);
87 event->timeStampSeconds = event_to_coalesce.timeStampSeconds;
88 return true;
89 }
90
91 bool TryCoalesce(const WebTouchEvent& event_to_coalesce, WebTouchEvent* event) {
92 if (event->type != event_to_coalesce.type)
93 return false;
94
95 if (event->type != WebInputEvent::TouchMove)
96 return false;
97
98 if (event->modifiers != event_to_coalesce.modifiers)
99 return false;
100
101 if (event->touchesLength != event_to_coalesce.touchesLength)
102 return false;
103
104 // The WebTouchPoints include absolute position information. So it is
105 // sufficient to simply replace the previous event with the new event->
106 // However, it is necessary to make sure that all the points have the
107 // correct state, i.e. the touch-points that moved in the last event, but
108 // didn't change in the current event, will have Stationary state. It is
109 // necessary to change them back to Moved state.
110 WebTouchEvent old_event = *event;
111 *event = event_to_coalesce;
112 for (unsigned i = 0; i < event->touchesLength; ++i) {
113 if (old_event.touches[i].state == WebKit::WebTouchPoint::StateMoved)
114 event->touches[i].state = WebKit::WebTouchPoint::StateMoved;
115 }
116 return true;
117 }
118
119 bool TryCoalesce(const WebGestureEvent& event_to_coalesce,
120 WebGestureEvent* event) {
121 if (event->type != event_to_coalesce.type)
122 return false;
123
124 if (event->type == WebInputEvent::GestureScrollUpdate) {
125 if (event->modifiers != event_to_coalesce.modifiers)
126 return false;
127 event->data.scrollUpdate.deltaX +=
128 event_to_coalesce.data.scrollUpdate.deltaX;
129 event->data.scrollUpdate.deltaY +=
130 event_to_coalesce.data.scrollUpdate.deltaY;
131 return true;
132 }
133
134 // TODO(jdduke): Add support for pinch gesture coalescing.
135 return false;
136 }
137
19 struct WebInputEventSize { 138 struct WebInputEventSize {
20 template <class EventType> 139 template <class EventType>
21 void Execute(WebInputEvent::Type /* type */, size_t* type_size) const { 140 bool Execute(WebInputEvent::Type /* type */, size_t* type_size) const {
22 *type_size = sizeof(EventType); 141 *type_size = sizeof(EventType);
142 return true;
23 } 143 }
24 }; 144 };
25 145
26 struct WebInputEventClone { 146 struct WebInputEventClone {
27 template <class EventType> 147 template <class EventType>
28 void Execute(const WebInputEvent& event, 148 bool Execute(const WebInputEvent& event,
29 ScopedWebInputEvent* scoped_event) const { 149 ScopedWebInputEvent* scoped_event) const {
30 DCHECK_EQ(sizeof(EventType), event.size); 150 DCHECK_EQ(sizeof(EventType), event.size);
31 *scoped_event = ScopedWebInputEvent( 151 *scoped_event = ScopedWebInputEvent(
32 new EventType(static_cast<const EventType&>(event))); 152 new EventType(static_cast<const EventType&>(event)));
153 return true;
33 } 154 }
34 }; 155 };
35 156
36 struct WebInputEventDelete { 157 struct WebInputEventDelete {
37 template <class EventType> 158 template <class EventType>
38 void Execute(WebInputEvent* event, bool* /* dummy_var */) const { 159 bool Execute(WebInputEvent* event, bool* /* dummy_var */) const {
39 if (!event) 160 if (!event)
40 return; 161 return false;
41 DCHECK_EQ(sizeof(EventType), event->size); 162 DCHECK_EQ(sizeof(EventType), event->size);
42 delete static_cast<EventType*>(event); 163 delete static_cast<EventType*>(event);
164 return true;
165 }
166 };
167
168 struct WebInputEventCoalesce {
169 tempalte <class EventType>
170 bool Execute(const WebInputEvent& event_to_coalesce,
171 WebInputEvent* event) const {
172 DCHECK_EQ(event_to_coalesce.type, event->type)
173 DCHECK_EQ(sizeof(EventType), event->size);
174 DCHECK_EQ(sizeof(EventType), event_to_coalesce.size);
175 return TryCoalesce(static_cast<const EventType&>(event_to_coalesce),
176 static_cast<EventType*>(event));
43 } 177 }
44 }; 178 };
45 179
46 template <typename Operator, typename ArgIn, typename ArgOut> 180 template <typename Operator, typename ArgIn, typename ArgOut>
47 void Apply(Operator op, 181 bool Apply(Operator op,
48 WebInputEvent::Type type, 182 WebInputEvent::Type type,
49 const ArgIn& arg_in, 183 const ArgIn& arg_in,
50 ArgOut* arg_out) { 184 ArgOut* arg_out) {
51 if (WebInputEvent::isMouseEventType(type)) 185 if (WebInputEvent::isMouseEventType(type))
52 op.template Execute<WebMouseEvent>(arg_in, arg_out); 186 return op.template Execute<WebMouseEvent>(arg_in, arg_out);
53 else if (type == WebInputEvent::MouseWheel) 187 else if (type == WebInputEvent::MouseWheel)
54 op.template Execute<WebMouseWheelEvent>(arg_in, arg_out); 188 return op.template Execute<WebMouseWheelEvent>(arg_in, arg_out);
55 else if (WebInputEvent::isKeyboardEventType(type)) 189 else if (WebInputEvent::isKeyboardEventType(type))
56 op.template Execute<WebKeyboardEvent>(arg_in, arg_out); 190 return op.template Execute<WebKeyboardEvent>(arg_in, arg_out);
57 else if (WebInputEvent::isTouchEventType(type)) 191 else if (WebInputEvent::isTouchEventType(type))
58 op.template Execute<WebTouchEvent>(arg_in, arg_out); 192 return op.template Execute<WebTouchEvent>(arg_in, arg_out);
59 else if (WebInputEvent::isGestureEventType(type)) 193 else if (WebInputEvent::isGestureEventType(type))
60 op.template Execute<WebGestureEvent>(arg_in, arg_out); 194 return op.template Execute<WebGestureEvent>(arg_in, arg_out);
61 else 195
62 NOTREACHED() << "Unknown webkit event type " << type; 196 NOTREACHED() << "Unknown webkit event type " << type;
197 return false;
63 } 198 }
64 199
65 } // namespace 200 } // namespace
66 201
67 size_t WebInputEventTraits::GetSize(WebInputEvent::Type type) { 202 size_t WebInputEventTraits::GetSize(WebInputEvent::Type type) {
68 size_t size = 0; 203 size_t size = 0;
69 Apply(WebInputEventSize(), type, type, &size); 204 Apply(WebInputEventSize(), type, type, &size);
70 return size; 205 return size;
71 } 206 }
72 207
73 ScopedWebInputEvent WebInputEventTraits::Clone(const WebInputEvent& event) { 208 ScopedWebInputEvent WebInputEventTraits::Clone(const WebInputEvent& event) {
74 ScopedWebInputEvent scoped_event; 209 ScopedWebInputEvent scoped_event;
75 Apply(WebInputEventClone(), event.type, event, &scoped_event); 210 Apply(WebInputEventClone(), event.type, event, &scoped_event);
76 return scoped_event.Pass(); 211 return scoped_event.Pass();
77 } 212 }
78 213
79 void WebInputEventTraits::Delete(WebInputEvent* event) { 214 void WebInputEventTraits::Delete(WebInputEvent* event) {
80 if (!event) 215 if (!event)
81 return; 216 return;
82 bool dummy_var = false; 217 bool dummy_var = false;
83 Apply(WebInputEventDelete(), event->type, event, &dummy_var); 218 Apply(WebInputEventDelete(), event->type, event, &dummy_var);
84 } 219 }
85 220
221 bool WebInputEventTraits::TryCoalesce(const WebInputEvent& event_to_coalesce,
222 WebInputEvent* event) {
223 if (!event || event_to_coalesce.type != event->type)
224 return false;
225 return Apply(WebInputEventCoalesce(), event->type, event_to_coalesce, event);
226 }
227
86 } // namespace content 228 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698