OLD | NEW |
---|---|
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 |
OLD | NEW |