2905 Touch* changedTouch = 0;
2906 EventTarget* touchEventTarget = 0;
2907
2908 if (cancelTouches->length() > 0) {
2909 // We dispatch the event to the target of the touch that caused this touch event to be generated, i.e.
2910 // we take it from the list that will be used as the changedTouches property of the event.
2911 // The choice to use the touch at index 0 guarantees that there is a target (as we checked the length
2912 // above). In the case that there are multiple touches in what becomes the changedTouches list, it is
2913 // difficult to say how we should prioritise touches and as such, item 0 is an arbitrary choice.
2914 changedTouch = cancelTouches->item(0);
2915 ASSERT(changedTouch);
2916 touchEventTarget = changedTouch->target();
2917 ASSERT(touchEventTarget);
2918
2919 eventName = &eventNames().touchcancelEvent;
2920 RefPtr<TouchEvent> cancelEv =
2921 TouchEvent::create(TouchList::create().get(), TouchList::create().get(), cancelTouches.get(),
2922 *eventName, touchEventTarget->toNode()->document()->defaultView(),
2923 0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(),
2924 event.metaKey());
2925 ExceptionCode ec = 0;
2926 touchEventTarget->dispatchEvent(cancelEv.get(), ec);
2927 defaultPrevented |= cancelEv->defaultPrevented();
2928 }
2929
2930 if (releasedTouches->length() > 0) {
2931 Touch* changedTouch = releasedTouches->item(0);
2932 ASSERT(changedTouch);
2933 touchEventTarget = changedTouch->target();
2934 ASSERT(touchEventTarget);
2935
2936 RefPtr<TouchList> targetTouches = assembleTargetTouches(changedTouch, touches.get());
2937
2938 eventName = &eventNames().touchendEvent;
2939 RefPtr<TouchEvent> endEv =
2940 TouchEvent::create(touches.get(), targetTouches.get(), releasedTouches.get(),
2941 *eventName, touchEventTarget->toNode()->document()->defaultView(),
2942 0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(),
2943 event.metaKey());
2944 ExceptionCode ec = 0;
2945 touchEventTarget->dispatchEvent(endEv.get(), ec);
2946 defaultPrevented |= endEv->defaultPrevented();
2947 }
2948 if (pressedTouches->length() > 0) {
2949 Touch* changedTouch = pressedTouches->item(0);
2950 ASSERT(changedTouch);
2951 touchEventTarget = changedTouch->target();
2952 ASSERT(touchEventTarget);
2953
2954 RefPtr<TouchList> targetTouches = assembleTargetTouches(changedTouch, touches.get());
2955
2956 eventName = &eventNames().touchstartEvent;
2957 RefPtr<TouchEvent> startEv =
2958 TouchEvent::create(touches.get(), targetTouches.get(), pressedTouches.get(),
2959 *eventName, touchEventTarget->toNode()->document()->defaultView(),
2960 0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(),
2961 event.metaKey());
2962 ExceptionCode ec = 0;
2963 touchEventTarget->dispatchEvent(startEv.get(), ec);
2964 defaultPrevented |= startEv->defaultPrevented();
2965 }
2966
2967 if (movedTouches->length() > 0) {
2968 Touch* changedTouch = movedTouches->item(0);
2969 ASSERT(changedTouch);
2970 touchEventTarget = changedTouch->target();
2971 ASSERT(touchEventTarget);
2972
2973 RefPtr<TouchList> targetTouches = assembleTargetTouches(changedTouch, touches.get());
2974
2975 eventName = &eventNames().touchmoveEvent;
2976 RefPtr<TouchEvent> moveEv =
2977 TouchEvent::create(touches.get(), targetTouches.get(), movedTouches.get(),
2978 *eventName, touchEventTarget->toNode()->document()->defaultView(),
2979 0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(),
2980 event.metaKey());
2981 ExceptionCode ec = 0;
2982 touchEventTarget->dispatchEvent(moveEv.get(), ec);
2983 defaultPrevented |= moveEv->defaultPrevented();
2931 RefPtr<TouchList> emptyList = TouchList::create();
2932 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state) {
2933 if (!changedTouches[state].m_touches)
2934 continue;
2935
2936 // When sending a touch cancel event, use empty touches and targetTouches lists.
2937 RefPtr<TouchList>& effectiveTouches(state == PlatformTouchPoint::TouchCancelled ? emptyList : touches);
2938 const AtomicString& stateName(eventNameForTouchPointState(static_cast<PlatformTouchPoint::State>(state)));
2939 const EventTargetSet& targetsForState = changedTouches[state].m_targets;
2940
2941 for (EventTargetSet::const_iterator it = targetsForState.begin(); it != targetsForState.end(); ++it) {
2942 EventTarget* touchEventTarget = it->get();
2943 RefPtr<TouchList> targetTouches(state == PlatformTouchPoint::TouchCancelled ? emptyList : touchesByTarget.get(touchEventTarget));
2944 ASSERT(targetTouches);
2945
2946 RefPtr<TouchEvent> touchEvent =
2947 TouchEvent::create(effectiveTouches.get(), targetTouches.get(), changedTouches[state].m_touches.get(),
2948 stateName, touchEventTarget->toNode()->document()->defaultView(),
2949 0, 0, 0, 0, event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey());
2950 ExceptionCode ec = 0;
2951 touchEventTarget->dispatchEvent(touchEvent.get(), ec);
2952 defaultPrevented |= touchEvent->defaultPrevented();
2953 }