Index: Source/web/WebInputEventConversion.cpp |
diff --git a/Source/web/WebInputEventConversion.cpp b/Source/web/WebInputEventConversion.cpp |
index 204429c7f6e95f54467d3efcde20d7732bcd39f3..657afcc80ed005cda00b6fb699593a157246b06e 100644 |
--- a/Source/web/WebInputEventConversion.cpp |
+++ b/Source/web/WebInputEventConversion.cpp |
@@ -741,25 +741,51 @@ WebKeyboardEventBuilder::WebKeyboardEventBuilder(const PlatformKeyboardEvent& ev |
memcpy(keyIdentifier, event.keyIdentifier().ascii().data(), std::min(static_cast<unsigned>(keyIdentifierLengthCap), event.keyIdentifier().length())); |
} |
-static void addTouchPoints(const Widget* widget, const AtomicString& touchType, TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, const RenderObject* renderObject) |
+static WebTouchPoint toWebTouchPoint(const Touch* touch, const RenderObject* renderObject) |
+{ |
+ WebTouchPoint point; |
+ point.id = touch->identifier(); |
+ point.screenPosition = touch->screenLocation(); |
+ point.position = convertAbsoluteLocationForRenderObjectFloat(touch->absoluteLocation(), *renderObject); |
+ point.radiusX = touch->radiusX(); |
+ point.radiusY = touch->radiusY(); |
+ point.rotationAngle = touch->webkitRotationAngle(); |
+ point.force = touch->force(); |
+ point.state = WebTouchPoint::StateStationary; |
+ return point; |
+} |
+ |
+static void addActiveTouchPoints(const Widget* widget, TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, const RenderObject* renderObject) |
{ |
unsigned numberOfTouches = std::min(touches->length(), static_cast<unsigned>(WebTouchEvent::touchesLengthCap)); |
- for (unsigned i = 0; i < numberOfTouches; ++i) { |
+ for (unsigned i = 0; i < numberOfTouches; ++i) |
+ touchPoints[i] = toWebTouchPoint(touches->item(i), renderObject); |
+ *touchPointsLength = numberOfTouches; |
+} |
+ |
+static void addOrUpdateChangedTouchPoints(const Widget* widget, const AtomicString& touchType, TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, const RenderObject* renderObject) |
+{ |
+ unsigned initialTouchPointsLength = *touchPointsLength; |
+ for (unsigned i = 0; i < touches->length(); ++i) { |
const Touch* touch = touches->item(i); |
- WebTouchPoint point; |
- point.id = touch->identifier(); |
- point.screenPosition = touch->screenLocation(); |
- point.position = convertAbsoluteLocationForRenderObjectFloat(touch->absoluteLocation(), *renderObject); |
- point.radiusX = touch->radiusX(); |
- point.radiusY = touch->radiusY(); |
- point.rotationAngle = touch->webkitRotationAngle(); |
- point.force = touch->force(); |
- point.state = toWebTouchPointState(touchType); |
- |
- touchPoints[i] = point; |
+ unsigned pointIndex = *touchPointsLength; |
+ for (unsigned j = 0; j < initialTouchPointsLength; ++j) { |
+ if (touchPoints[j].id == static_cast<int>(touch->identifier())) { |
+ pointIndex = j; |
aelias_OOO_until_Jul13
2014/09/10 01:14:05
Would it have correct semantics to first add the c
jdduke (slow)
2014/09/10 01:53:36
Yeah, that also works, will update in the morning.
|
+ break; |
+ } |
+ } |
+ |
+ if (pointIndex >= static_cast<unsigned>(WebTouchEvent::touchesLengthCap)) |
+ continue; |
+ |
+ if (pointIndex == *touchPointsLength) { |
+ ++(*touchPointsLength); |
+ touchPoints[pointIndex] = toWebTouchPoint(touch, renderObject); |
+ } |
+ touchPoints[pointIndex].state = toWebTouchPointState(touchType); |
} |
- *touchPointsLength = numberOfTouches; |
} |
WebTouchEventBuilder::WebTouchEventBuilder(const Widget* widget, const RenderObject* renderObject, const TouchEvent& event) |
@@ -782,9 +808,8 @@ WebTouchEventBuilder::WebTouchEventBuilder(const Widget* widget, const RenderObj |
timeStampSeconds = event.timeStamp() / millisPerSecond; |
cancelable = event.cancelable(); |
- addTouchPoints(widget, event.type(), event.touches(), touches, &touchesLength, renderObject); |
- addTouchPoints(widget, event.type(), event.changedTouches(), changedTouches, &changedTouchesLength, renderObject); |
- addTouchPoints(widget, event.type(), event.targetTouches(), targetTouches, &targetTouchesLength, renderObject); |
+ addActiveTouchPoints(widget, event.touches(), touches, &touchesLength, renderObject); |
+ addOrUpdateChangedTouchPoints(widget, event.type(), event.changedTouches(), touches, &touchesLength, renderObject); |
} |
WebGestureEventBuilder::WebGestureEventBuilder(const Widget* widget, const RenderObject* renderObject, const GestureEvent& event) |