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