summaryrefslogtreecommitdiffstats
path: root/WebCore/page
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-02-11 14:26:19 +0000
committerBen Murdoch <benm@google.com>2010-02-15 17:08:21 +0000
commit37ee8a08023fb2e5af82a4164797459e256c18e1 (patch)
treed4e51a02cc753f3c03fd126e5e3e86190572385c /WebCore/page
parent885493cb204540cc0d918892ef5d4ba2b8285766 (diff)
downloadexternal_webkit-37ee8a08023fb2e5af82a4164797459e256c18e1.zip
external_webkit-37ee8a08023fb2e5af82a4164797459e256c18e1.tar.gz
external_webkit-37ee8a08023fb2e5af82a4164797459e256c18e1.tar.bz2
Fix the creation of the touchTargets list to match what the iPhone does and maintain compatability with existing apps like SuperPudu.
touchTargets should always have at least one element and should be based on the target where the touch originated, not where it is now. This needs to be upstreamed to webkit. Change-Id: Ie4e6f65e77484e0eac6d0f239df9dd3a460e7bce
Diffstat (limited to 'WebCore/page')
-rw-r--r--WebCore/page/EventHandler.cpp65
1 files changed, 47 insertions, 18 deletions
diff --git a/WebCore/page/EventHandler.cpp b/WebCore/page/EventHandler.cpp
index 2563149..ad29dc1 100644
--- a/WebCore/page/EventHandler.cpp
+++ b/WebCore/page/EventHandler.cpp
@@ -2567,6 +2567,7 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
RefPtr<TouchList> movedTouches = TouchList::create();
RefPtr<TouchList> targetTouches = TouchList::create();
RefPtr<TouchList> cancelTouches = TouchList::create();
+ RefPtr<TouchList> stationaryTouches = TouchList::create();
const Vector<PlatformTouchPoint>& points = event.touchPoints();
AtomicString* eventName = 0;
@@ -2609,6 +2610,17 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
point.screenPos().x(), point.screenPos().y(),
adjustedPageX, adjustedPageY);
+ // touches should contain information about every touch currently on the screen.
+ if (point.state() != PlatformTouchPoint::TouchReleased)
+ touches->append(touch);
+
+ // If it's a stationary touch, we don't want to process it further at the moment.
+ // We may add it to targetTouches later.
+ if (point.state() == PlatformTouchPoint::TouchStationary) {
+ stationaryTouches->append(touch);
+ continue;
+ }
+
if ((event.type() == TouchStart
#if PLATFORM(ANDROID)
|| event.type() == TouchDoubleTap
@@ -2620,21 +2632,45 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
m_firstTouchPagePos = pagePoint;
}
- if (point.state() == PlatformTouchPoint::TouchReleased)
- releasedTouches->append(touch);
- else if (point.state() == PlatformTouchPoint::TouchCancelled)
- cancelTouches->append(touch);
- else {
- if (point.state() == PlatformTouchPoint::TouchPressed)
- pressedTouches->append(touch);
+ // Check to see if this should be added to targetTouches.
+ // If we've got here then the touch is not stationary. If it's a release, it's no longer
+ // a touch on the screen so we don't want it in targetTouches. The first touch that gets
+ // to here defines the 'target' the touchTarget list uses. This seems arbitrary (much like
+ // checking !i to set m_touchEventTarget above?) but seems to yield compatible behaviour.
+ //
+ // FIXME: Is this really the correct semantics for the touchTargets list? The touch event
+ // spec is not clear to me.
+ if (point.state() != PlatformTouchPoint::TouchReleased) {
+ if (targetTouches->length() == 0)
+ targetTouches->append(touch);
else {
- touches->append(touch);
- if (m_touchEventTarget == target)
+ if (touch->target() == targetTouches->item(0)->target())
targetTouches->append(touch);
- if (point.state() == PlatformTouchPoint::TouchMoved)
- movedTouches->append(touch);
}
}
+
+ // Now build up the correct list for changedTouches.
+ if (point.state() == PlatformTouchPoint::TouchReleased)
+ releasedTouches->append(touch);
+ else if (point.state() == PlatformTouchPoint::TouchCancelled)
+ cancelTouches->append(touch);
+ else if (point.state() == PlatformTouchPoint::TouchPressed)
+ pressedTouches->append(touch);
+ else if (point.state() == PlatformTouchPoint::TouchMoved)
+ movedTouches->append(touch);
+ }
+
+ // Add any stationary touches to targetTouches if they match the target.
+ EventTarget* targetTouchesTarget = 0;
+ if (targetTouches->length())
+ targetTouchesTarget = targetTouches->item(0)->target();
+ else
+ targetTouchesTarget = m_touchEventTarget.get();
+
+ for (int i = 0; i < stationaryTouches->length(); ++i) {
+ Touch* stationaryTouch = stationaryTouches->item(i);
+ if (stationaryTouch->target() == targetTouchesTarget)
+ targetTouches->append(stationaryTouch);
}
if (!m_touchEventTarget)
@@ -2691,13 +2727,6 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
#endif
}
if (pressedTouches->length() > 0) {
- // Add pressed touchpoints to touches and targetTouches
- for (int i = 0; i < pressedTouches->length(); ++i) {
- touches->append(pressedTouches->item(i));
- if (m_touchEventTarget == pressedTouches->item(i)->target())
- targetTouches->append(pressedTouches->item(i));
- }
-
#if PLATFORM(ANDROID)
if (event.type() == TouchLongPress) {
eventName = &eventNames().touchlongpressEvent;