Chromium Code Reviews| 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 |