Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Unified Diff: content/common/input/web_input_event_traits.cc

Issue 1560553002: Framelet Prototype 2016 Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased + Applied Brett's Windows + Fixed security issue Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « content/common/input/web_input_event_traits.h ('k') | content/common/input/web_input_event_traits_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698