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