Index: content/common/input/web_input_event_traits.cc |
diff --git a/content/common/input/web_input_event_traits.cc b/content/common/input/web_input_event_traits.cc |
deleted file mode 100644 |
index 1008c549ef6909e60ff73a637efea217c6f11c4a..0000000000000000000000000000000000000000 |
--- a/content/common/input/web_input_event_traits.cc |
+++ /dev/null |
@@ -1,503 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/common/input/web_input_event_traits.h" |
- |
-#include <bitset> |
-#include <limits> |
- |
-#include "base/logging.h" |
-#include "base/strings/stringprintf.h" |
- |
-using base::StringAppendF; |
-using base::SStringPrintf; |
-using blink::WebGestureEvent; |
-using blink::WebInputEvent; |
-using blink::WebKeyboardEvent; |
-using blink::WebMouseEvent; |
-using blink::WebMouseWheelEvent; |
-using blink::WebTouchEvent; |
-using blink::WebTouchPoint; |
-using std::numeric_limits; |
- |
-namespace content { |
-namespace { |
- |
-const int kInvalidTouchIndex = -1; |
- |
-void ApppendEventDetails(const WebKeyboardEvent& event, std::string* result) { |
- StringAppendF(result, |
- "{\n WinCode: %d\n NativeCode: %d\n IsSystem: %d\n" |
- " Text: %s\n UnmodifiedText: %s\n KeyIdentifier: %s\n}", |
- event.windowsKeyCode, |
- event.nativeKeyCode, |
- event.isSystemKey, |
- reinterpret_cast<const char*>(event.text), |
- reinterpret_cast<const char*>(event.unmodifiedText), |
- reinterpret_cast<const char*>(event.keyIdentifier)); |
-} |
- |
-void ApppendEventDetails(const WebMouseEvent& event, std::string* result) { |
- StringAppendF(result, |
- "{\n Button: %d\n Pos: (%d, %d)\n WindowPos: (%d, %d)\n" |
- " GlobalPos: (%d, %d)\n Movement: (%d, %d)\n Clicks: %d\n}", |
- event.button, |
- event.x, |
- event.y, |
- event.windowX, |
- event.windowY, |
- event.globalX, |
- event.globalY, |
- event.movementX, |
- event.movementY, |
- event.clickCount); |
-} |
- |
-void ApppendEventDetails(const WebMouseWheelEvent& event, std::string* result) { |
- StringAppendF(result, |
- "{\n Delta: (%f, %f)\n WheelTicks: (%f, %f)\n Accel: (%f, %f)\n" |
- " ScrollByPage: %d\n HasPreciseScrollingDeltas: %d\n" |
- " Phase: (%d, %d)\n CanRubberband: (%d, %d)\n CanScroll: %d\n}", |
- event.deltaX, |
- event.deltaY, |
- event.wheelTicksX, |
- event.wheelTicksY, |
- event.accelerationRatioX, |
- event.accelerationRatioY, |
- event.scrollByPage, |
- event.hasPreciseScrollingDeltas, |
- event.phase, |
- event.momentumPhase, |
- event.canRubberbandLeft, |
- event.canRubberbandRight, |
- event.canScroll); |
-} |
- |
-void ApppendEventDetails(const WebGestureEvent& event, std::string* result) { |
- StringAppendF(result, |
- "{\n Pos: (%d, %d)\n GlobalPos: (%d, %d)\n SourceDevice: %d\n" |
- " RawData: (%f, %f, %f, %f, %d)\n}", |
- event.x, |
- event.y, |
- event.globalX, |
- event.globalY, |
- event.sourceDevice, |
- event.data.scrollUpdate.deltaX, |
- event.data.scrollUpdate.deltaY, |
- event.data.scrollUpdate.velocityX, |
- event.data.scrollUpdate.velocityY, |
- event.data.scrollUpdate.previousUpdateInSequencePrevented); |
-} |
- |
-void ApppendTouchPointDetails(const WebTouchPoint& point, std::string* result) { |
- StringAppendF(result, |
- " (ID: %d, State: %d, ScreenPos: (%f, %f), Pos: (%f, %f)," |
- " Radius: (%f, %f), Rot: %f, Force: %f," |
- " Tilt: (%d, %d)),\n", |
- point.id, |
- point.state, |
- point.screenPosition.x, |
- point.screenPosition.y, |
- point.position.x, |
- point.position.y, |
- point.radiusX, |
- point.radiusY, |
- point.rotationAngle, |
- point.force, |
- point.tiltX, |
- point.tiltY); |
-} |
- |
-void ApppendEventDetails(const WebTouchEvent& event, std::string* result) { |
- StringAppendF(result, |
- "{\n Touches: %u, Cancelable: %d, CausesScrolling: %d," |
- " uniqueTouchEventId: %u\n[\n", |
- event.touchesLength, event.cancelable, |
- event.causesScrollingIfUncanceled, event.uniqueTouchEventId); |
- for (unsigned i = 0; i < event.touchesLength; ++i) |
- ApppendTouchPointDetails(event.touches[i], result); |
- result->append(" ]\n}"); |
-} |
- |
-bool CanCoalesce(const WebKeyboardEvent& event_to_coalesce, |
- const WebKeyboardEvent& event) { |
- return false; |
-} |
- |
-void Coalesce(const WebKeyboardEvent& event_to_coalesce, |
- WebKeyboardEvent* event) { |
- DCHECK(CanCoalesce(event_to_coalesce, *event)); |
-} |
- |
-bool CanCoalesce(const WebMouseEvent& event_to_coalesce, |
- const WebMouseEvent& event) { |
- return event.type == event_to_coalesce.type && |
- event.type == WebInputEvent::MouseMove; |
-} |
- |
-void Coalesce(const WebMouseEvent& event_to_coalesce, WebMouseEvent* event) { |
- DCHECK(CanCoalesce(event_to_coalesce, *event)); |
- // Accumulate movement deltas. |
- int x = event->movementX; |
- int y = event->movementY; |
- *event = event_to_coalesce; |
- event->movementX += x; |
- event->movementY += y; |
-} |
- |
-bool CanCoalesce(const WebMouseWheelEvent& event_to_coalesce, |
- const WebMouseWheelEvent& event) { |
- return event.modifiers == event_to_coalesce.modifiers && |
- event.scrollByPage == event_to_coalesce.scrollByPage && |
- event.phase == event_to_coalesce.phase && |
- event.momentumPhase == event_to_coalesce.momentumPhase && |
- event.hasPreciseScrollingDeltas == |
- event_to_coalesce.hasPreciseScrollingDeltas && |
- event.canScroll == event_to_coalesce.canScroll; |
-} |
- |
-float GetUnacceleratedDelta(float accelerated_delta, float acceleration_ratio) { |
- return accelerated_delta * acceleration_ratio; |
-} |
- |
-float GetAccelerationRatio(float accelerated_delta, float unaccelerated_delta) { |
- if (unaccelerated_delta == 0.f || accelerated_delta == 0.f) |
- return 1.f; |
- return unaccelerated_delta / accelerated_delta; |
-} |
- |
-void Coalesce(const WebMouseWheelEvent& event_to_coalesce, |
- WebMouseWheelEvent* event) { |
- DCHECK(CanCoalesce(event_to_coalesce, *event)); |
- float unaccelerated_x = |
- GetUnacceleratedDelta(event->deltaX, |
- event->accelerationRatioX) + |
- GetUnacceleratedDelta(event_to_coalesce.deltaX, |
- event_to_coalesce.accelerationRatioX); |
- float unaccelerated_y = |
- GetUnacceleratedDelta(event->deltaY, |
- event->accelerationRatioY) + |
- GetUnacceleratedDelta(event_to_coalesce.deltaY, |
- event_to_coalesce.accelerationRatioY); |
- event->deltaX += event_to_coalesce.deltaX; |
- event->deltaY += event_to_coalesce.deltaY; |
- event->wheelTicksX += event_to_coalesce.wheelTicksX; |
- event->wheelTicksY += event_to_coalesce.wheelTicksY; |
- event->accelerationRatioX = |
- GetAccelerationRatio(event->deltaX, unaccelerated_x); |
- event->accelerationRatioY = |
- GetAccelerationRatio(event->deltaY, unaccelerated_y); |
-} |
- |
-// Returns |kInvalidTouchIndex| iff |event| lacks a touch with an ID of |id|. |
-int GetIndexOfTouchID(const WebTouchEvent& event, int id) { |
- for (unsigned i = 0; i < event.touchesLength; ++i) { |
- if (event.touches[i].id == id) |
- return i; |
- } |
- return kInvalidTouchIndex; |
-} |
- |
-bool CanCoalesce(const WebTouchEvent& event_to_coalesce, |
- const WebTouchEvent& event) { |
- if (event.type != event_to_coalesce.type || |
- event.type != WebInputEvent::TouchMove || |
- event.modifiers != event_to_coalesce.modifiers || |
- event.touchesLength != event_to_coalesce.touchesLength || |
- event.touchesLength > WebTouchEvent::touchesLengthCap) |
- return false; |
- |
- static_assert(WebTouchEvent::touchesLengthCap <= sizeof(int32_t) * 8U, |
- "suboptimal touchesLengthCap size"); |
- // Ensure that we have a 1-to-1 mapping of pointer ids between touches. |
- std::bitset<WebTouchEvent::touchesLengthCap> unmatched_event_touches( |
- (1 << event.touchesLength) - 1); |
- for (unsigned i = 0; i < event_to_coalesce.touchesLength; ++i) { |
- int event_touch_index = |
- GetIndexOfTouchID(event, event_to_coalesce.touches[i].id); |
- if (event_touch_index == kInvalidTouchIndex) |
- return false; |
- if (!unmatched_event_touches[event_touch_index]) |
- return false; |
- unmatched_event_touches[event_touch_index] = false; |
- } |
- return unmatched_event_touches.none(); |
-} |
- |
-void Coalesce(const WebTouchEvent& event_to_coalesce, WebTouchEvent* event) { |
- DCHECK(CanCoalesce(event_to_coalesce, *event)); |
- // The WebTouchPoints include absolute position information. So it is |
- // sufficient to simply replace the previous event with the new event-> |
- // However, it is necessary to make sure that all the points have the |
- // correct state, i.e. the touch-points that moved in the last event, but |
- // didn't change in the current event, will have Stationary state. It is |
- // necessary to change them back to Moved state. |
- WebTouchEvent old_event = *event; |
- *event = event_to_coalesce; |
- for (unsigned i = 0; i < event->touchesLength; ++i) { |
- int i_old = GetIndexOfTouchID(old_event, event->touches[i].id); |
- if (old_event.touches[i_old].state == blink::WebTouchPoint::StateMoved) |
- event->touches[i].state = blink::WebTouchPoint::StateMoved; |
- } |
- event->causesScrollingIfUncanceled |= old_event.causesScrollingIfUncanceled; |
-} |
- |
-bool CanCoalesce(const WebGestureEvent& event_to_coalesce, |
- const WebGestureEvent& event) { |
- if (event.type != event_to_coalesce.type || |
- event.sourceDevice != event_to_coalesce.sourceDevice || |
- event.modifiers != event_to_coalesce.modifiers) |
- return false; |
- |
- if (event.type == WebInputEvent::GestureScrollUpdate) |
- return true; |
- |
- // GesturePinchUpdate scales can be combined only if they share a focal point, |
- // e.g., with double-tap drag zoom. |
- if (event.type == WebInputEvent::GesturePinchUpdate && |
- event.x == event_to_coalesce.x && |
- event.y == event_to_coalesce.y) |
- return true; |
- |
- return false; |
-} |
- |
-void Coalesce(const WebGestureEvent& event_to_coalesce, |
- WebGestureEvent* event) { |
- DCHECK(CanCoalesce(event_to_coalesce, *event)); |
- if (event->type == WebInputEvent::GestureScrollUpdate) { |
- event->data.scrollUpdate.deltaX += |
- event_to_coalesce.data.scrollUpdate.deltaX; |
- event->data.scrollUpdate.deltaY += |
- event_to_coalesce.data.scrollUpdate.deltaY; |
- DCHECK_EQ( |
- event->data.scrollUpdate.previousUpdateInSequencePrevented, |
- event_to_coalesce.data.scrollUpdate.previousUpdateInSequencePrevented); |
- } else if (event->type == WebInputEvent::GesturePinchUpdate) { |
- event->data.pinchUpdate.scale *= event_to_coalesce.data.pinchUpdate.scale; |
- // Ensure the scale remains bounded above 0 and below Infinity so that |
- // we can reliably perform operations like log on the values. |
- if (event->data.pinchUpdate.scale < numeric_limits<float>::min()) |
- event->data.pinchUpdate.scale = numeric_limits<float>::min(); |
- else if (event->data.pinchUpdate.scale > numeric_limits<float>::max()) |
- event->data.pinchUpdate.scale = numeric_limits<float>::max(); |
- } |
-} |
- |
-struct WebInputEventToString { |
- template <class EventType> |
- bool Execute(const WebInputEvent& event, std::string* result) const { |
- SStringPrintf(result, "%s (Time: %lf, Modifiers: %d)\n", |
- WebInputEventTraits::GetName(event.type), |
- event.timeStampSeconds, |
- event.modifiers); |
- const EventType& typed_event = static_cast<const EventType&>(event); |
- ApppendEventDetails(typed_event, result); |
- return true; |
- } |
-}; |
- |
-struct WebInputEventSize { |
- template <class EventType> |
- bool Execute(WebInputEvent::Type /* type */, size_t* type_size) const { |
- *type_size = sizeof(EventType); |
- return true; |
- } |
-}; |
- |
-struct WebInputEventClone { |
- template <class EventType> |
- bool Execute(const WebInputEvent& event, |
- ScopedWebInputEvent* scoped_event) const { |
- DCHECK_EQ(sizeof(EventType), event.size); |
- *scoped_event = ScopedWebInputEvent( |
- new EventType(static_cast<const EventType&>(event))); |
- return true; |
- } |
-}; |
- |
-struct WebInputEventDelete { |
- template <class EventType> |
- bool Execute(WebInputEvent* event, bool* /* dummy_var */) const { |
- if (!event) |
- return false; |
- DCHECK_EQ(sizeof(EventType), event->size); |
- delete static_cast<EventType*>(event); |
- return true; |
- } |
-}; |
- |
-struct WebInputEventCanCoalesce { |
- template <class EventType> |
- bool Execute(const WebInputEvent& event_to_coalesce, |
- const WebInputEvent* event) const { |
- if (event_to_coalesce.type != event->type) |
- return false; |
- DCHECK_EQ(sizeof(EventType), event->size); |
- DCHECK_EQ(sizeof(EventType), event_to_coalesce.size); |
- return CanCoalesce(static_cast<const EventType&>(event_to_coalesce), |
- *static_cast<const EventType*>(event)); |
- } |
-}; |
- |
-struct WebInputEventCoalesce { |
- template <class EventType> |
- bool Execute(const WebInputEvent& event_to_coalesce, |
- WebInputEvent* event) const { |
- // New events get coalesced into older events, and the newer timestamp |
- // should always be preserved. |
- const double time_stamp_seconds = event_to_coalesce.timeStampSeconds; |
- Coalesce(static_cast<const EventType&>(event_to_coalesce), |
- static_cast<EventType*>(event)); |
- event->timeStampSeconds = time_stamp_seconds; |
- return true; |
- } |
-}; |
- |
-template <typename Operator, typename ArgIn, typename ArgOut> |
-bool Apply(Operator op, |
- WebInputEvent::Type type, |
- const ArgIn& arg_in, |
- ArgOut* arg_out) { |
- if (WebInputEvent::isMouseEventType(type)) |
- return op.template Execute<WebMouseEvent>(arg_in, arg_out); |
- else if (type == WebInputEvent::MouseWheel) |
- return op.template Execute<WebMouseWheelEvent>(arg_in, arg_out); |
- else if (WebInputEvent::isKeyboardEventType(type)) |
- return op.template Execute<WebKeyboardEvent>(arg_in, arg_out); |
- else if (WebInputEvent::isTouchEventType(type)) |
- return op.template Execute<WebTouchEvent>(arg_in, arg_out); |
- else if (WebInputEvent::isGestureEventType(type)) |
- return op.template Execute<WebGestureEvent>(arg_in, arg_out); |
- |
- NOTREACHED() << "Unknown webkit event type " << type; |
- return false; |
-} |
- |
-} // namespace |
- |
-const char* WebInputEventTraits::GetName(WebInputEvent::Type type) { |
-#define CASE_TYPE(t) case WebInputEvent::t: return #t |
- switch(type) { |
- CASE_TYPE(Undefined); |
- CASE_TYPE(MouseDown); |
- CASE_TYPE(MouseUp); |
- CASE_TYPE(MouseMove); |
- CASE_TYPE(MouseEnter); |
- CASE_TYPE(MouseLeave); |
- CASE_TYPE(ContextMenu); |
- CASE_TYPE(MouseWheel); |
- CASE_TYPE(RawKeyDown); |
- CASE_TYPE(KeyDown); |
- CASE_TYPE(KeyUp); |
- CASE_TYPE(Char); |
- CASE_TYPE(GestureScrollBegin); |
- CASE_TYPE(GestureScrollEnd); |
- CASE_TYPE(GestureScrollUpdate); |
- CASE_TYPE(GestureFlingStart); |
- CASE_TYPE(GestureFlingCancel); |
- CASE_TYPE(GestureShowPress); |
- CASE_TYPE(GestureTap); |
- CASE_TYPE(GestureTapUnconfirmed); |
- CASE_TYPE(GestureTapDown); |
- CASE_TYPE(GestureTapCancel); |
- CASE_TYPE(GestureDoubleTap); |
- CASE_TYPE(GestureTwoFingerTap); |
- CASE_TYPE(GestureLongPress); |
- CASE_TYPE(GestureLongTap); |
- CASE_TYPE(GesturePinchBegin); |
- CASE_TYPE(GesturePinchEnd); |
- CASE_TYPE(GesturePinchUpdate); |
- CASE_TYPE(TouchStart); |
- CASE_TYPE(TouchMove); |
- CASE_TYPE(TouchEnd); |
- CASE_TYPE(TouchCancel); |
- default: |
- // Must include default to let blink::WebInputEvent add new event types |
- // before they're added here. |
- DLOG(WARNING) << |
- "Unhandled WebInputEvent type in WebInputEventTraits::GetName.\n"; |
- break; |
- } |
-#undef CASE_TYPE |
- return ""; |
-} |
- |
-std::string WebInputEventTraits::ToString(const WebInputEvent& event) { |
- std::string result; |
- Apply(WebInputEventToString(), event.type, event, &result); |
- return result; |
-} |
- |
-size_t WebInputEventTraits::GetSize(WebInputEvent::Type type) { |
- size_t size = 0; |
- Apply(WebInputEventSize(), type, type, &size); |
- return size; |
-} |
- |
-ScopedWebInputEvent WebInputEventTraits::Clone(const WebInputEvent& event) { |
- ScopedWebInputEvent scoped_event; |
- Apply(WebInputEventClone(), event.type, event, &scoped_event); |
- return scoped_event; |
-} |
- |
-void WebInputEventTraits::Delete(WebInputEvent* event) { |
- if (!event) |
- return; |
- bool dummy_var = false; |
- Apply(WebInputEventDelete(), event->type, event, &dummy_var); |
-} |
- |
-bool WebInputEventTraits::CanCoalesce(const WebInputEvent& event_to_coalesce, |
- const WebInputEvent& event) { |
- // Early out before casting. |
- if (event_to_coalesce.type != event.type) |
- return false; |
- return Apply(WebInputEventCanCoalesce(), |
- event.type, |
- event_to_coalesce, |
- &event); |
-} |
- |
-void WebInputEventTraits::Coalesce(const WebInputEvent& event_to_coalesce, |
- WebInputEvent* event) { |
- DCHECK(event); |
- Apply(WebInputEventCoalesce(), event->type, event_to_coalesce, event); |
-} |
- |
-bool WebInputEventTraits::WillReceiveAckFromRenderer( |
- const WebInputEvent& event) { |
- switch (event.type) { |
- case WebInputEvent::MouseDown: |
- case WebInputEvent::MouseUp: |
- case WebInputEvent::MouseEnter: |
- case WebInputEvent::MouseLeave: |
- case WebInputEvent::ContextMenu: |
- case WebInputEvent::GestureScrollBegin: |
- case WebInputEvent::GestureScrollEnd: |
- case WebInputEvent::GestureShowPress: |
- case WebInputEvent::GestureTapUnconfirmed: |
- case WebInputEvent::GestureTapDown: |
- case WebInputEvent::GestureTapCancel: |
- case WebInputEvent::GesturePinchBegin: |
- case WebInputEvent::GesturePinchEnd: |
- case WebInputEvent::TouchCancel: |
- return false; |
- case WebInputEvent::TouchStart: |
- case WebInputEvent::TouchEnd: |
- return static_cast<const WebTouchEvent&>(event).cancelable; |
- default: |
- return true; |
- } |
-} |
- |
-uint32_t WebInputEventTraits::GetUniqueTouchEventId( |
- const WebInputEvent& event) { |
- if (WebInputEvent::isTouchEventType(event.type)) { |
- return static_cast<const WebTouchEvent&>(event).uniqueTouchEventId; |
- } |
- return 0U; |
-} |
- |
-} // namespace content |