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/public/common/input/web_input_event_traits.h" |
6 | 6 |
7 #include <bitset> | 7 #include <bitset> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 | 12 |
13 using base::StringAppendF; | 13 using base::StringAppendF; |
14 using base::SStringPrintf; | 14 using base::SStringPrintf; |
15 using blink::WebGestureEvent; | 15 using blink::WebGestureEvent; |
16 using blink::WebInputEvent; | 16 using blink::WebInputEvent; |
17 using blink::WebKeyboardEvent; | 17 using blink::WebKeyboardEvent; |
18 using blink::WebMouseEvent; | 18 using blink::WebMouseEvent; |
19 using blink::WebMouseWheelEvent; | 19 using blink::WebMouseWheelEvent; |
20 using blink::WebTouchEvent; | 20 using blink::WebTouchEvent; |
21 using blink::WebTouchPoint; | 21 using blink::WebTouchPoint; |
22 using std::numeric_limits; | 22 using std::numeric_limits; |
23 | 23 |
24 namespace content { | 24 namespace content { |
25 namespace { | 25 namespace { |
26 | 26 |
27 const int kInvalidTouchIndex = -1; | 27 const int kInvalidTouchIndex = -1; |
28 | 28 |
29 void ApppendEventDetails(const WebKeyboardEvent& event, std::string* result) { | 29 void ApppendEventDetails(const WebKeyboardEvent& event, std::string* result) { |
30 StringAppendF(result, | 30 StringAppendF(result, |
31 "{\n WinCode: %d\n NativeCode: %d\n IsSystem: %d\n" | 31 "{\n WinCode: %d\n NativeCode: %d\n IsSystem: %d\n" |
32 " Text: %s\n UnmodifiedText: %s\n KeyIdentifier: %s\n}", | 32 " Text: %s\n UnmodifiedText: %s\n KeyIdentifier: %s\n}", |
33 event.windowsKeyCode, | 33 event.windowsKeyCode, event.nativeKeyCode, event.isSystemKey, |
34 event.nativeKeyCode, | |
35 event.isSystemKey, | |
36 reinterpret_cast<const char*>(event.text), | 34 reinterpret_cast<const char*>(event.text), |
37 reinterpret_cast<const char*>(event.unmodifiedText), | 35 reinterpret_cast<const char*>(event.unmodifiedText), |
38 reinterpret_cast<const char*>(event.keyIdentifier)); | 36 reinterpret_cast<const char*>(event.keyIdentifier)); |
39 } | 37 } |
40 | 38 |
41 void ApppendEventDetails(const WebMouseEvent& event, std::string* result) { | 39 void ApppendEventDetails(const WebMouseEvent& event, std::string* result) { |
42 StringAppendF(result, | 40 StringAppendF(result, |
43 "{\n Button: %d\n Pos: (%d, %d)\n WindowPos: (%d, %d)\n" | 41 "{\n Button: %d\n Pos: (%d, %d)\n WindowPos: (%d, %d)\n" |
44 " GlobalPos: (%d, %d)\n Movement: (%d, %d)\n Clicks: %d\n}", | 42 " GlobalPos: (%d, %d)\n Movement: (%d, %d)\n Clicks: %d\n}", |
45 event.button, | 43 event.button, event.x, event.y, event.windowX, event.windowY, |
46 event.x, | 44 event.globalX, event.globalY, event.movementX, event.movementY, |
47 event.y, | |
48 event.windowX, | |
49 event.windowY, | |
50 event.globalX, | |
51 event.globalY, | |
52 event.movementX, | |
53 event.movementY, | |
54 event.clickCount); | 45 event.clickCount); |
55 } | 46 } |
56 | 47 |
57 void ApppendEventDetails(const WebMouseWheelEvent& event, std::string* result) { | 48 void ApppendEventDetails(const WebMouseWheelEvent& event, std::string* result) { |
58 StringAppendF(result, | 49 StringAppendF( |
59 "{\n Delta: (%f, %f)\n WheelTicks: (%f, %f)\n Accel: (%f, %f)\n" | 50 result, |
60 " ScrollByPage: %d\n HasPreciseScrollingDeltas: %d\n" | 51 "{\n Delta: (%f, %f)\n WheelTicks: (%f, %f)\n Accel: (%f, %f)\n" |
61 " Phase: (%d, %d)\n CanRubberband: (%d, %d)\n CanScroll: %d\n}", | 52 " ScrollByPage: %d\n HasPreciseScrollingDeltas: %d\n" |
62 event.deltaX, | 53 " Phase: (%d, %d)\n CanRubberband: (%d, %d)\n CanScroll: %d\n}", |
63 event.deltaY, | 54 event.deltaX, event.deltaY, event.wheelTicksX, event.wheelTicksY, |
64 event.wheelTicksX, | 55 event.accelerationRatioX, event.accelerationRatioY, event.scrollByPage, |
65 event.wheelTicksY, | 56 event.hasPreciseScrollingDeltas, event.phase, event.momentumPhase, |
66 event.accelerationRatioX, | 57 event.canRubberbandLeft, event.canRubberbandRight, event.canScroll); |
67 event.accelerationRatioY, | |
68 event.scrollByPage, | |
69 event.hasPreciseScrollingDeltas, | |
70 event.phase, | |
71 event.momentumPhase, | |
72 event.canRubberbandLeft, | |
73 event.canRubberbandRight, | |
74 event.canScroll); | |
75 } | 58 } |
76 | 59 |
77 void ApppendEventDetails(const WebGestureEvent& event, std::string* result) { | 60 void ApppendEventDetails(const WebGestureEvent& event, std::string* result) { |
78 StringAppendF(result, | 61 StringAppendF( |
79 "{\n Pos: (%d, %d)\n GlobalPos: (%d, %d)\n SourceDevice: %d\n" | 62 result, |
80 " RawData: (%f, %f, %f, %f, %d)\n}", | 63 "{\n Pos: (%d, %d)\n GlobalPos: (%d, %d)\n SourceDevice: %d\n" |
81 event.x, | 64 " RawData: (%f, %f, %f, %f, %d)\n}", |
82 event.y, | 65 event.x, event.y, event.globalX, event.globalY, event.sourceDevice, |
83 event.globalX, | 66 event.data.scrollUpdate.deltaX, event.data.scrollUpdate.deltaY, |
84 event.globalY, | 67 event.data.scrollUpdate.velocityX, event.data.scrollUpdate.velocityY, |
85 event.sourceDevice, | 68 event.data.scrollUpdate.previousUpdateInSequencePrevented); |
86 event.data.scrollUpdate.deltaX, | |
87 event.data.scrollUpdate.deltaY, | |
88 event.data.scrollUpdate.velocityX, | |
89 event.data.scrollUpdate.velocityY, | |
90 event.data.scrollUpdate.previousUpdateInSequencePrevented); | |
91 } | 69 } |
92 | 70 |
93 void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) { | 71 void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) { |
94 StringAppendF(result, | 72 StringAppendF(result, |
95 " (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f)," | 73 " (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f)," |
96 " Radius: (%f, %f), Rot: %f, Force: %f," | 74 " Radius: (%f, %f), Rot: %f, Force: %f," |
97 " Tilt: (%d, %d)),\n", | 75 " Tilt: (%d, %d)),\n", |
98 point.id, | 76 point.id, point.state, point.screenPosition.x, |
99 point.state, | 77 point.screenPosition.y, point.position.x, point.position.y, |
100 point.screenPosition.x, | 78 point.radiusX, point.radiusY, point.rotationAngle, point.force, |
101 point.screenPosition.y, | 79 point.tiltX, point.tiltY); |
102 point.position.x, | |
103 point.position.y, | |
104 point.radiusX, | |
105 point.radiusY, | |
106 point.rotationAngle, | |
107 point.force, | |
108 point.tiltX, | |
109 point.tiltY); | |
110 } | 80 } |
111 | 81 |
112 void ApppendEventDetails(const WebTouchEvent& event, std::string* result) { | 82 void ApppendEventDetails(const WebTouchEvent& event, std::string* result) { |
113 StringAppendF(result, | 83 StringAppendF(result, |
114 "{\n Touches: %u, Cancelable: %d, CausesScrolling: %d," | 84 "{\n Touches: %u, Cancelable: %d, CausesScrolling: %d," |
115 " uniqueTouchEventId: %u\n[\n", | 85 " uniqueTouchEventId: %u\n[\n", |
116 event.touchesLength, event.cancelable, | 86 event.touchesLength, event.cancelable, |
117 event.causesScrollingIfUncanceled, event.uniqueTouchEventId); | 87 event.causesScrollingIfUncanceled, event.uniqueTouchEventId); |
118 for (unsigned i = 0; i < event.touchesLength; ++i) | 88 for (unsigned i = 0; i < event.touchesLength; ++i) |
119 ApppendTouchPointDetails(event.touches[i], result); | 89 ApppendTouchPointDetails(event.touches[i], result); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) { | 134 float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) { |
165 if (unaccelerated_delta == 0.f || accelerated_delta == 0.f) | 135 if (unaccelerated_delta == 0.f || accelerated_delta == 0.f) |
166 return 1.f; | 136 return 1.f; |
167 return unaccelerated_delta / accelerated_delta; | 137 return unaccelerated_delta / accelerated_delta; |
168 } | 138 } |
169 | 139 |
170 void Coalesce(const WebMouseWheelEvent& event_to_coalesce, | 140 void Coalesce(const WebMouseWheelEvent& event_to_coalesce, |
171 WebMouseWheelEvent* event) { | 141 WebMouseWheelEvent* event) { |
172 DCHECK(CanCoalesce(event_to_coalesce, *event)); | 142 DCHECK(CanCoalesce(event_to_coalesce, *event)); |
173 float unaccelerated_x = | 143 float unaccelerated_x = |
174 GetUnacceleratedDelta(event->deltaX, | 144 GetUnacceleratedDelta(event->deltaX, event->accelerationRatioX) + |
175 event->accelerationRatioX) + | |
176 GetUnacceleratedDelta(event_to_coalesce.deltaX, | 145 GetUnacceleratedDelta(event_to_coalesce.deltaX, |
177 event_to_coalesce.accelerationRatioX); | 146 event_to_coalesce.accelerationRatioX); |
178 float unaccelerated_y = | 147 float unaccelerated_y = |
179 GetUnacceleratedDelta(event->deltaY, | 148 GetUnacceleratedDelta(event->deltaY, event->accelerationRatioY) + |
180 event->accelerationRatioY) + | |
181 GetUnacceleratedDelta(event_to_coalesce.deltaY, | 149 GetUnacceleratedDelta(event_to_coalesce.deltaY, |
182 event_to_coalesce.accelerationRatioY); | 150 event_to_coalesce.accelerationRatioY); |
183 event->deltaX += event_to_coalesce.deltaX; | 151 event->deltaX += event_to_coalesce.deltaX; |
184 event->deltaY += event_to_coalesce.deltaY; | 152 event->deltaY += event_to_coalesce.deltaY; |
185 event->wheelTicksX += event_to_coalesce.wheelTicksX; | 153 event->wheelTicksX += event_to_coalesce.wheelTicksX; |
186 event->wheelTicksY += event_to_coalesce.wheelTicksY; | 154 event->wheelTicksY += event_to_coalesce.wheelTicksY; |
187 event->accelerationRatioX = | 155 event->accelerationRatioX = |
188 GetAccelerationRatio(event->deltaX, unaccelerated_x); | 156 GetAccelerationRatio(event->deltaX, unaccelerated_x); |
189 event->accelerationRatioY = | 157 event->accelerationRatioY = |
190 GetAccelerationRatio(event->deltaY, unaccelerated_y); | 158 GetAccelerationRatio(event->deltaY, unaccelerated_y); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 event.sourceDevice != event_to_coalesce.sourceDevice || | 217 event.sourceDevice != event_to_coalesce.sourceDevice || |
250 event.modifiers != event_to_coalesce.modifiers) | 218 event.modifiers != event_to_coalesce.modifiers) |
251 return false; | 219 return false; |
252 | 220 |
253 if (event.type == WebInputEvent::GestureScrollUpdate) | 221 if (event.type == WebInputEvent::GestureScrollUpdate) |
254 return true; | 222 return true; |
255 | 223 |
256 // GesturePinchUpdate scales can be combined only if they share a focal point, | 224 // GesturePinchUpdate scales can be combined only if they share a focal point, |
257 // e.g., with double-tap drag zoom. | 225 // e.g., with double-tap drag zoom. |
258 if (event.type == WebInputEvent::GesturePinchUpdate && | 226 if (event.type == WebInputEvent::GesturePinchUpdate && |
259 event.x == event_to_coalesce.x && | 227 event.x == event_to_coalesce.x && event.y == event_to_coalesce.y) |
260 event.y == event_to_coalesce.y) | |
261 return true; | 228 return true; |
262 | 229 |
263 return false; | 230 return false; |
264 } | 231 } |
265 | 232 |
266 void Coalesce(const WebGestureEvent& event_to_coalesce, | 233 void Coalesce(const WebGestureEvent& event_to_coalesce, |
267 WebGestureEvent* event) { | 234 WebGestureEvent* event) { |
268 DCHECK(CanCoalesce(event_to_coalesce, *event)); | 235 DCHECK(CanCoalesce(event_to_coalesce, *event)); |
269 if (event->type == WebInputEvent::GestureScrollUpdate) { | 236 if (event->type == WebInputEvent::GestureScrollUpdate) { |
270 event->data.scrollUpdate.deltaX += | 237 event->data.scrollUpdate.deltaX += |
(...skipping 12 matching lines...) Expand all Loading... |
283 else if (event->data.pinchUpdate.scale > numeric_limits<float>::max()) | 250 else if (event->data.pinchUpdate.scale > numeric_limits<float>::max()) |
284 event->data.pinchUpdate.scale = numeric_limits<float>::max(); | 251 event->data.pinchUpdate.scale = numeric_limits<float>::max(); |
285 } | 252 } |
286 } | 253 } |
287 | 254 |
288 struct WebInputEventToString { | 255 struct WebInputEventToString { |
289 template <class EventType> | 256 template <class EventType> |
290 bool Execute(const WebInputEvent& event, std::string* result) const { | 257 bool Execute(const WebInputEvent& event, std::string* result) const { |
291 SStringPrintf(result, "%s (Time: %lf, Modifiers: %d)\n", | 258 SStringPrintf(result, "%s (Time: %lf, Modifiers: %d)\n", |
292 WebInputEventTraits::GetName(event.type), | 259 WebInputEventTraits::GetName(event.type), |
293 event.timeStampSeconds, | 260 event.timeStampSeconds, event.modifiers); |
294 event.modifiers); | |
295 const EventType& typed_event = static_cast<const EventType&>(event); | 261 const EventType& typed_event = static_cast<const EventType&>(event); |
296 ApppendEventDetails(typed_event, result); | 262 ApppendEventDetails(typed_event, result); |
297 return true; | 263 return true; |
298 } | 264 } |
299 }; | 265 }; |
300 | 266 |
301 struct WebInputEventSize { | 267 struct WebInputEventSize { |
302 template <class EventType> | 268 template <class EventType> |
303 bool Execute(WebInputEvent::Type /* type */, size_t* type_size) const { | 269 bool Execute(WebInputEvent::Type /* type */, size_t* type_size) const { |
304 *type_size = sizeof(EventType); | 270 *type_size = sizeof(EventType); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 else if (WebInputEvent::isGestureEventType(type)) | 337 else if (WebInputEvent::isGestureEventType(type)) |
372 return op.template Execute<WebGestureEvent>(arg_in, arg_out); | 338 return op.template Execute<WebGestureEvent>(arg_in, arg_out); |
373 | 339 |
374 NOTREACHED() << "Unknown webkit event type " << type; | 340 NOTREACHED() << "Unknown webkit event type " << type; |
375 return false; | 341 return false; |
376 } | 342 } |
377 | 343 |
378 } // namespace | 344 } // namespace |
379 | 345 |
380 const char* WebInputEventTraits::GetName(WebInputEvent::Type type) { | 346 const char* WebInputEventTraits::GetName(WebInputEvent::Type type) { |
381 #define CASE_TYPE(t) case WebInputEvent::t: return #t | 347 #define CASE_TYPE(t) \ |
382 switch(type) { | 348 case WebInputEvent::t: \ |
| 349 return #t |
| 350 switch (type) { |
383 CASE_TYPE(Undefined); | 351 CASE_TYPE(Undefined); |
384 CASE_TYPE(MouseDown); | 352 CASE_TYPE(MouseDown); |
385 CASE_TYPE(MouseUp); | 353 CASE_TYPE(MouseUp); |
386 CASE_TYPE(MouseMove); | 354 CASE_TYPE(MouseMove); |
387 CASE_TYPE(MouseEnter); | 355 CASE_TYPE(MouseEnter); |
388 CASE_TYPE(MouseLeave); | 356 CASE_TYPE(MouseLeave); |
389 CASE_TYPE(ContextMenu); | 357 CASE_TYPE(ContextMenu); |
390 CASE_TYPE(MouseWheel); | 358 CASE_TYPE(MouseWheel); |
391 CASE_TYPE(RawKeyDown); | 359 CASE_TYPE(RawKeyDown); |
392 CASE_TYPE(KeyDown); | 360 CASE_TYPE(KeyDown); |
(...skipping 16 matching lines...) Expand all Loading... |
409 CASE_TYPE(GesturePinchBegin); | 377 CASE_TYPE(GesturePinchBegin); |
410 CASE_TYPE(GesturePinchEnd); | 378 CASE_TYPE(GesturePinchEnd); |
411 CASE_TYPE(GesturePinchUpdate); | 379 CASE_TYPE(GesturePinchUpdate); |
412 CASE_TYPE(TouchStart); | 380 CASE_TYPE(TouchStart); |
413 CASE_TYPE(TouchMove); | 381 CASE_TYPE(TouchMove); |
414 CASE_TYPE(TouchEnd); | 382 CASE_TYPE(TouchEnd); |
415 CASE_TYPE(TouchCancel); | 383 CASE_TYPE(TouchCancel); |
416 default: | 384 default: |
417 // Must include default to let blink::WebInputEvent add new event types | 385 // Must include default to let blink::WebInputEvent add new event types |
418 // before they're added here. | 386 // before they're added here. |
419 DLOG(WARNING) << | 387 DLOG(WARNING) |
420 "Unhandled WebInputEvent type in WebInputEventTraits::GetName.\n"; | 388 << "Unhandled WebInputEvent type in WebInputEventTraits::GetName.\n"; |
421 break; | 389 break; |
422 } | 390 } |
423 #undef CASE_TYPE | 391 #undef CASE_TYPE |
424 return ""; | 392 return ""; |
425 } | 393 } |
426 | 394 |
427 std::string WebInputEventTraits::ToString(const WebInputEvent& event) { | 395 std::string WebInputEventTraits::ToString(const WebInputEvent& event) { |
428 std::string result; | 396 std::string result; |
429 Apply(WebInputEventToString(), event.type, event, &result); | 397 Apply(WebInputEventToString(), event.type, event, &result); |
430 return result; | 398 return result; |
(...skipping 16 matching lines...) Expand all Loading... |
447 return; | 415 return; |
448 bool dummy_var = false; | 416 bool dummy_var = false; |
449 Apply(WebInputEventDelete(), event->type, event, &dummy_var); | 417 Apply(WebInputEventDelete(), event->type, event, &dummy_var); |
450 } | 418 } |
451 | 419 |
452 bool WebInputEventTraits::CanCoalesce(const WebInputEvent& event_to_coalesce, | 420 bool WebInputEventTraits::CanCoalesce(const WebInputEvent& event_to_coalesce, |
453 const WebInputEvent& event) { | 421 const WebInputEvent& event) { |
454 // Early out before casting. | 422 // Early out before casting. |
455 if (event_to_coalesce.type != event.type) | 423 if (event_to_coalesce.type != event.type) |
456 return false; | 424 return false; |
457 return Apply(WebInputEventCanCoalesce(), | 425 return Apply(WebInputEventCanCoalesce(), event.type, event_to_coalesce, |
458 event.type, | |
459 event_to_coalesce, | |
460 &event); | 426 &event); |
461 } | 427 } |
462 | 428 |
463 void WebInputEventTraits::Coalesce(const WebInputEvent& event_to_coalesce, | 429 void WebInputEventTraits::Coalesce(const WebInputEvent& event_to_coalesce, |
464 WebInputEvent* event) { | 430 WebInputEvent* event) { |
465 DCHECK(event); | 431 DCHECK(event); |
466 Apply(WebInputEventCoalesce(), event->type, event_to_coalesce, event); | 432 Apply(WebInputEventCoalesce(), event->type, event_to_coalesce, event); |
467 } | 433 } |
468 | 434 |
469 bool WebInputEventTraits::WillReceiveAckFromRenderer( | 435 bool WebInputEventTraits::WillReceiveAckFromRenderer( |
(...skipping 24 matching lines...) Expand all Loading... |
494 | 460 |
495 uint32_t WebInputEventTraits::GetUniqueTouchEventId( | 461 uint32_t WebInputEventTraits::GetUniqueTouchEventId( |
496 const WebInputEvent& event) { | 462 const WebInputEvent& event) { |
497 if (WebInputEvent::isTouchEventType(event.type)) { | 463 if (WebInputEvent::isTouchEventType(event.type)) { |
498 return static_cast<const WebTouchEvent&>(event).uniqueTouchEventId; | 464 return static_cast<const WebTouchEvent&>(event).uniqueTouchEventId; |
499 } | 465 } |
500 return 0U; | 466 return 0U; |
501 } | 467 } |
502 | 468 |
503 } // namespace content | 469 } // namespace content |
OLD | NEW |